Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JFrame未显示(仅标题栏)_Java_Swing_User Interface_Jframe - Fatal编程技术网

Java JFrame未显示(仅标题栏)

Java JFrame未显示(仅标题栏),java,swing,user-interface,jframe,Java,Swing,User Interface,Jframe,我知道这是一件非常简单的事情,但作为一个完全的Java新手,我错过了它,有人指出它会非常有帮助。我盯着屏幕四处移动,但还是什么都没有 截图: 这就是运行时出现的所有问题 fullGUI.java: …打电话给 test.java 用大写字母命名Java中的类 FullGUI已经扩展了JFrame,因此无需在其中创建另一个JFrame 调用getContentPane.add()添加到JFrame 使用SwingUtilities.invokeLater 总的来说是这样的 import j

我知道这是一件非常简单的事情,但作为一个完全的Java新手,我错过了它,有人指出它会非常有帮助。我盯着屏幕四处移动,但还是什么都没有

截图: 这就是运行时出现的所有问题

fullGUI.java:



…打电话给

test.java



  • 用大写字母命名Java中的类
  • FullGUI
    已经扩展了
    JFrame
    ,因此无需在其中创建另一个
    JFrame
  • 调用
    getContentPane.add()
    添加到
    JFrame
  • 使用
    SwingUtilities.invokeLater
  • 总的来说是这样的

    import java.awt.BorderLayout;
    import javax.swing.JFrame;
    import javax.swing.JRadioButton;
    import javax.swing.JTextArea;
    
    
    public class FullGUI extends JFrame
    
    {
        public FullGUI() // constructor
        {
            getContentPane().add(new JRadioButton("Horizontal"), BorderLayout.WEST);
            getContentPane().add(new JRadioButton("Vertical"), BorderLayout.WEST);
            getContentPane().add(new JTextArea("Instructions to player will go here"), BorderLayout.CENTER);
            setSize(400,600);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setTitle("Battleship!");
            pack(); //sets appropriate size for frame
            setVisible(true);
        }
    
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
    
            @Override
            public void run() {
                new FillGU();
            }
        });
    }
    

    问题是您正在类中扩展JFrame并创建新的对象“frame”。您正在将JRadioButton或JTextArea等组件添加到fullGUI中,JFrame的其他设置适用于frame对象。选择哪种方法取决于你,但选择其中一种。您可以扩展JFrame,并且您的类将是JFrame的子类,这意味着您可以从父类调用所有公共或受保护的方法,而无需创建JFrame的新实例。另一种方法是不扩展JFrame,而必须创建新的JFrame对象。

    正如Nikolay Kuznetsov在前面的回答中所说,您已经在fullGUI中扩展了JFrame,因此不需要在该类中创建新的JFrame,因为fullGUI的每个实例都将是一个新的框架

    在编写代码时,您创建了一个框架,比如frame1和fullGUI实例(在main方法中)比如frame2,这是两个不同的框架。在构造函数中,您已将这些控件添加到frame2(add()==this.add())和frame1.setvisible(true)

    将控件添加到一个帧并显示完全不同的帧是您无法在输出屏幕上看到任何内容的原因,尽管您可以将屏幕最大化。

    frame.pack()导致JFrame根据其内容调整大小

    如果您有frame.setSize(400600),即使您没有向其内容窗格添加任何内容, 框架将以400x600的尺寸显示


    但是当调用frame.pack()时,框架将调整大小。在您的情况下,框架的内容窗格不包含任何内容。因此,pack()方法将其大小调整为仅显示标题栏。

    无需
    getContentPane()
    <代码>添加()转发。避免不必要地扩展
    JFrame
    。如果有其他保证,请在
    pack()
    之后调用
    setSize()
    。非常感谢您的明确更正!正如你可能知道的那样,我仍然处于学习编程概念(特别是Java)的“把头撞在墙上,直到我最终掌握”阶段。@BILLBONER,我半年前也开始学习SWING。请看TrasVald的评论,并考虑接受我的回答。我也很欣赏课堂命名修正公约。我把这些都弄混了。是的,我想调整大小可能与内容不满足有关——谢谢你的确认。谢谢你的回复Toby。这对我来说很慢,但解释有帮助!谢谢你,瓦拉布!您的最后一个注释“将控件添加到一个帧并显示完全不同的帧是您无法在输出屏幕上看到任何内容的原因,尽管您可以将屏幕最大化。”这让我更清楚,同时也解释了为什么此代码的早期版本会弹出多个窗口。我很高兴这对您有所帮助。:-)
    public class test 
    {
    
         public static void main(String[] args) 
         {
    
             new fullGUI();
    
    
         }
    
    
    }
    
    import java.awt.BorderLayout;
    import javax.swing.JFrame;
    import javax.swing.JRadioButton;
    import javax.swing.JTextArea;
    
    
    public class FullGUI extends JFrame
    
    {
        public FullGUI() // constructor
        {
            getContentPane().add(new JRadioButton("Horizontal"), BorderLayout.WEST);
            getContentPane().add(new JRadioButton("Vertical"), BorderLayout.WEST);
            getContentPane().add(new JTextArea("Instructions to player will go here"), BorderLayout.CENTER);
            setSize(400,600);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setTitle("Battleship!");
            pack(); //sets appropriate size for frame
            setVisible(true);
        }
    
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
    
            @Override
            public void run() {
                new FillGU();
            }
        });
    }