【发布时间】: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