Java 空白JFrame,没有出现JPanel,但已经添加

Java 空白JFrame,没有出现JPanel,但已经添加,java,swing,layout-manager,Java,Swing,Layout Manager,有人能帮我吗?每当我运行下面的代码时,它总是返回一个空白帧,我不知道我哪里做错了。你们能帮我调试一下吗?我已经将组件添加到面板,将面板添加到框架,但它仍然返回空白输出 以下是我得到的输出: 而这正是我们所需要的 import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.JLabel; import javax

有人能帮我吗?每当我运行下面的代码时,它总是返回一个空白帧,我不知道我哪里做错了。你们能帮我调试一下吗?我已经将组件添加到面板,将面板添加到框架,但它仍然返回空白输出

以下是我得到的输出:

而这正是我们所需要的

    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.JLabel;
    import javax.swing.JButton;
    import javax.swing.ButtonGroup;
    import javax.swing.BorderFactory;
    import javax.swing.UIManager;
    import javax.swing.BoxLayout;
    import java.awt.GridLayout;
    import java.awt.EventQueue;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    import java.awt.BorderLayout;
    import java.awt.Color;
    import javax.swing.JRadioButton;
    /**
     *
     * @author Chareux
     */

    //Declaring Variables



    public class TestUI {

        private JFrame frm_main;
        private JPanel sr_pnl;
        private JLabel sr_lbl;
        private JLabel sr_lbl2;
        private JLabel ret_optn_lbl;
        private JLabel ret_rsn_lbl;
        private ButtonGroup ret_ops;
        private JTextField sr_txtnum;
        private JTextField sr_ret_txtrsn;
        private JButton sr_start;
        private JRadioButton ret_optn_rdbn_y;
        private JRadioButton ret_optn_rdbn_n;


        public TestUI(){
            start();
        }

        public void start(){

//Creating the JFrame
            frm_main = new JFrame("Service Desk SR Tool");
            frm_main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frm_main.setSize(500,450);
            frm_main.setLocationRelativeTo(null);
            frm_main.setResizable(false);
            frm_main.setVisible(true);

            // the Panel
            sr_pnl = new JPanel();

            //Components
            sr_lbl = new JLabel("SERVICE DESK SR TIMER!");
            sr_lbl2 = new JLabel("SR number: ");
            sr_txtnum = new JTextField("Enter SR number here..",20);
            ret_optn_lbl = new JLabel("Returning Ticket?");
            ret_optn_rdbn_y = new JRadioButton("Yes");
            ret_optn_rdbn_n = new JRadioButton("No");
            ret_rsn_lbl = new JLabel("Reason: ");
            sr_ret_txtrsn = new JTextField("Enter Reason number here..",20);
            sr_start = new JButton("START!");

            //adding the Components to the panel
            sr_pnl.add(sr_lbl);
            sr_pnl.add(sr_lbl2);
            sr_pnl.add(sr_txtnum);
            sr_pnl.add(ret_optn_lbl); 
            sr_pnl.add(ret_optn_rdbn_y);
            sr_pnl.add(ret_optn_rdbn_n);
            sr_pnl.add(ret_rsn_lbl);
            sr_pnl.add(sr_ret_txtrsn);
            sr_pnl.add(sr_start);



            frm_main.add(sr_pnl,BorderLayout.CENTER);

            //ButtonGroup for the radio button
            ret_ops = new ButtonGroup();
            ret_ops.add(ret_optn_rdbn_y);
            ret_ops.add(ret_optn_rdbn_n);
        }

        public static void main(String[] args) {

         new TestUI();

        }
    }


start()的末尾添加
frm\u main.validate()

public void start(){

   /*
   ...
   Same As Above
   ...
   */

        frm_main.add(sr_pnl,BorderLayout.CENTER);

        //ButtonGroup for the radio button
        ret_ops = new ButtonGroup();
        ret_ops.add(ret_optn_rdbn_y);
        ret_ops.add(ret_optn_rdbn_n);

        frm_main.validate(); // Add this line ******
    }

start()的末尾添加
frm\u main.validate()

public void start(){

   /*
   ...
   Same As Above
   ...
   */

        frm_main.add(sr_pnl,BorderLayout.CENTER);

        //ButtonGroup for the radio button
        ret_ops = new ButtonGroup();
        ret_ops.add(ret_optn_rdbn_y);
        ret_ops.add(ret_optn_rdbn_n);

        frm_main.validate(); // Add this line ******
    }

我建议使用嵌套或复合布局来完成此任务。请参阅源代码注释中的更多提示

import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class SRTool {

    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                // the GUI as seen by the user (without frame)
                JPanel gui = new JPanel(new GridLayout(0,1,6,6));
                gui.setBorder(new EmptyBorder(2, 3, 2, 3));

                // show the BG
                gui.setBackground(Color.CYAN);
                // center the label text
                gui.add(new JLabel(
                        "Service Desk SR Tool", SwingConstants.CENTER));
                // create a lyout that can center multiple components
                FlowLayout layout = new FlowLayout(FlowLayout.CENTER,5,5);
                JPanel srPanel = new JPanel(layout);
                gui.add(srPanel);
                srPanel.add(new JLabel("SR:"));
                srPanel.add(new JTextField(8));

                JPanel returnTicketPanel = new JPanel(layout);
                gui.add(returnTicketPanel);
                returnTicketPanel.add(new JLabel("Returning Ticket?"));
                returnTicketPanel.add(new JCheckBox());

                JPanel reasonPanel = new JPanel(layout);
                gui.add(reasonPanel);
                reasonPanel.add(new JLabel("Reason:"));
                reasonPanel.add(new JTextField(14));

                JPanel buttonPanel = new JPanel(layout);
                gui.add(buttonPanel);
                buttonPanel.add(new JButton("Start!"));

                JFrame f = new JFrame("Demo");
                f.add(gui);
                // Ensures JVM closes after frame(s) closed and
                // all non-daemon threads are finished
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                // See https://stackoverflow.com/a/7143398/418556 for demo.
                f.setLocationByPlatform(true);

                // ensures the frame is the minimum size it needs to be
                // in order display the components within it
                f.pack();
                // should be done last, to avoid flickering, moving,
                // resizing artifacts.
                f.setVisible(true);
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
        SwingUtilities.invokeLater(r);
    }
}

