Java - 在调整大小事件后更新组件的大小

时间:2017-07-07 15:27:18

标签: java swing user-interface components springlayout

我有这个简单的代码:

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SpringLayout;
import javax.swing.border.LineBorder;

@SuppressWarnings("serial")
public class MyFrame extends JFrame{

    SpringLayout layout;
    JPanel contentPane;
    JPanel pane1;

    public MyFrame(){

        layout=new SpringLayout();
        contentPane=new JPanel(layout);
        setContentPane(contentPane);
        setSize(new Dimension(800,600));

        pane1=new JPanel(new SpringLayout());
        pane1.setPreferredSize(new Dimension(200,200));
        pane1.setBorder(new LineBorder(Color.black));

        layout.putConstraint(SpringLayout.WEST, pane1, 0, SpringLayout.WEST, contentPane);
        layout.putConstraint(SpringLayout.EAST, pane1, getWidth()/2, SpringLayout.WEST, contentPane);
        contentPane.add(pane1);

        setEvents();
        setVisible(true);
    }

    private void setEvents(){

        addWindowListener(new WindowAdapter(){

            public void windowClosing(WindowEvent e){

                dispose();
                System.exit(0);
            }
        });

        this.addComponentListener(new ComponentListener(){

            @Override
            public void componentHidden(ComponentEvent arg0) {}

            @Override
            public void componentMoved(ComponentEvent arg0) {}

            @Override
            public void componentResized(ComponentEvent arg0) {

                System.out.println("RESIZING EVENT:");
                System.out.println("Frame Size: "+getWidth()+", "+getHeight());
                System.out.println("Pane1 Size: "+pane1.getWidth()+", "+pane1.getHeight()+"\n");


                layout.putConstraint(SpringLayout.EAST, pane1, getWidth()/2, SpringLayout.WEST, contentPane);
                contentPane.revalidate();
                contentPane.repaint();
            }

            @Override
            public void componentShown(ComponentEvent arg0) {}
        });
    }

    public static void main(String[] args){

        MyFrame frame=new MyFrame();
    }
}

我无法获得pane1组件的实际大小。

如果我执行我的代码,MAXIMIZE并恢复我的窗口,数字就错了。让我用这段代码的简单输出来解释:

  

调整事件:框架尺寸:800,600 Pane1尺寸:400,200

     

调整事件:框架尺寸:800,600 Pane1尺寸:400,200

     

重新调整事件:画面尺寸:1382,744 Pane1尺寸:400,200 最大化

     

调整事件:帧大小:800,600 Pane1大小:691,200 在此恢复

如您所见,最后一个维度值(691,200)应该引用(1382,744)帧维度,而不是最后一个维度(800,600)......

调用revalidate和重绘方法会更新我的图形(显示此代码的预期结果),但对此问题没有帮助。任何帮助表示赞赏

0 个答案:

没有答案