我是一个java的初学者,我正在尝试用java创建packet tracer,现在我正在用eclipse启动GUI。我正在尝试更改我的按钮名称开始重新启动和恢复暂停在行动侦听程序我不知道如何更改按钮的名称谁能帮助我?我的代码是
Jbutton btnResume = new Jbutton("Resume");
brnResume.addChangeListener(new ChangeListener(){
public void stateChanged(ChangeEvent arg0){
JButton btnResume = new Jbutton("Pause");
}}它不起作用帮我用这个方法
发布于 2017-02-19 11:48:30
您正在尝试创建一个同名的新变量,并假设这将更改原始变量所引用的对象。这意味着您对对象是什么以及引用变量是如何工作的感到困惑。请理解,原始的btnResume变量引用的是一个JButton对象,该对象很可能显示在图形用户界面中。在ChangeListener中(我们不确定它是如何调用的,甚至不确定它是否被调用),您正在创建一个新的JButton对象,并将其赋给一个新的局部变量。请注意,这个新的JButton与当前显示的不同,因此设置新按钮的文本不会对显示的JButton产生任何影响。
相反,您可能希望使用原始变量,希望它在ChangeListener代码的作用域内,并且希望仍然引用相同的JButton对象,并在原始对象上调用setText(...)。类似于:
Jbutton btnResume = new JButton("Resume");
brnResume.addChangeListener(new ChangeListener(){
public void stateChanged(ChangeEvent arg0){
// JButton btnResume = new Jbutton("Pause");
btnResume.setText("Pause");
}
}就我自己而言,我会考虑不同的做法:用一个新的Action替换JButton的Action,这个Action不仅显示" pause“文本,而且还保持pause行为。
请注意,要获得更好、更完整的帮助,请考虑创建一个有效的Minimal, Complete, and Verifiable example程序并将其与您的问题一起发布。
例如:
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.*;
@SuppressWarnings("serial")
public class SwapActions extends JPanel {
private Action resumeAction = new ResumeAction("Resume", KeyEvent.VK_R);
private Action pauseAction = new PauseAction("Pause", KeyEvent.VK_P);
private JButton resumePauseBtn = new JButton(resumeAction);
public SwapActions() {
setPreferredSize(new Dimension(400, 300));
add(resumePauseBtn);
}
private class ResumeAction extends AbstractAction {
public ResumeAction(String name, int mnemonic) {
super(name);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO resume code here
// **** swap Actions here! ****
((AbstractButton) e.getSource()).setAction(pauseAction);
}
}
private class PauseAction extends AbstractAction {
public PauseAction(String name, int mnemonic) {
super(name);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO pause code here
// **** swap Actions here! ****
((AbstractButton) e.getSource()).setAction(resumeAction);
}
}
private static void createAndShowGui() {
SwapActions mainPanel = new SwapActions();
JFrame frame = new JFrame("Swap Actions");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}在AbstractActions中,我用下面这一行替换了源(这里是JButton)的操作:
((AbstractButton) e.getSource()).setAction(resumeAction);关于:
我尝试了第一个按钮,它显示在更改按钮后将按钮更改为最终,然后当我将光标放在按钮上时,它正在更改名称.i当我单击它时,它想要更改它,为什么它不这样做
您已经在ChangeListener中获得了更改代码,并且此侦听器不会响应按钮按下。相反,如果您想对按钮按下做出响应,请使用带有addActionListener(...)的ActionListeners或带有setAction(...)的AbstractAction (如上所示)。
最重要的是,请阅读Swing教程,因为您似乎正在进行大量的猜测,而这只会导致挫折。这些教程非常全面,并且对像样的代码示例很有帮助。您可以在这里找到Swing教程和其他Swing资源的链接:Swing Info。
https://stackoverflow.com/questions/42323399
复制相似问题