如何修复 JButton 位置

How to fix JButton Location

之前我问过一个关于这个程序的问题,我和你们一起解决了。现在我在第一个包含形状游戏的面板上创建了新面板。所以我尝试在新面板上设置 JButton。但我无法更改 Jbuttons 的位置。 我正在尝试设置新 panel.I 的中心已经尝试过 FLowLayout()、BorderLayout() 和 setBounds();出了点问题。

以前的问题;

public class myshapestry extends JFrame implements ActionListener {

JFrame frame=new JFrame("Deneme");

 Startthegame panelstart= new Startthegame();
Container l ;

JLabel statusbar = new JLabel("default");
static JButton start;
static JButton exit;

 myshapestry() {

     l=this.getContentPane();
     this.setLayout(null);

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frame.pack();
     frame.setLocationRelativeTo(null);

     frame.add(panelstart);
     frame.add(statusbar, BorderLayout.SOUTH);

        frame.setVisible(true);
        frame.setSize(getPreferredSize());

       start = new JButton("Start");
       exit = new JButton("Exit");


       panelstart.add(start);
       panelstart.add(exit);




    }

 public Dimension getPreferredSize() {
       return new  Dimension(500,600);
   }

   public static void main (String args[]){
       myshapestry tr=new myshapestry();
       tr.setTitle("Game of Shapes");

    } 

   public class Startthegame extends JPanel {

   }







   }

您是从 JFrame 扩展的,但在 class 中创建了 JFrame 的新实例并与两者交互,这只会混淆问题。从摆脱 extends JFrame 开始,您不会向 class 添加任何新功能,它只是将您锁定在一个用例中

static 不是你的朋友,你应该尽可能避免使用它。在这种情况下,您可以将按钮移动到 Startthegame。这是对工作单元隔离职责的基本 OO 原则。

要使按钮在容器内水平和垂直居中,您可以使用 GridBagLayout

public class Startthegame extends JPanel {

    private JButton start;
    private JButton exit;

    public Startthegame() {
        setLayout(new GridBagLayout());

        start = new JButton("Start");
        exit = new JButton("Exit");

        add(start);
        add(exit);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(500, 600);
    }

}

你还应该在建立基本 UI 之后调用 setVisible,否则你可能会在未显示的组件中结束

例如...

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class MyShapesTry {

    JFrame frame = new JFrame("Deneme");

    Startthegame panelstart = new Startthegame();
    Container l;

    JLabel statusbar = new JLabel("default");

    public MyShapesTry() {

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(panelstart);
        frame.add(statusbar, BorderLayout.SOUTH);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

    }

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                MyShapesTry tr = new MyShapesTry();
            }
        });
    }

}