【问题标题】:Content in JPanel won't appearJPanel 中的内容不会出现
【发布时间】:2012-08-09 07:47:53
【问题描述】:

没有错误,但是当我运行它时,我添加到 JPanel 中的内容不会出现,只有不在 JPanel 内的内容出现。

import javax.swing.*; 

import java.awt.*;

public class SimpleGUI extends JFrame 
{ 

        public static void main(String arg[]) 
        { 
                SimpleGUI f = new SimpleGUI("GUI components"); 
                f.setSize(600,200); 
                f.setVisible(true); 
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
         } 
        SimpleGUI(String s) 
         { 


                setTitle(s); 
                setLayout(new GridLayout(3,2)); 

                JLabel msg = new JLabel("FINAL EXAM IS JUST AROUND THE CORNER!"); 
                JButton bt = new JButton("OK"); 

                JLabel lb = new JLabel ("Enter your name:"); 
                JTextField tf = new JTextField("<type name here>"); 

                JLabel lb2 = new JLabel ("Enter age:"); 
                JTextField tf2= new JTextField(10);
                tf2.setHorizontalAlignment(JTextField.RIGHT); 

                JCheckBox cb = new JCheckBox("Bold",true); 
                JRadioButton rb1 = new JRadioButton("Red"); 

                JTextArea ta = new JTextArea(5,20);
                JList list = new JList(new Object[] {"Block A", "Block B"}); 
                JComboBox jcb = new JComboBox(new Object[] {"Hello", "Bye"}); 

                ImageIcon ic = new ImageIcon("music.gif"); 
                JButton newbt = new JButton("Play",ic); 
                newbt.setVerticalTextPosition(JButton.TOP); 
                newbt.setHorizontalTextPosition(JButton.CENTER); 

                JPanel p1 = new JPanel(); 
                p1.setLayout(new BorderLayout()); 
                p1.add(lb, BorderLayout.WEST); 
                p1.add(tf, BorderLayout.CENTER);
                p1.add(cb, BorderLayout.EAST); 

                JPanel p2 = new JPanel();
                p2.setLayout(new BorderLayout()); 
                p2.add(lb2, BorderLayout.WEST); 
                p2.add(tf2, BorderLayout.CENTER);                 
                p2.add(rb1, BorderLayout.EAST);

                JPanel p3 = new JPanel();
                p3.setLayout(new BorderLayout());
                p3.add(jcb); 
                add(ta); 
                add(list);
                p3.add(newbt, BorderLayout.NORTH); 
                add(msg);
                p3.add(bt, BorderLayout.SOUTH); 
        } 
}

【问题讨论】:

  • 您是否尝试将p1 添加到框架中? add(p1);
  • 您需要调用pack() 而不是setSize()

标签: java swing layout awt jpanel


【解决方案1】:

我已更新您的代码。看看这个版本:

import javax.swing.*;

import java.awt.*;

public class SimpleGUI extends JFrame {

    public static void main(String arg[]) {

        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                SimpleGUI f = new SimpleGUI("GUI components");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            }

        });

    }

    public SimpleGUI(String s) {


        setTitle(s);
        setLayout(new GridLayout(3, 2));

        JLabel msg = new JLabel("FINAL EXAM IS JUST AROUND THE CORNER!");
        JButton bt = new JButton("OK");

        JLabel lb = new JLabel("Enter your name:");
        JTextField tf = new JTextField("<type name here>");

        JLabel lb2 = new JLabel("Enter age:");
        JTextField tf2 = new JTextField(10);
        tf2.setHorizontalAlignment(JTextField.RIGHT);

        JCheckBox cb = new JCheckBox("Bold", true);
        JRadioButton rb1 = new JRadioButton("Red");

        JTextArea ta = new JTextArea(5, 20);
        JList list = new JList(new Object[]{"Block A", "Block B"});
        JComboBox jcb = new JComboBox(new Object[]{"Hello", "Bye"});

        ImageIcon ic = new ImageIcon("music.gif");
        JButton newbt = new JButton("Play", ic);
        newbt.setVerticalTextPosition(JButton.TOP);
        newbt.setHorizontalTextPosition(JButton.CENTER);

        JPanel p1 = new JPanel();
        p1.setLayout(new BorderLayout());
        p1.add(lb, BorderLayout.WEST);
        p1.add(tf, BorderLayout.CENTER);
        p1.add(cb, BorderLayout.EAST);

        JPanel p2 = new JPanel();
        p2.setLayout(new BorderLayout());
        p2.add(lb2, BorderLayout.WEST);
        p2.add(tf2, BorderLayout.CENTER);
        p2.add(rb1, BorderLayout.EAST);

        JPanel p3 = new JPanel();
        p3.setLayout(new BorderLayout());
        p3.add(jcb);
        add(ta);
        add(list);
        p3.add(newbt, BorderLayout.NORTH);
        add(msg);
        p3.add(bt, BorderLayout.SOUTH);

        /**
         * Need to add the following lines
         */
        this.add(p1);
        this.add(p2);
        this.add(p3);

        this.pack();
        this.setVisible(true);
    }
}

几点建议:

  • 您需要将add 您的components 发送到您的JFrame 才能真正显示出来。

  • 用户界面的任何更新都必须在event dispatch thread 上进行。因此,您会注意到我在main 中添加了SwingUtilites.invokeLater()。看看这篇文章就明白了"Threading with Swing"

【讨论】:

  • 考虑省略 setSize() 并只调用一次 setVisible()。 +1 invokeLater()
  • 糟糕,我在main() 中没有看到setVisible()。感谢您指出这一点!
  • @BruceMartin - 也许这篇 SO 文章可以帮助回答您的问题:stackoverflow.com/questions/7554125/…
  • @BruceMartin:Sujay 是对的;这是另一个perspective
  • 非常感谢您的回答。
【解决方案2】:

您将面板添加到框架的哪个位置?还有,忘记了我的java“规章制度”:需要调用“super()”吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    相关资源
    最近更新 更多