如何手动设置JComponents的位置等

时间:2015-09-04 19:04:16

标签: java swing jpanel layout-manager jcomponent

我已经尝试了setLocation(x,y)和setLocationRelativeTo(null),将JFrame的Layout设置为null但是没有用完。搜索时我发现这个问题已经被两三个人提出但他们已经完成了通过setLocation()和setLocationRelativeTo(null)。

import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.FlowLayout;

public class StartMenu{
    JPanel startPanel;
    JLabel title;
    JButton startTest;
    JButton exit;
    JFrame menuFrame;

    public StartMenu(){
        menuFrame = new JFrame("Start Menu");
        menuFrame.setLayout(null);

        startPanel = new JPanel();

        title = new JLabel("Adaptive Test",JLabel.CENTER);
        title.setLocation(20,20);
        startPanel.add(title);

        startTest = new JButton("Start");
        startTest.setLocation(40,40);
        startPanel.add(startTest);

        exit = new JButton("Exit");
        exit.setLocation(100,100);
        startPanel.add(exit);
        menuFrame.setContentPane(startPanel);

        menuFrame.setVisible(true);
        menuFrame.setSize(500, 500);
        menuFrame.setResizable(false);
        menuFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

2 个答案:

答案 0 :(得分:0)

您的JFrame布局设置为空,但startPanel的布局未设置为空。首先,使用:

startPanel.setLayout(null);

现在,使用component.setBounds(x, y, width, height)代替component.setLocation(x, y),因此您还要为它们设置大小。

但正如评论中所说,最好使用layout managers而不是null布局。

答案 1 :(得分:-1)

首先将JFrame设置为null而不是JPanel,因此必须使用

startPanel.setLayout(null);

然后你应该使用setBounds而不是setLocation,如果你只是设置一个空布局管理器的位置,你可能在面板上看不到任何内容,因为默认情况下所有维度都被初始化为0。

所以,你可以像这样重写你的软件:

import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class StartMenu{
    JPanel startPanel;
    JLabel title;
    JButton startTest;
    JButton exit;
    JFrame menuFrame;

    public StartMenu(){
        menuFrame = new JFrame("Start Menu");
        menuFrame.setLayout(null);

        startPanel = new JPanel();
        startPanel.setLayout(null);

        title = new JLabel("Adaptive Test",JLabel.CENTER);
        title.setBounds(20,20, 100, 30);
        startPanel.add(title);

        startTest = new JButton("Start");
        startTest.setBounds(50,50, 100, 30);
        startPanel.add(startTest);

        exit = new JButton("Exit");
        exit.setBounds(100,100, 100 ,30);
        startPanel.add(exit);
        menuFrame.setContentPane(startPanel);

        menuFrame.setVisible(true);
        menuFrame.setSize(500, 500);
        menuFrame.setResizable(false);
        menuFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

}

像这样你得到了一些有用的东西,但是手动设置软件中的所有位置和大小并不是一个很好的编程习惯,因为它在不同的系统上不能很好地工作(因此它不可移植)而你当你的软件开始增长数十甚至数百个图形元素时,你也会发现自己陷入调试的噩梦。

我的建议是使用gridBagLayout,起初我看起来很晦涩,但相信我,事实并非如此!