0

我有这段代码,Canvas我创建的扩展JPanel它的类在哪里保存图像。但是当我使用它时,它不会将画布放在 顶部JScrollPane,而是放在它后面。为什么这样做?

以下是 ScrollPanel 的创建方式:

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

这是我的面板在 ScrollPanel 中的位置

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

画布类对面板的放置没有任何作用,它所做的只是构建和修改它。我确实有一个JPanel那里并且它有效,但是一旦我用它切换它,JScrollPanel它就开始将画布放在它后面。

4

3 回答 3

1
于 2012-11-26T17:56:04.520 回答
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() 你可以在组件被 revalidated() 时计算你的首选大小。您还应该考虑继承 JComponent 而不是 JPanel,因为您不需要添加任何子级。JComponent 与 JPanel 相同。

于 2012-11-26T18:19:12.177 回答
0

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

而不是这个:
imagePane.add(canvas);

于 2012-11-26T18:08:38.403 回答