我一直在尝试找出我的代码出了什么问题。我必须构建一个GUI,并且没有错误。该程序成功构建,但是没有弹出GUI。因此,在主要方法中,我注释掉了GUI编程并添加了一个简单的System.out.println("hello");
,但它做的是相同的事情,即,它可以成功构建,但不打印任何内容。有人可以告诉我怎么了吗?谢谢!
/*
* To change this license header, choose License Headers in Project
Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package gui;
import java.awt.*;
import javax.swing.*;
import java.awt.Event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class GUI extends JFrame {
GridLayout g = new GridLayout(5, 2);
private JLabel baseIn = new JLabel("Base Input");
private JLabel heightIn = new JLabel("Height Input");
private JTextField base = new JTextField();
private JTextField height = new JTextField();
private JTextField area = new JTextField();
private JButton calc = new JButton("Calculate Area");
public GUI() {
super("Triangle Area Calculator");
setSize(500, 300);
setLayout(g);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(baseIn);
add(heightIn);
add(base);
add(height);
add(area);
add(calc);
area.setEditable(false);
calc.addActionListener((ActionListener) this);
pack();
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
try {
double bInput = Integer.valueOf(base.getText());
double hInput = Integer.valueOf(height.getText());
double aOutput = 0.5*bInput*hInput;
area.setText("Area of your triangle is: " + aOutput);
} catch (NumberFormatException n) {
System.out.println(n.getMessage());
}
}
public static void main(String[] args) {
/*JFrame frame = new JFrame();
GUI one = new GUI();
frame.getContentPane().add(one);
frame.pack();
frame.setVisible(true);*/
System.out.println("hello world");
}
}
答案 0 :(得分:3)
首先,回到基本代码...
public class GUI extends JFrame {
//...
public static void main(String[] args) {
JFrame frame = new JFrame();
GUI one = new GUI();
frame.getContentPane().add(one);
frame.pack();
frame.setVisible(true);
}
}
将失败,因为您无法将基于窗口的组件添加到窗口中。根据一般经验,应该避免直接覆盖JFrame
(和其他顶级容器),而应该使用不太复杂的东西,例如JPanel
public class GUI extends JPanel {
//...
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new GUI());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
下一步...
calc.addActionListener((ActionListener) this);
您需要执行强制转换以使代码正常工作的事实清楚地表明其他问题不正确,这很可能导致运行时错误并使程序崩溃。也许您应该先阅读How to write a Action Listener和How to Use Buttons, Check Boxes, and Radio Buttons,以更好地了解API的工作原理
通过使用@Override
注释进一步支持此注释,当您“认为”正在实现或覆盖现有功能时,应使用该注释...
@Override
public void actionPerformed(ActionEvent e) {
//...
}
这将无法编译,因为您没有实现任何现有功能。您尚未实现的ActionListener
接口描述了此功能。
尽管您可以直接实现此接口,但我宁愿避免这样做,因为它公开了其他类不应访问的功能,并且冒着构建“神”方法的风险,这从来都不是一个好主意。
相反,我更喜欢使用Java的Anonymous Classes,它提供了一种更好的将功能隔离到单个用例的方法,例如...
calc.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
double bInput = Integer.valueOf(base.getText());
double hInput = Integer.valueOf(height.getText());
double aOutput = 0.5 * bInput * hInput;
area.setText("Area of your triangle is: " + aOutput);
} catch (NumberFormatException n) {
System.out.println(n.getMessage());
}
}
});
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class GUI extends JPanel {
GridLayout g = new GridLayout(5, 2);
private JLabel baseIn = new JLabel("Base Input");
private JLabel heightIn = new JLabel("Height Input");
private JTextField base = new JTextField();
private JTextField height = new JTextField();
private JTextField area = new JTextField();
private JButton calc = new JButton("Calculate Area");
public GUI() {
setLayout(g);
add(baseIn);
add(heightIn);
add(base);
add(height);
add(area);
add(calc);
area.setEditable(false);
calc.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
double bInput = Integer.valueOf(base.getText());
double hInput = Integer.valueOf(height.getText());
double aOutput = 0.5 * bInput * hInput;
area.setText("Area of your triangle is: " + aOutput);
} catch (NumberFormatException n) {
System.out.println(n.getMessage());
}
}
});
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new GUI());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
现在,如果仍然不能使您满意,那么您需要确保将GUI
类配置为“主类”。
首先右键单击Netbeans项目节点,然后选择“属性”(位于底部)。
从“项目属性”的左侧的“构建”选项中选择“运行”。
确保将您的GUI
类标记为“主类”,如果没有,请使用“浏览”来查找它
答案 1 :(得分:0)
尝试一下
calc.addActionListener(new OptionButtonHandler());
我添加了一个实现ActionListener的optionButtonHandler类。我在IDE上检查了一下,就能得到三角形的面积。
private class OptionButtonHandler implements ActionListener {
public void actionPerformed(ActionEvent e) {
try {
double bInput = Integer.valueOf(base.getText());
double hInput = Integer.valueOf(height.getText());
double aOutput = 0.5 * bInput * hInput;
area.setText("Area of your triangle is: " + aOutput);
} catch (NumberFormatException n) {
System.out.println(n.getMessage());
}
}
}
在您的情况下,GUI不是ActionListener,因此将失败。
答案 2 :(得分:0)
您可以使用Netbeans中的main方法右键单击该文件,您应该在其中看到run选项,然后选择它。这将允许您设置主方法。之后,随后单击绿色播放按钮即可。
您不需要将Frame类强制转换为ActionListener。相反,使其实现ActionListener接口,并且按钮操作的代码应该可以工作。但是在将来,最好添加逻辑来检测触发该操作的组件。
答案 3 :(得分:-1)
我不知道,但是你怎么写这个:
Document()
您的对象(这是一个JFrame),您应该首先添加“ implements ActionListener”,或创建一个单独的实现...
下一个错误,您要做:
calc.addActionListener((ActionListener) this);
GUI扩展了JFrame,它是一个JFrame,您不能在另一个JFrame中添加一个JFrame!
我测试了添加的“ implements ActionListener”,它可以运行,但是仍然存在一些错误;) 复制/粘贴需要智慧,哼哼^^
编辑
此代码不是完美的(而且很丑陋),但适用于您的示例:
GUI one = new GUI();
frame.getContentPane().add(one);