我有这段代码,其中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
将其切换出来,它就开始将画布放在它后面。
答案 0 :(得分:1)
AWT Components
are heavyweight and Swing JComponents
are lightweight
AWT Componets
的{li> 始终位于Swing JComponents
答案 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);