Java 无布局管理器的响应性JFrame

Java 无布局管理器的响应性JFrame,java,swing,jframe,layout-manager,null-layout-manager,Java,Swing,Jframe,Layout Manager,Null Layout Manager,我试图在JFrame中设置两个按钮,我调用它们的setBounds方法来设置它们的位置和大小,并且我将null传递给setLayout1,因为我想使用组件的setBounds`方法 现在我想用我的代码做一些事情,每当我调整框架按钮的大小时,装饰都会以合适的形式改变,如下图所示: 我知道可以使用从JPanel类创建一个对象,并向其添加按钮,最后将创建的面板对象添加到框架中,但由于某种原因(由教授指定),我现在不允许使用它 有什么办法吗?你有什么建议吗 我的代码如下: public class

我试图在
JFrame
中设置两个按钮,我调用它们的
setBounds
方法来设置它们的位置和大小,并且我将
null
传递给
setLayout1,因为我想使用组件的
setBounds`方法

现在我想用我的代码做一些事情,每当我调整框架按钮的大小时,装饰都会以合适的形式改变,如下图所示:

我知道可以使用从
JPanel
类创建一个对象,并向其添加按钮,最后将创建的面板对象添加到框架中,但由于某种原因(由教授指定),我现在不允许使用它

有什么办法吗?你有什么建议吗

我的代码如下:

public class Responsive
{
    public static void main(String[] args)
    {
        JFrame jFrame = new JFrame("Responsive JFrame");
        jFrame.setLayout(null);
        jFrame.setBounds(0,0,400,300);

        JButton jButton1 = new JButton("button 1");
        JButton jButton2 = new JButton("button 2");

        jButton1.setBounds(50,50,100,100);
        jButton2.setBounds(150,50,100,100);

        jFrame.add(jButton1);
        jFrame.add(jButton2);

        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.setVisible(true);
    }
}
您可以尝试使用:

jFrame.addComponentListener(新的ComponentListener(){
//每次调整帧大小时,此方法都会调用
public void ComponentResistized(ComponentEvent e){
//你对按钮的计算
}
});

A
FlowLayout
如果没有水平间距,一些垂直间距和大边框可以轻松实现。
null
布局管理器是永不对“响应”健壮GUI的回答

import java.awt.*;
导入javax.swing.*;
导入javax.swing.border.EmptyBorder;
公共类响应GUI{
私有JComponent ui=null;
ResponsiveGUI(){
initUI();
}
public void initUI(){
如果(ui!=null)返回;
ui=新的JPanel(新的FlowLayout(FlowLayout.CENTER,0,8));
ui.新订单(新的空订单(10,40,10,40));

对于(int i=1;iBad)来说,我的想法是将布局设置为null。相反。是的,我同意你的观点,但这是我们在大学的项目,他们告诉我们这样做:-(感谢您的回答,但我不知道在ComponentResistized内部应该做什么,您能举个例子吗?根据框架
宽度
高度
和框架中所有按钮的值相应地更改按钮的位置:)看起来你是对的,我不知道为什么我的教授说这样做,他说你必须设置边界组件,如果用户更改jFrame的大小,装饰必须更改。在这种情况下,我必须使用空布局管理器,对吗?“他说你必须设置边界”这个人是个白痴。看(是的)
在这种情况下,我必须使用空布局管理器,对吗?
不,您不需要使用空布局。您可以创建一个自定义布局来完成您想要的。正如您所说,没有布局管理器,就不可能有响应性JFrame
import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class ResponsiveGUI {

    private JComponent ui = null;

    ResponsiveGUI() {
        initUI();
    }

    public void initUI() {
        if (ui!=null) return;

        ui = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 8));
        ui.setBorder(new EmptyBorder(10,40,10,40));

        for (int i=1; i<3; i++) {
            ui.add(getBigButton(i));
        }
    }

    public JComponent getUI() {
        return ui;
    }

    private final JButton getBigButton(int number) {
        JButton b = new JButton("Button " + number);
        int pad = 20;
        b.setMargin(new Insets(pad, pad, pad, pad));

        return b;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {
                }
                ResponsiveGUI o = new ResponsiveGUI();

                JFrame f = new JFrame("Responsive GUI");
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);

                f.setContentPane(o.getUI());
                f.pack();

                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}