我正在尝试创建一个表单,该表单接受用户输入的名字和姓氏,并打印一个结合这两者的欢迎消息。我想将输入内容组合到一个网格面板中,然后将“Go”按钮和在另一个面板中显示消息的文本字段分组,并在一帧内使用BorderLayout将这两者嵌套在一起。
通用布局:
(在3x2网格中)
First Name: __________________________
Last Name: __________________________
Age: _______________
“GO BUTTON”“欢迎Mark Summers”
教授想把它全部放在一个.java文件中,这是我的问题。我通常将这些东西分开然后扩展类并没有问题。我要做的是将输入和输出面板保存在我的构造函数下,然后在我的main下创建
JFrame frame = new JFrame();
然后
add(new CalebBreckonHW3(320,120));
从而在我的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));
}
}
编辑:在我的add语句前添加框架摆脱了静态错误,但它给我一个错误“向容器添加一个窗口”
答案 0 :(得分:7)
问题在于您extend
班级JFrame
,但您在JFrame
中发起了自己的main()
,也无法拨打add()
,因为你在main 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);
}
});
}
...
}
也总是创建一个EDT(事件调度线程,所有UI组件都在其上)我通过SwingUtilities.invokeLater();
执行此操作也始终通过JFrame
添加到getContentPane().add();
的contentPane。另外,为什么要将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