为什么我的JFrame内容无法正确显示?

时间:2013-07-05 10:50:40

标签: java swing jframe

为了减少代码,我会找出与问题无关的代码,例如addActionListener();等。

我的主要课程是public class TF2_Account_Chief

我有我的主Jframe f;及其内容:

private static JFrame f = new JFrame("TF2 Account C.H.I.E.F.");
private JLabel runnableTogetherLabel = new JLabel("How many idlers would you like to run at a time?");
private static JTextField runnableTogetherInput = new JTextField();
private JButton runButton = new JButton("Run!");
private JButton stopButton = new JButton("Stop!");
private JButton resetButton = new JButton("Reset!");
private JButton exitButton = new JButton("Exit!");

我设置了所有内容的属性:

    public void launchFrame() {
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        f.setVisible(true);
        f.add(runnableTogetherInput);
        f.add(runnableTogetherLabel);
        f.add(runButton);
        f.add(stopButton);
        f.add(resetButton);
        f.add(exitButton);
        f.setSize(625, 500);
        runnableTogetherInput.setSize(35, 20);
        runnableTogetherLabel.setSize(275, 25);
        runButton.setSize(60, 25);
        stopButton.setSize(65, 25);
        resetButton.setSize(70, 25);
        exitButton.setSize(60, 25);
        f.setLocation(0, 0);
        runnableTogetherInput.setLocation(285, 3);
        runnableTogetherLabel.setLocation(5, 0);
        runButton.setLocation(330, 0);
        stopButton.setLocation(395, 0);
        resetButton.setLocation(465, 0);
        exitButton.setLocation(540, 0);
    }

然后我有main()方法:

public static void main(String[] args) throws IOException {
    TF2_Account_Chief gui = new TF2_Account_Chief();
    gui.launchFrame();
    Container contentPane = f.getContentPane();
    contentPane.add(new TF2_Account_Chief());
}

然后我的第二个JFrame iF没有正确显示内容:

private void invalidInput() {
    JFrame iF = new JFrame("Invalid Input!");
    JLabel iL = new JLabel("The input you have entered is invalid!");
    JButton iB = new JButton("Exit!");
    Container contentPane2 = iF.getContentPane();
    contentPane2.add(new TF2_Account_Chief());
    iF.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    iF.pack();
    iF.setVisible(true);
    iF.add(iL);
    iF.add(iB);
    iF.setSize(500, 300);
    iL.setSize(125, 25);
    iB.setSize(60, 25);
    iF.setLocation(0, 0);
    iL.setLocation(0, 15);
    iB.setLocation(0, 45);
}

现在,JFrame iF方法在调用invalidInput()方法时启动,但您无法看到,因为该部分代码与问题无关。重要的是JFrame iF已启动。

新框架如下所示:JFrame iF

有关内容无法正常显示的任何想法?

(通过不正确,我的意思是JButton iB占据了整个框架,框架是浅蓝色而不是正常的灰色。)

2 个答案:

答案 0 :(得分:9)

您使用绝对位置而不使用null布局,这就是您看到一个大按钮的原因。

要查看每个组件,您必须使用

iF.setLayout(null);

这不是一个好习惯,我建议您学习how to use Layouts并将所有工作留给布局管理员

答案 1 :(得分:3)

JFrame的默认布局为 BorderLayout ,其中有“5”个位置可以将您的组件放到

  1. CENTER
  2. PAGE_START
  3. PAGE_END
  4. LINE_START
  5. LINE_END
  6. 因此,iF.add(component)会将组件添加到CENTER,您可以像这样指定位置:

    iF.add(component, BorderLayout.PAGE_END);
    //You can also put  PAGE_START, LINE_START, LINE_END, CENTER
    

    听取我的建议并阅读有关BorderLayout的更多信息,因为如果您拒绝学习布局管理器,您可能会转到Absolute Positioning null 布局)这不是一个好的方式,不得使用。