4

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

通用布局:

(在 3x2 网格中)

First Name: __________________________  
Last Name:  __________________________  
Age:        _______________

“GO BUTTON” “欢迎 Mark Summers”

教授希望将所有内容都放在一个 .java 文件中,这是我的问题。我通常会将这些东西分开然后扩展类并且没有问题。我要做的是将输入和输出面板保存在我的构造函数下,然后在我的主目录下,创建

JFrame frame = new JFrame();

进而

add(new CalebBreckonHW3(320,120));

从而在我的 700x700 JFrame“框架”内放置一个 320x120 面板。尽管我无法从静态上下文中引用非静态方法 add(java.awt.Component),但我收到一条错误消息。我无法将 main 设置为非静态,否则会出错。

我现在正在通过任何人都可以指出我正确的方向来向其中添加代码吗?

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));
    }
}

编辑:在我的 add 语句前面添加框架消除了静态错误,但它给了我一个错误“将窗口添加到容器”

4

1 回答 1

7

问题是您extendJFrame班级中的班级,但是您在班级中发起了自己的班级,JFramemain()不能打电话add(),因为您在 main 中,staticadd()在被调用之前需要创建一个实例,请参阅我对您的问题的评论,但是,您应该不扩展 aJFrame而是做:

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);
       }

    });
 }
...
}

还总是创建一个 EDT(所有 UI 组件都放置在其上的事件SwingUtilities.invokeLater();调度JFrame线程getContentPane().add();)另一件事,你为什么将你的 Jframe 添加到你的 Jframe 中?如您所见,我展示了一个添加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);     
 }
...
}

JFrame但不建议扩展 a

于 2012-09-14T17:00:32.897 回答