Java 我的GUI窗口没有';我什么也没表现出来

Java 我的GUI窗口没有';我什么也没表现出来,java,swing,user-interface,jframe,Java,Swing,User Interface,Jframe,我正在尝试使用网格布局来创建GUI窗口。我添加了我所有的组件,它会编译,但当它运行时,它不会显示任何内容。我试着做一个简单的布局,像这样分组和堆叠 {introduction message} {time label time input text} {gravity label gravity input text} {answer label answer text box} {calculate button clear button} 这是我的密码 import javax.swing

我正在尝试使用网格布局来创建GUI窗口。我添加了我所有的组件,它会编译,但当它运行时,它不会显示任何内容。我试着做一个简单的布局,像这样分组和堆叠

{introduction message}
{time label
time input text}
{gravity label
gravity input text}
{answer label
answer text box}
{calculate button clear button}
这是我的密码

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

public class TurnerRandyFallingGUI  extends JFrame
{   
final int WINDOW_HEIGHT=500;
final int WINDOW_WIDTH=500;

public TurnerRandyFallingGUI()
{
    setTitle("Falling Distance Calculator");

    setSize(WINDOW_WIDTH,WINDOW_HEIGHT);

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    setLayout(new GridLayout(1, 5));

    //labels
    JLabel introMessage = new JLabel("Welcome to the Falling distance"+
                                       "calculator");
    JLabel timeLabel = new JLabel("Please enter the amount of time "+
                "in seconds the object was falling.");
    JLabel gravityLabel = new JLabel("Enter the amount of gravity being "+
                    "forced onto the object");
    JLabel answerLabel = new JLabel("Answer");

    //text fields
    JTextField fTime = new JTextField(10);
    JTextField gForce = new JTextField(10);
    JTextField answerT = new JTextField(10);

    //buttons
    JButton calculate = new JButton("Calculate");
    JButton clr = new JButton("clear");

    //panels
    JPanel introP = new JPanel();
    JPanel timeP = new JPanel();
    JPanel gravityP = new JPanel();
    JPanel answerP = new JPanel();
    JPanel buttonsP = new JPanel();

    //adding to the panels
    //intro panel
    introP.add(introMessage);
    //time panel
    timeP.add(timeLabel);
    timeP.add(fTime);
    //gravity panel
    gravityP.add(gravityLabel);
    gravityP.add(gForce);
    //answer panel
    answerP.add(answerLabel);
    answerP.add(answerT);
    //button panel
    buttonsP.add(calculate);
    buttonsP.add(clr);




    setVisible(true);
}
    public static void main(String[] args)
    {
        new TurnerRandyFallingGUI();
    }
}

您没有向上面的类扩展的JFrame添加任何内容。如果愿意,您需要将组件添加到容器中,容器的层次结构最终会导致顶层窗口,添加到
this
。换句话说,在上面的代码中没有
add(someComponent)
或功能类似的
this.add(someComponent)
方法调用

  • 考虑将所有JPanel添加到单个JPanel
  • 考虑通过调用
    add(thatJPanel)
    将该JPanel添加到类的JFrame实例中
  • 更好的做法是不扩展JFrame,只在需要时创建一个JFrame,但这可能是另一个时间的另一个讨论主题

您没有向上面的类扩展的JFrame添加任何内容。如果愿意,您需要将组件添加到容器中,容器的层次结构最终会导致顶层窗口,添加到
this
。换句话说,在上面的代码中没有
add(someComponent)
或功能类似的
this.add(someComponent)
方法调用

  • 考虑将所有JPanel添加到单个JPanel
  • 考虑通过调用
    add(thatJPanel)
    将该JPanel添加到类的JFrame实例中
  • 更好的做法是不扩展JFrame,只在需要时创建一个JFrame,但这可能是另一个时间的另一个讨论主题
设置可见(true)
语句之前添加以下语句:

add (introP);
add (timeP);
add (gravityP);
add (answerP);
add (buttonsP);
setVisible(true)
语句之前添加以下语句:

add (introP);
add (timeP);
add (gravityP);
add (answerP);
add (buttonsP);

你的JFrame里什么都没有。这就是原因

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

