您好我正在处理一个项目,我在添加JButton时遇到了问题。出于某种原因,它不会打印它的名字。
这个类应该添加自定义按钮
import java.awt.*;
import javax.swing.JPanel;
public class FightPanel extends JPanel {
public static final int WIDTH = 600;
public static final int HEIGHT = 600;
public FightPanel() {
setPreferredSize(new Dimension(WIDTH, HEIGHT));
setLayout(new BorderLayout());
FightButton test = new FightButton("test");
add(test);
}
}
此类是自定义按钮类
import javax.swing.JButton;
public class FightButton extends JButton {
private String name;
public FightButton(String name) {
this.name = name;
setName(name);
}
}
答案 0 :(得分:3)
您所做的只是设置新类的非显示属性,并保持原始父类的名称状态不变。解决方案:使用超级构造函数来帮助您:
public FightButton(String name) {
super(name);
}
事实上,你的FlightButton确实没有必要有一个名字字段,因为所有这一切都影响了JButton的名字字段。事实上,如果这是你添加到FlightButton的全部内容,我将摆脱这个类并简单地使用JButton对象。我自己,这就是我通常做的事情 - 使用普通的香草JButtons, 但是 使用自定义的AbstractActions,我觉得这可能是你应该去的地方。
修改强>
您在评论中说明:
谢谢你我现在知道你必须使用超级构造函数来做到这一点。
您不必这样做,因为您也可以使用setter方法等,但如果您希望构造函数的行为类似于JButton的类似构造函数,那么最好使用父级' s构造函数。
编辑2
例如:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.*;
public class FightPanel extends JPanel {
public static final int FP_WIDTH = 600;
public static final int FP_HEIGHT = 600;
public FightPanel() {
setLayout(new BorderLayout());
JButton test = new JButton(new FightAction("Test", KeyEvent.VK_T));
add(test);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(FP_WIDTH, FP_HEIGHT);
}
private static void createAndShowGui() {
FightPanel mainPanel = new FightPanel();
JFrame frame = new JFrame("FightPanel");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
class FightAction extends AbstractAction {
public FightAction(String name, int mnemonic) {
super(name);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e.getActionCommand() + " pressed!");
}
}
答案 1 :(得分:3)
setName()
方法不控制按钮上显示的文本。它基本上只是由应用程序代码用来标识组件。
setText(...)
用于设置按钮中显示的文字。
现在知道你必须使用超级构造函数来做到这一点。
您不必这样做,但这是最简单的方法,因为您将文本作为参数传递给您的班级。
如果要在创建组件后更改文本,则可以使用setText()
方法。