Java setPreferredSize在事件发生后更改,但GridBagLayout未更新
我有一个JPanel(imagePanel)在上面显示一个图像。我将imagePanel放在另一个JPanel(scrollPanel)中,并使用GridBagLayout默认约束将其居中。scrollPanel是JScrollPane的视口。我需要在事后更改imagePanel的大小,并保持它居中。(图像类是我自己制作的)Java setPreferredSize在事件发生后更改,但GridBagLayout未更新,java,swing,resize,layout-manager,gridbaglayout,Java,Swing,Resize,Layout Manager,Gridbaglayout,我有一个JPanel(imagePanel)在上面显示一个图像。我将imagePanel放在另一个JPanel(scrollPanel)中,并使用GridBagLayout默认约束将其居中。scrollPanel是JScrollPane的视口。我需要在事后更改imagePanel的大小,并保持它居中。(图像类是我自己制作的) 公共类ImageView扩展视图{ 私有静态最终长serialVersionUID=-174502684891845769L; 私有JScrollPane滚动窗格; 私人J
公共类ImageView扩展视图{
私有静态最终长serialVersionUID=-174502684891845769L;
私有JScrollPane滚动窗格;
私人JPanel滚动面板;
公共JPanel imagePanel;
公共整数缩放=1;
公众形象;
公共图像视图(图像){
setLayout(新的BorderLayout());
setDoubleBuffered(真);
这个图像=图像;
imagePanel=newjpanel(){
私有静态最终长serialVersionUID=2127374649591395224L;
@凌驾
公共空间涂料(图g){
超级油漆(g);
ImageView.this.image.paintImage(g,0,0,zoom);
}
};
imagePanel.setDoubleBuffered(真);
scrollPanel=newJPanel(newGridBagLayout());
scrollPanel.add(imagePanel);
scrollPane=新的JScrollPane(scrollPanel);
添加(滚动窗格,BorderLayout.CENTER);
}
公共空间缩放(整数缩放){
如果(缩放<1)
this.zoom=1;
其他的
this.zoom=zoom;
int imageWidth=image.WIDTH*this.zoom;
int imageHeight=image.HEIGHT*this.zoom;
imagePanel.setPreferredSize(新尺寸(imageWidth、imageHeight));
//我在这里做什么???
}
编辑:这是我为其他有同样问题的人更新的代码
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();
}
公共类ImageView扩展视图{
私有静态最终长serialVersionUID=-174502684891845769L;
公共类ImagePanel扩展了JPanel{
私有静态最终长serialVersionUID=2127374649591395224L;
公共整数缩放=1;
公共void setZoom(int zoom){
如果(缩放<1)
this.zoom=1;
其他的
this.zoom=zoom;
}
@凌驾
公共维度getPreferredSize(){
int imageWidth=ImageView.this.image.WIDTH*this.zoom;
int imageHeight=ImageView.this.image.HEIGHT*this.zoom;
返回新尺寸(imageWidth、imageHeight);
}
@凌驾
公共组件(图形g){
超级组件(g);
ImageView.this.image.paintImage(g,0,0,zoom);
}
}
私有JScrollPane滚动窗格;
私人JPanel滚动面板;
公众形象小组;
公众形象;
公共图像视图(图像图像){
setLayout(新的BorderLayout());
setDoubleBuffered(真);
这个图像=图像;
imagePanel=新的imagePanel();
imagePanel.setDoubleBuffered(真);
scrollPanel=newJPanel(newGridBagLayout());
scrollPanel.add(imagePanel);
scrollPane=新的JScrollPane(scrollPanel);
添加(滚动窗格,BorderLayout.CENTER);
}
公共空间缩放(整数缩放){
设置缩放(缩放);
scrollPanel.revalidate();
scrollPanel.repaint();
}
根据此链接:
根据以下链接,您可能需要在调用setPreferedSize后调用validate:
在调用setPreferedSize之后,您可能需要调用validate,但不要调用setPreferredSize() 您应该重写类的
getPreferredSize()
方法来进行大小计算。因此,基本上应该在该方法中定义缩放逻辑
然后在您调用的缩放(..)方法中:
revalidate();
repaint();
zoom()
方法应该是绘制图像的面板的一部分,因为缩放因子是此面板的一个属性。这将导致调用布局管理器,并在组件的布局中使用新的首选尺寸
此外,您应该覆盖绘制图像的
paintComponent(…)
方法,而不是paint(…)方法。不要调用setPreferredSize()
您应该重写类的getPreferredSize()
方法来进行大小计算。因此,基本上应该在该方法中定义缩放逻辑
然后在您调用的缩放(..)方法中:
revalidate();
repaint();
zoom()
方法应该是绘制图像的面板的一部分,因为缩放因子是此面板的一个属性。这将导致调用布局管理器,并在组件的布局中使用新的首选尺寸
此外,您应该覆盖绘制图像的paintComponent(…)
方法,而不是paint(…)方法