我想编写一个简单的路口交通信号灯系统。我要创建一个将启动整个程序的按钮(打开交通灯系统的GUI)。但是我的第一个按钮已经开始出现问题。它不会显示其文本,并且应该执行的操作不会发生。我真的是一个初学者,所以可能有点愚蠢和明显的错误,但是请看看我会很高兴^^
package kreuzung;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.JFrame;
public class HomeFrame extends JFrame{
public HomeFrame(String title) {
super(title);
this.setLayout(new FlowLayout(FlowLayout.CENTER));
Button test = new Button("noAction");
Container cont = getContentPane();
cont.add(test, BorderLayout.CENTER);
}
}
这将是生成的按钮,它不会执行应有的操作
package kreuzung;
import javax.swing.Action;
import javax.swing.JButton;
public class Button extends JButton{
private String actionName;
public Button(String actionName) {
this.actionName = actionName; //set the Action name of this button
JButton button = new JButton(); //instantiate this Button
button.setText(actionName); //set the Action Name as Button Text
button.setSize(30, 30);
button.setBounds(5, 5, 25, 25);
button.addActionListener(new Evt(this.actionName)); //add an Action Listener to the button
//and gets the Action from the Evt Class
}
}
最后但同样重要的是Evt类,应注意执行的动作
package kreuzung;
import java.awt.event.*;
import javax.swing.JFrame;
public class Evt implements ActionListener {
private String actionName;
public Evt(String actName) {
this.actionName = actName;
}
@Override
public void actionPerformed(ActionEvent e) {
switch(actionName) {
case "noAction":
JFrame frame = new HomeFrame("Home");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 400);
frame.setVisible(true);
break;
}
}
}
答案 0 :(得分:2)
您的代码中有几个错误:
JFrame
,请参阅Extends JFrame vs. creating it inside the program setBounds(...)
,Layout Managers将负责放置组件{}
之前/之后不要留太多多余的空间Button
作为类名来调用,它可能会与java.awt.Button
类混淆。它不显示其文本,并且应该执行的操作不会发生
在本课程中:
public class Button extends JButton {
private String actionName;
public Button(String actionName) {
this.actionName = actionName;
JButton button = new JButton();
button.setText(actionName);
button.setSize(30, 30);
button.setBounds(5, 5, 25, 25);
button.addActionListener(new Evt(this.actionName));
}
}
您从JButton
开始,然后在其中创建了JButton
!因此,您有2个JButtons
,一个是类的(继承的),另一个是您在其中创建的。但是,您要将文本设置为在内部创建的文本,但是将另一文本(无文本)添加到JFrame
中。
在一个比喻中,它就像:
您无需在当前程序中扩展JButton
,只需创建一个新的JButton
实例即可。
否则,如果您确实要使用自定义JButton
类,请执行以下操作:
public class MyCustomButton extends JButton { // Change class name
private String actionName;
public MyCustomButton(String actionName) {
super(actionName); //Sets the text
this.actionName = actionName;
button.addActionListener(new Evt(this.actionName));
}
}
答案 1 :(得分:0)
您唯一真正缺少的是在HomeFrame
构造函数中调用setVisible(true)。这实际上是启动UI事件线程并显示您的组件的方法。但是,您可能还应该调用pack(),以便您的框架不会仅显示框架装饰。代码:
public class HomeFrame extends JFrame {
public HomeFrame(String title) {
super(title);
this.setLayout(new FlowLayout(FlowLayout.CENTER));
Button test = new Button("noAction");
Container cont = getContentPane();
cont.add(test, BorderLayout.CENTER);
pack(); /* Optional */
setVisible(true); /* Critical */
}
}
有几种方法可以使此UI代码现代化,但这至少应使其显示出来。
答案 2 :(得分:-1)
由于您没有向其添加任何特定属性,因此您实际上不需要创建JButton的子类。 相反,您应该能够以这种方式使其工作:
public class HomeFrame extends JFrame{
private static final String BUTTON_ACTION_NAME = "myActionName";
public HomeFrame(String title) {
super(title);
this.setLayout(new FlowLayout(FlowLayout.CENTER));
JButton test = new JButton();
test.setText(BUTTON_ACTION_NAME);
test.setSize(30, 30);
test.setBounds(5, 5, 25, 25);
test.addActionListener(new Evt(BUTTON_ACTION_NAME));
Container cont = getContentPane();
cont.add(test, BorderLayout.CENTER);
}
}