public class TurnerRandyFallingGUI  extends JFrame
{   
final int WINDOW_HEIGHT=500;
final int WINDOW_WIDTH=500;

public TurnerRandyFallingGUI()
{


    //labels
    JLabel introMessage = new JLabel("Welcome to the Falling distance"+
                                       "calculator");
    JLabel timeLabel = new JLabel("Please enter the amount of time "+
                "in seconds the object was falling.");
    JLabel gravityLabel = new JLabel("Enter the amount of gravity being "+
                    "forced onto the object");
    JLabel answerLabel = new JLabel("Answer");

    //text fields
    JTextField fTime = new JTextField(10);
    JTextField gForce = new JTextField(10);
    JTextField answerT = new JTextField(10);

    //buttons
    JButton calculate = new JButton("Calculate");
    JButton clr = new JButton("clear");

    //panels
    JPanel introP = new JPanel();
    JPanel timeP = new JPanel();
    JPanel gravityP = new JPanel();
    JPanel answerP = new JPanel();
    JPanel buttonsP = new JPanel();

    //adding to the panels
    //intro panel
    introP.add(introMessage);
    //time panel
    timeP.add(timeLabel);
    timeP.add(fTime);
    //gravity panel
    gravityP.add(gravityLabel);
    gravityP.add(gForce);
    //answer panel
    answerP.add(answerLabel);
    answerP.add(answerT);
    //button panel
    buttonsP.add(calculate);
    buttonsP.add(clr);

    setLayout(new GridLayout(5, 1));

    this.add(introP);
    this.add(timeP);
    this.add(gravityP);
    this.add(answerP);
    this.add(buttonsP);


 setTitle("Falling Distance Calculator");

    this.pack();

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);



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

            @Override
            public void run() {
                new TurnerRandyFallingGUI();
            }
        });

    }
}
考虑以下几点

  • 在GridLayout中,第一个参数是,第二个参数是
  • 切勿手动设置JFrame的大小。使用
    pack()
    方法来决定 大小
  • 使用
    SwingUtilities.InvokeLater()
    在另一个线程中运行GUI

    • 您的JFrame中没有任何内容。这就是原因

      import javax.swing.*;
      import java.awt.*; 
      
      public class TurnerRandyFallingGUI  extends JFrame
      {   
      final int WINDOW_HEIGHT=500;
      final int WINDOW_WIDTH=500;
      
      public TurnerRandyFallingGUI()
      {
      
      
          //labels
          JLabel introMessage = new JLabel("Welcome to the Falling distance"+
                                             "calculator");
          JLabel timeLabel = new JLabel("Please enter the amount of time "+
                      "in seconds the object was falling.");
          JLabel gravityLabel = new JLabel("Enter the amount of gravity being "+
                          "forced onto the object");
          JLabel answerLabel = new JLabel("Answer");
      
          //text fields
          JTextField fTime = new JTextField(10);
          JTextField gForce = new JTextField(10);
          JTextField answerT = new JTextField(10);
      
          //buttons
          JButton calculate = new JButton("Calculate");
          JButton clr = new JButton("clear");
      
          //panels
          JPanel introP = new JPanel();
          JPanel timeP = new JPanel();
          JPanel gravityP = new JPanel();
          JPanel answerP = new JPanel();
          JPanel buttonsP = new JPanel();
      
          //adding to the panels
          //intro panel
          introP.add(introMessage);
          //time panel
          timeP.add(timeLabel);
          timeP.add(fTime);
          //gravity panel
          gravityP.add(gravityLabel);
          gravityP.add(gForce);
          //answer panel
          answerP.add(answerLabel);
          answerP.add(answerT);
          //button panel
          buttonsP.add(calculate);
          buttonsP.add(clr);
      
          setLayout(new GridLayout(5, 1));
      
          this.add(introP);
          this.add(timeP);
          this.add(gravityP);
          this.add(answerP);
          this.add(buttonsP);
      
      
       setTitle("Falling Distance Calculator");
      
          this.pack();
      
          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      
      
      
          setVisible(true);
          this.validate();
      }
          public static void main(String[] args)
          {
              SwingUtilities.invokeLater(new Runnable() {
      
                  @Override
                  public void run() {
                      new TurnerRandyFallingGUI();
                  }
              });
      
          }
      }
      
      考虑以下几点

      • 在GridLayout中,第一个参数是,第二个参数是
      • 切勿手动设置JFrame的大小。使用
        pack()
        方法来决定 大小
      • 使用
        SwingUtilities.InvokeLater()
        在另一个线程中运行GUI

      这将不起作用,因为它没有考虑JFrame的默认BorderLayout。我认为所有面板都将根据GridLayout添加到JFrame中,一行五列。当您查看上面的代码时,您可以看到使用了setLayout(新的GridLayout(1,5))语句。如果不指定布局,JFrame的默认布局是BorderLayout抱歉,我现在看到了。1+回答。气垫船没问题。谢谢,这不起作用,因为它没有考虑JFrame的默认BorderLayout。我认为所有面板都将根据GridLayout添加到JFrame,一行五列。当您查看上面的代码时,您可以看到使用了setLayout(新的GridLayout(1,5))语句。如果不指定布局,JFrame的默认布局是BorderLayout抱歉,我现在看到了。1+回答。气垫船没问题。非常感谢。