0

我有这个简单的代码:

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 组件的实际大小。

如果我执行我的代码,最大化并恢复我的窗口,数字是错误的。让我用这段代码的简单输出来解释一下:

调整大小事件:框架尺寸:800、600 窗格1 尺寸:400、200

调整大小事件:框架尺寸:800、600 窗格1 尺寸:400、200

调整大小事件:框架尺寸:1382、744 窗格1 尺寸:400、200在此处最大化

调整大小事件:框架大小:800、600 窗格 1 大小:691、200在此处恢复

如您所见,最后一个尺寸值 (691, 200) 应该参考 (1382,744) 框架尺寸,而不是最后一个 (800,600)...

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

4

1 回答 1

0

问题在于它contentPane被用于两个不同的冲突角色。首先,代码用作调用contentPane的内容窗格。接下来,当用作 的参数时,将其视为自身的子级。MyFramesetContentPane(contentPane)contentPanelayout.putConstraint

a 的内容窗格JFrame是其子级的父级JFrame以及应用布局的容器。见[RootPaneContainer][1]

因此,您需要第三个面板。我建议调用它panelWestlayout.putConstraintcontentPane. 不要忘记初始化它并将其添加到MyFrame,就像panel. 并删除所有添加到自身的调用contentPane(包括将其添加到MyFrame,这会将其添加到自身),并删除布局约束的所有设置,contentPane就好像它是MyFrame.

于 2022-01-17T21:29:11.107 回答