JPanel放置了Behind JScrollPane

时间:2012-11-26 17:24:59

标签: java swing jpanel mixing java-canvas

我有这段代码,其中Canvas是我制作的一个扩展JPanel的类,它包含一个图像。但是当我使用它时,它会将画布放在JScrollPane的顶部,但不在它后面。为什么这样做?

以下是创建ScrollPanel的方法:

imagePane.setBackground(new java.awt.Color(153, 153, 153));
imagePane.setBorder(null);
jSplitPane2.setRightComponent(imagePane);

以下是我的Panel在ScrollPanel中的位置

Canvas canvas = new Canvas();
canvas.setVisible(true);
canvas.setImage(file);
imagePane.setLayout(new GridBagLayout());
canvas.setSizeFromLoaded();
imagePane.add(canvas);
imagePane.repaint();

canvas类不会对Panel的放置做任何事情,它只是构建和修改它。我确实有一个JPanel并且它有效,但是一旦我用JScrollPanel将其切换出来,它就开始将画布放在它后面。

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

确保使用所有轻量级组件(JPanel,JScrollPane等)。我意识到你命名了自己的JPanel Canvas子类,但是在你的代码和描述中有点混乱,因为Canvas和ScrollPane是AWT类。

在你的评论中你说imagePane是一个ScrollPane(我假设你的意思是JScrollPane)。如果是这样,那么imagePane.setLayout是不合适的,应该被删除。您的代码应如下所示:

Canvas canvas = new Canvas();
canvas.setImage( someImageFile );
canvas.setSizeFromLoaded();

JScrollPane imagePane new JScrollPane( canvas );
imagePane.setBackground(new java.awt.Color(153, 153, 153));
imagePane.setBorder( null );

jSplitPane2.setRightComponent( imagePane );

如果setSetFromLoaded()能够根据图像的大小设置画布的PreferredSize,那将会有效。如果它尚未准备好计算它的大小,因为图像尚未加载(请记住这经常发生在另一个线程上),那么您可能需要将计算移动到validate()并在稍后进行。例如,为什么重写doLayout()可以在重新验证组件时计算首选大小()。您还应该考虑继承JComponent而不是JPanel,因为您不需要添加任何子项。同样的事情适用于JComponent和JPanel。

答案 2 :(得分:0)

我想出来解决这个问题就是使用这个:
imagePane.getViewport().add(canvas);

而不是:
imagePane.add(canvas);