字符串(drawString)仅在滚动时消失(JAVA)

时间:2012-01-05 11:55:28

标签: java string swing graphics scroll

我有一个包含JScrollPane的JFrame,其中包含JPanel(仅包含图形)和JTabbedPanel。 在JScrollPane上,这是paint方法:

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,当然,如果您需要更多信息,我可以使用它。非常感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您必须使用简单的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)