【问题标题】:String (drawString) disappearing only when scrolling (JAVA)字符串(drawString)仅在滚动时消失(JAVA)
【发布时间】:2012-01-05 11:55:28
【问题描述】:

我有一个 JFrame,其中包含一个 JScrollPane,其中包含一个 JPanel(只有图形)和一个 JTabbedPanel。 在 JScrollPane 上,这里是绘制方法:

public void paint(Graphics g) {
    g2d = (Graphics2D) g;
    super.paint(g2d);
    if (geneLines.size() != 0 ) {
        g2d.drawString("5'",linePadding, topMargin+4); 
        for(int i=0; i<geneLines.size();i++) {
            drawDNALine(i);
            drawLineLabels(i);
            for(int j=0; j<geneLines.get(i).size();j++) {
                Gene gene = geneLines.get(i).get(j);
                drawGene(i, gene.getMid(), initColor(gene.getFunctionnality()), gene.getFunctionnality() >= 2 ? (float)0.5:(float)1, gene);
            }
        }
        g2d.drawString("3'", 510, (geneLines.size()-1)*linePadding+topMargin+4);
    }
    setPreferredSize(new Dimension(getWidth()-20,(geneLines.size()-1)*linePadding+topMargin-GlobalVars.squareY/2+topMargin));
    revalidate();
}

这里是drawGene方法:

private void drawGene(int l, int mid, Color c, float w, Gene g) {
    int posX = Math.round(((((float)mid/(float)length)-l)*400+100-GlobalVars.squareX/2));
    int posY = l*linePadding+topMargin-GlobalVars.squareY/2;
    g2d.setColor(c);
    g2d.fillRect(posX,posY,(int) (GlobalVars.squareX*w),GlobalVars.squareY);
    g2d.setColor(Color.black);
    g2d.drawRect(posX,posY,(int) (GlobalVars.squareX*w),GlobalVars.squareY);
    AffineTransform atBefore = g2d.getTransform(); 
    Rectangle2D r = g2d.getFontMetrics().getStringBounds(g.getName(), g2d);
    AffineTransform trans = AffineTransform.getTranslateInstance(posX+5, posY-40);
    trans.concatenate(AffineTransform.getRotateInstance(-Math.PI/2));
    trans.concatenate(AffineTransform.getTranslateInstance(-r.getCenterX(), -r.getCenterY()));
    g2d.setTransform(trans);
    g2d.drawString(g.getName(), 0, 0);
    g2d.setTransform(atBefore);
}

所以,这是我的目标和我的问题。我必须制作一张图片,显示线条上的基因分布。每个基因都是一个正方形(或矩形),我必须在正方形/矩形的垂直上方写下基因的名称。我还写了一些信息,例如行的长度等。 通过这种方式,当我调整框架大小时,一切都很好(重新粉刷好),如果我缩小框架也是如此。但是,如果行数太大,会出现滚动条(这就是我使用 JScrollPane 的原因)。当我移动这个滚动条时,所有垂直文本都会消失。我不明白为什么,因为文本绘制与矩形绘制的方法相同(并且它们在滚动时重新绘制得很好)。

我不知道这是从哪里来的……我尝试了一些手动重绘,但没有结果。

我在 Windows 上使用 Eclipse,如果您需要更多信息,我当然可以。非常感谢您的帮助。

【问题讨论】:

  • Swing 中在paint(...) 中进行自定义绘制是错误的,而是覆盖paintComponent(...) 它总是 错误在paintXX方法中改变组件的状态,而不是在外面的某个地方做,然后调用repaint()
  • 一开始我使用的是paintComponent(...)。但它没有用。然后我换了,但后来忘记换了。感谢您看到我的错误。

标签: java string swing graphics scroll


【解决方案1】:

您必须使用简单的 JScrollPane 和 JPanel 进行绘图和调整大小。如果您给 JPanel 一个边框和其他背景颜色,您将看到一切是否符合预期。


另一个答案

画图要快,不要调用setPreferredSizerevalidate。 目前你可以这样做:

if (...size changes) {
    SwingUtilities.invokeLater(new Runnable()) {
        @Overriden
        public void run() {
            ...setPreferredSize and revalidate
        }
    }
}

那么这个?

final double NINETY_DEGREES = Math.PI/2;
Rectangle2D r = g2d.getFontMetrics().getStringBounds(g.getName(), g2d);
g2d.translate(posX+5, posY-40);
g2d.rotate(-NINETY_DEGREES);
g2d.translate(-r.getCenterX(), -r.getCenterY());
g2d.drawString(g.getName(), 0, 0);
g2d.translate(r.getCenterX(), r.getCenterY());
g2d.rotate(NINETY_DEGREES);
g2d.translate(-(posX+5), -(posY-40));

没有区别,但也许绘画需要很长时间,然后这可能会有所帮助。


不得已

在垂直方向上制作一个带有 BoxLayout 的 JPanel。为每一行添加一个 JPanel,它只为该行进行绘图。 (或 JList)

【讨论】:

  • 哦,我不清楚,我的错。这就是我现在所拥有的:JFrame 包含一个 JScrollPane,其中包含一个 JPanel(绘制图形)。这是你建议的吗?谢谢
  • 抱歉想快点回答。给出一个新的答案。
  • 谢谢。我试过这个,但问题仍然存在。调整大小时,一切都很好,当我滚动滚动条时出现问题:文本(并且只有垂直文本)消失并且当我向后滚动时不会重新出现......再次感谢
  • 然后我把竖画代码改成不使用物体了。
  • 哇,好主意。我认为你对绘图花费了太多时间这一事实是正确的......但我不知道如何让它更快。你的想法很成功,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多