Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java setPreferredSize在事件发生后更改,但GridBagLayout未更新_Java_Swing_Resize_Layout Manager_Gridbaglayout - Fatal编程技术网

Java setPreferredSize在事件发生后更改,但GridBagLayout未更新

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

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

公共类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(…)方法