Java Swing 面板显示图像异常行为
Java Swing Panel displaying image strange behaviour
当我尝试在 JFrame 中的 JPanel 上渲染图像时,我不知道到底发生了什么。事实上,我只想在我的 JFrame.To 上的固定位置显示一个图像实现这一点我在我的 JFrame 上有一个固定大小(最小、最大、首选大小集)的 JPanel。按下按钮后,我将另一个面板添加到上述面板,具有相同的大小。 "child" 面板有一个重写的绘制方法来绘制图像。到目前为止一切顺利,一旦我按下按钮并添加该子面板,就什么也没有发生。如果我随后单击空白面板,图像将按原样绘制,不会溢出子面板的边界。但是,所有其他组件的宽度都会急剧增加,从而将它们拉伸到 JFrames 边界之外。有人会认为至少会出现一个滚动条,但不,组件将无法访问。我附上了两个屏幕截图,显示了非常合乎逻辑的行为。
代码如下:
void setPoster(BufferedImage poster) {
ImagePanel ip = new ImagePanel(poster);
ip.setSize(new Dimension(222, 327));
panelPoster.add(ip);
ip.setSize(new Dimension(222, 327));
}
ImagePanel 内部:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, this);
System.out.println("Paiting imagepanel with size " + getSize());
}
截图前:
截图后:
谁能告诉我这里可能发生的事情?
我通过在选项卡式窗格内的 JFrame 和 JPanel 上将布局设置为 null 来解决奇怪的大小调整问题。
setLayout(null);
jPanel4.setLayout(null);
无论如何,当使用 JLabel 而不是 JPanel 来保存图像时不需要这样做。
但是,我的 ImagePanel 不会再绘制图像了,所以我将其替换为 JLabel,它可以很好地绘制图像:
void setPoster(BufferedImage poster) {
JLabel imageLabel = new JLabel(new ImageIcon(poster));
panelPoster.add(imageLabel);
imageLabel.setSize(new Dimension(222, 327));
}
请注意,如果不设置 JLabel 的大小,它不会显示任何内容。
当我尝试在 JFrame 中的 JPanel 上渲染图像时,我不知道到底发生了什么。事实上,我只想在我的 JFrame.To 上的固定位置显示一个图像实现这一点我在我的 JFrame 上有一个固定大小(最小、最大、首选大小集)的 JPanel。按下按钮后,我将另一个面板添加到上述面板,具有相同的大小。 "child" 面板有一个重写的绘制方法来绘制图像。到目前为止一切顺利,一旦我按下按钮并添加该子面板,就什么也没有发生。如果我随后单击空白面板,图像将按原样绘制,不会溢出子面板的边界。但是,所有其他组件的宽度都会急剧增加,从而将它们拉伸到 JFrames 边界之外。有人会认为至少会出现一个滚动条,但不,组件将无法访问。我附上了两个屏幕截图,显示了非常合乎逻辑的行为。
代码如下:
void setPoster(BufferedImage poster) {
ImagePanel ip = new ImagePanel(poster);
ip.setSize(new Dimension(222, 327));
panelPoster.add(ip);
ip.setSize(new Dimension(222, 327));
}
ImagePanel 内部:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, this);
System.out.println("Paiting imagepanel with size " + getSize());
}
截图前:
截图后:
谁能告诉我这里可能发生的事情?
我通过在选项卡式窗格内的 JFrame 和 JPanel 上将布局设置为 null 来解决奇怪的大小调整问题。
setLayout(null);
jPanel4.setLayout(null);
无论如何,当使用 JLabel 而不是 JPanel 来保存图像时不需要这样做。
但是,我的 ImagePanel 不会再绘制图像了,所以我将其替换为 JLabel,它可以很好地绘制图像:
void setPoster(BufferedImage poster) {
JLabel imageLabel = new JLabel(new ImageIcon(poster));
panelPoster.add(imageLabel);
imageLabel.setSize(new Dimension(222, 327));
}
请注意,如果不设置 JLabel 的大小,它不会显示任何内容。