你想创建与假设这会改变对象的原始变量是指同一名称的新变量至。这意味着你对什么对象以及参考变量是如何工作感到困惑。理解原始的btnResume变量引用了JButton对象,并且该对象可能显示在GUI中。在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");
}
}
我自己,我会考虑不同的事情:一个新的动作,一个不仅展示了“暂停”文本交换JButton的行动,但还保持着暂停行为。
请注意,要获得更完整的帮助,请考虑在您的问题中创建并发布有效的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);
关于:
我试过第一个,它显示出将按钮更改为最后改变之后的按钮,然后当我把光标移动到按钮,它正在改变。我希望它改变了当我点击它的名字为什么不这样做
你已经有了一个ChangeListener内变化码,并且这个监听器不响应按钮按下。相反,如果您想响应按钮按钮,请使用带有addActionListener(...)
的ActionListeners或带有setAction(...)
的AbstractAction(如上所示)。
最重要的是,请阅读Swing教程,因为您似乎在做很多猜测,而这只会导致挫败感。这些教程非常全面,并且有很好的代码示例。您可以在此找到指向Swing教程和其他Swing资源的链接:Swing Info。
JButton中的B应该大写。否则将会出现语法错误。 – krock
要获得更完整的帮助,请考虑创建并发布有效的[mcve]。 –
请看[为什么“有人可以帮我吗?“不是一个实际的问题?](http://meta.stackoverflow.com/q/284236) – EJoshuaS