我的JPanel不会出现(Java)

时间:2015-01-11 14:13:08

标签: java user-interface

我不明白为什么我的JPanel因为我使用pack()和setVisible(true)而不会出现 它只是运行应用程序,没有任何反应。 这是我的代码

import java.io.*;
import java.net.*;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;

import javax.swing.*;

import java.awt.event.*;
import java.awt.*;

import javax.swing.JFrame;

public class TestGUI extends JFrame {

    private JPanel _panel1 = new JPanel();
    private JTextArea _txtarea = new JTextArea(10, 10);
    private JTextField _txtfield = new JTextField();

    public TestGUI() {
        add(_panel1);
        _panel1.setLayout(new BorderLayout());
        _panel1.add(_txtarea);
        _panel1.add(_txtfield);
        validate();
        _panel1.setVisible(true);
        _panel1.setSize(500, 500);
    }

    public static void main(String[] args) {
        new TestGUI();
    }
}

2 个答案:

答案 0 :(得分:0)

我建议同时显示JFrame,因为它包含您的JPanel

将此作为main()

public static void main(String[] args) {
  SwingUtilities.invokeLater(new Runnable() {
    public void run() {
      new TestGUI().setVisible(true);
    }
  });
}

答案 1 :(得分:0)

您的代码中存在一些问题。您没有正确设置布局。 BorderLayout 需要定位。

将组件添加到JFrame后,您可以为其设置大小或调用 pack()方法,以便JFrame采用适合子组件所需的大小。

以下是一个示例:

class TestGUI extends JFrame {

        private JPanel _panel1 = new JPanel();
        private JTextArea _txtarea = new JTextArea(10, 10);
        private JTextField _txtfield = new JTextField();

        public TestGUI() {
            add(_panel1);
            _panel1.setLayout(new BorderLayout());

            // border layout is done by positioning like center, south north etc.
            _panel1.add(_txtarea, BorderLayout.CENTER);
            _panel1.add(_txtfield, BorderLayout.NORTH);

            // set the size before making it visible
            _panel1.setSize(500, 500);
            setVisible(true);

            // call pack() so that the Frame assumes the needed space only
            pack();

            // set a default close method so that your frame  exits on close.
           setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    }

接下来,最好通过 SwingUtilities.invokeLater EventQueue.invokeLater 生成JFrame,以便由事件调度线程<处理它/ strong>处理事件队列时自己的好时光。