Java GUI - 嵌套面板

cal*_*kon 4 java swing

我正在尝试创建一个表单,该表单接受用户输入的名字和姓氏,并打印一个结合这两者的欢迎消息.我想将输入内容组合到一个网格面板中,然后将"Go"按钮和在另一个面板中显示消息的文本字段分组,并使用BorderLayout在一个框架内将它们嵌套在一起.

通用布局:

(在3x2网格中)

First Name: __________________________  
Last Name:  __________________________  
Age:        _______________
Run Code Online (Sandbox Code Playgroud)

"GO BUTTON""欢迎马克萨默斯"

教授想把它全部放在一个.java文件中,这是我的问题.我通常将这些东西分开然后扩展类并没有问题.我要做的是将输入和输出面板保存在我的构造函数下,然后在我的main下创建

JFrame frame = new JFrame();
Run Code Online (Sandbox Code Playgroud)

然后

add(new CalebBreckonHW3(320,120));
Run Code Online (Sandbox Code Playgroud)

从而在我的700x700 JFrame"框架"中放置一个320x120面板.我收到一条错误消息,但我无法从静态上下文中引用非静态方法add(java.awt.Component).我不能将我的主要设置为非静态或我会收到错误.

我现在正在通过一个可以指向正确的方向向我添加代码的过程吗?

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

public class CalebBreckonHW3 extends JFrame {
    private JButton jbtGreet = new JButton("Greet Me");
    private JLabel firstOprLbl = new JLabel("First name");
    private JLabel lastOprLbl = new JLabel("Last name");
    private JLabel ageOprLbl = new JLabel("Age");
    private JTextField jtfFirst = new JTextField(10);
    private JTextField jtfLast = new JTextField(15);
    private JTextField jtfAge = new JTextField(3);
    // I'll get to the action events after I get this down
    private JTextField jtfGreet = new JTextField("Welcome firstname, lastname");

    public CalebBreckonHW3(int height, int width) {
        setLayout(new BorderLayout());
        setSize(height, width);
        JPanel inputPanel = new JPanel();
        inputPanel.setLayout(new GridLayout(3,2,0,5));
        jtfGreet.setEditable(false);
        inputPanel.add(firstOprLbl);
        inputPanel.add(jtfFirst);
        inputPanel.add(lastOprLbl);
        inputPanel.add(jtfLast);
        inputPanel.add(ageOprLbl);
        inputPanel.add(jtfAge);
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setTitle("Greeting App");
        frame.setSize(700,700);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

        add(new CalebBreckonHW3(320,120));
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:在我的add语句前添加框架摆脱了静态错误,但它给我一个错误"向容器添加一个窗口"

Dav*_*amp 7

问题是你extendJFrame从你的类类,但你开始你自己JFramemain(),你也不能说add(),因为你是在主要的是static,同时add()需要一个实例被调用,看到你的问题我的评论之前创建的,但是,你应该不延伸JFrame,而是做:

public class CalebBreckonHW3  {

    public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
        JFrame frame = new JFrame();
        frame.setTitle("Greeting App");
       // frame.setSize(700,700); //not recommened
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         JPanel panel=new JPanel(/*set layout if needed*/); 
         //panel.add(new JButton("Hello")); //add components to panel

        frame.getContentPane().add(panel);//why did you add your JFrame again???? so I guess you'd wanna add a JPanel or something with the components you need.

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

    });
 }
...
}
Run Code Online (Sandbox Code Playgroud)

也总是创建一个EDT(所有UI组件所在的事件调度线程)我这样做SwingUtilities.invokeLater();也始终通过添加到JFrames contentPane getContentPane().add();.另外,为什么要将Jframe添加到Jframe中?正如你所看到的,我展示了一个添加a的例子JPanel

编辑:

你创建JFrame一个全局变量然后你可以使用frame.setLayout()等.

但是如果你想让你当前的代码工作,请执行以下操作:

public class CalebBreckonHW3  extends JFrame{

    public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
        new CalebBreckonHW3().createandShowUI();
       }

    });
 }
 private void createAndShowUI() {
        setTitle("Greeting App");
        //setSize(700,700); //not recommened
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         JPanel panel=new JPanel(/*set layout if needed*/); 
         //panel.add(new JButton("Hello")); //add components to panel

        getContentPane().add(panel);//why did you add your JFrame again???? so I guess you'd wanna add a JPanel or something with the components you need.

        pack();//this will override setsize and use LayoutManager
        setVisible(true);     
 }
...
}
Run Code Online (Sandbox Code Playgroud)

JFrame不建议延长a

  • @Caleb:没有必要在JFrame上调用`setLayout(...)`,因为它的contentPane默认使用BorderLayout.此外,你想避免在任何事情上调用`setSize(...)`,而是让组件在你的JFrame上调用`pack()`时找到他们喜欢的大小.大卫答案1+ (3认同)