javagui可能必须在许多平台上工作,在不同的屏幕分辨率上&使用不同的plaf。因此,它们不利于部件的精确放置。要为健壮的GUI组织组件,请使用布局管理器或1,以及布局填充和边框2




  • 我建议使用嵌套或复合布局来完成此任务。请参阅源代码注释中的更多提示

    import java.awt.*;
    import javax.swing.*;
    import javax.swing.border.EmptyBorder;
    
    public class SRTool {
    
        public static void main(String[] args) {
            Runnable r = new Runnable() {
    
                @Override
                public void run() {
                    // the GUI as seen by the user (without frame)
                    JPanel gui = new JPanel(new GridLayout(0,1,6,6));
                    gui.setBorder(new EmptyBorder(2, 3, 2, 3));
    
                    // show the BG
                    gui.setBackground(Color.CYAN);
                    // center the label text
                    gui.add(new JLabel(
                            "Service Desk SR Tool", SwingConstants.CENTER));
                    // create a lyout that can center multiple components
                    FlowLayout layout = new FlowLayout(FlowLayout.CENTER,5,5);
                    JPanel srPanel = new JPanel(layout);
                    gui.add(srPanel);
                    srPanel.add(new JLabel("SR:"));
                    srPanel.add(new JTextField(8));
    
                    JPanel returnTicketPanel = new JPanel(layout);
                    gui.add(returnTicketPanel);
                    returnTicketPanel.add(new JLabel("Returning Ticket?"));
                    returnTicketPanel.add(new JCheckBox());
    
                    JPanel reasonPanel = new JPanel(layout);
                    gui.add(reasonPanel);
                    reasonPanel.add(new JLabel("Reason:"));
                    reasonPanel.add(new JTextField(14));
    
                    JPanel buttonPanel = new JPanel(layout);
                    gui.add(buttonPanel);
                    buttonPanel.add(new JButton("Start!"));
    
                    JFrame f = new JFrame("Demo");
                    f.add(gui);
                    // Ensures JVM closes after frame(s) closed and
                    // all non-daemon threads are finished
                    f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                    // See https://stackoverflow.com/a/7143398/418556 for demo.
                    f.setLocationByPlatform(true);
    
                    // ensures the frame is the minimum size it needs to be
                    // in order display the components within it
                    f.pack();
                    // should be done last, to avoid flickering, moving,
                    // resizing artifacts.
                    f.setVisible(true);
                }
            };
            // Swing GUIs should be created and updated on the EDT
            // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
            SwingUtilities.invokeLater(r);
        }
    }
    

    javagui可能必须在许多平台上工作,在不同的屏幕分辨率上&使用不同的plaf。因此,它们不利于部件的精确放置。要为健壮的GUI组织组件,请使用布局管理器或1,以及布局填充和边框2





  • 移动
    frm_main.setVisible(真)
    ret\u ops.add(ret\u optn\u rdbn\n)之后。添加所有组件后,应始终将框架设置为可见。或者将
    frm\u main.validate()和frm\u main.repaint()写入
    start()
    方法的最后几行。尽管最好先将组件添加到容器中,然后在GUI中将容器的visible属性设置为现有的
    true
    :-),但标签
    原因:
    和文本字段
    在此处输入原因编号
    会出现在不同的行中。我想这不是故意的吧?这段代码有很多问题。为了获得最佳帮助,请发布预期布局的ASCII艺术(或绘图)。我只希望它像这样一个简单的菜单。Move
    frm_main.setVisible(true)
    ret\u ops.add(ret\u optn\u rdbn\n)之后。添加所有组件后,应始终将框架设置为可见。或者将
    frm\u main.validate()和frm\u main.repaint()写入
    start()
    方法的最后几行。尽管最好先将组件添加到容器中,然后在GUI中将容器的visible属性设置为现有的
    true
    :-),但标签
    原因:
    和文本字段
    在此处输入原因编号
    会出现在不同的行中。我想这不是故意的吧?这段代码有很多问题。为了获得最好的帮助,请发布预期布局的ASCII艺术(或绘图)。我只希望它像这样一个简单的菜单。谢谢先生,哦,顺便说一句,什么是.pack();是吗?请参阅此文档,了解尺寸为什么没有按计划进行?就像在.setSize()上声明的一样?为此,可以使用
    frm\u main.validate()
    保留大小。我会修改答案。
    pack()
    根据子组件调整组件的大小。谢谢先生,哦,顺便说一句。pack()有什么作用;是吗?请参阅此文档,了解尺寸为什么没有按计划进行?就像在.setSize()上声明的一样?为此,可以使用
    frm\u main.validate()
    保留大小。我将修改答案。
    pack()
    根据子组件调整组件大小。非常感谢您,先生!,这个对我帮助最大:)很高兴你把它整理好了。:)非常感谢,先生!,这个对我帮助最大:)很高兴你把它整理好了。:)