我有一个包含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,当然,如果您需要更多信息,我可以使用它。非常感谢您的帮助。
答案 0 :(得分:2)
您必须使用简单的JScrollPane和JPanel进行绘图和调整大小。如果您为JPanel提供边框和其他背景颜色,您将看到是否所有内容都符合要求。
其他答案
绘画应该很快,而不是致电setPreferredSize
和revalidate
。
目前你可以这样做:
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)