gpt4 book ai didi

java - setPreferredSize 事后更改,但 GridBagLayout 未更新

转载 作者:行者123 更新时间:2023-12-01 22:33:30 26 4
gpt4 key购买 nike

我有一个 JPanel (imagePanel),可以在其上显示图像。我在另一个 JPanel (scrollPanel) 中有 imagePanel,并使用 GridBagLayout 默认约束将其居中。 scrollPanel 是 JScrollPane 的视口(viewport)。我需要在事后更改 imagePanel 的大小并保持其居中。 (图片类是我自己做的)

public class ImageView extends View {
private static final long serialVersionUID = -1745026846891845769L;

private JScrollPane scrollPane;
private JPanel scrollPanel;
public JPanel imagePanel;

public int zoom = 1;

public Image image;

public ImageView(Image image) {
setLayout(new BorderLayout());
setDoubleBuffered(true);

this.image = image;

imagePanel = new JPanel() {
private static final long serialVersionUID = 2127374649591395224L;

@Override
public void paint(Graphics g) {
super.paint(g);
ImageView.this.image.paintImage(g, 0, 0, zoom);
}
};
imagePanel.setDoubleBuffered(true);

scrollPanel = new JPanel(new GridBagLayout());
scrollPanel.add(imagePanel);

scrollPane = new JScrollPane(scrollPanel);
add(scrollPane, BorderLayout.CENTER);
}

public void zoom(int zoom) {
if(zoom < 1)
this.zoom = 1;
else
this.zoom = zoom;

int imageWidth = image.WIDTH * this.zoom;
int imageHeight = image.HEIGHT * this.zoom;

imagePanel.setPreferredSize(new Dimension(imageWidth, imageHeight));
//What do I do here???
}

编辑:这是我为其他有相同问题的人更新的代码

public class ImageView extends View {
private static final long serialVersionUID = -1745026846891845769L;

public class ImagePanel extends JPanel {
private static final long serialVersionUID = 2127374649591395224L;

public int zoom = 1;

public void setZoom(int zoom) {
if(zoom < 1)
this.zoom = 1;
else
this.zoom = zoom;
}

@Override
public Dimension getPreferredSize() {
int imageWidth = ImageView.this.image.WIDTH * this.zoom;
int imageHeight = ImageView.this.image.HEIGHT * this.zoom;
return new Dimension(imageWidth, imageHeight);
}

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
ImageView.this.image.paintImage(g, 0, 0, zoom);
}

}

private JScrollPane scrollPane;
private JPanel scrollPanel;
public ImagePanel imagePanel;

public Image image;

public ImageView(Image image) {
setLayout(new BorderLayout());
setDoubleBuffered(true);

this.image = image;

imagePanel = new ImagePanel();
imagePanel.setDoubleBuffered(true);

scrollPanel = new JPanel(new GridBagLayout());
scrollPanel.add(imagePanel);

scrollPane = new JScrollPane(scrollPanel);
add(scrollPane, BorderLayout.CENTER);
}

public void zoom(int zoom) {
imagePanel.setZoom(zoom);
scrollPanel.revalidate();
scrollPanel.repaint();
}

最佳答案

不要调用 setPreferredSize()。

您应该重写类的 getPreferredSize() 方法来进行大小计算。所以基本上缩放逻辑应该在该方法中定义。

然后在您调用的 Zoom(..) 方法中:

revalidate();
repaint();

zoom() 方法应该是绘制图像的面板的一部分,因为缩放系数是该面板的一个属性。这将导致调用布局管理器,并且您的新首选尺寸将在组件的布局中使用。

此外,您应该重写 paintComponent(...) 方法,而不是 Paint(...) 方法来绘制图像。

关于java - setPreferredSize 事后更改,但 GridBagLayout 未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27219639/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com