Why are the contents of my JFrame not displaying correctly?

痞子三分冷 提交于 2019-12-12 15:48:02

问题


For the sake of less code, I am taking out code that is unrelevant to the problem, such as addActionListener(); etc.

My main class is public class TF2_Account_Chief

I have my main Jframe f; and its contents:

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!");

and I set the properties of all the contents:

    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);
    }

then I have my main() method:

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());
}

And then I have my second JFrame iF which is not displaying the contents correctly:

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);
}

Now, JFrame iF is launched when the invalidInput() method is called, but you can't see that because that part of the code is unrelevant to the problem. What does matter is that the JFrame iF is launched.

The new frame looks like this:

Any ideas on why the contents are not displaying properly?

(By improperly, I mean the JButton iB takes up the whole frame and the frame is a light blue instead of the normal grey.)


回答1:


You are using absolute positions without using a null layout, that's why you see a large button.

To see every component, you have to use

iF.setLayout(null);

but it's not a good practice, I'd suggest you to learn how to use Layouts and leave all the work to the layout manager




回答2:


The default layout of JFrame is BorderLayout, in which there are "5" locations you can put your components to

  1. CENTER
  2. PAGE_START
  3. PAGE_END
  4. LINE_START
  5. LINE_END

So, iF.add(component) will add the component to the CENTER, you can specify the location like this:

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

Take my advice and read more about BorderLayout, because if you refuse to learn Layout Managers, you probably go to Absolute Positioning( null layout) which is not a good way and must not be used.



来源:https://stackoverflow.com/questions/17487139/why-are-the-contents-of-my-jframe-not-displaying-correctly

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!