你想創建與假設這會改變對象的原始變量是指同一名稱的新變量至。這意味着你對什麼對象以及參考變量是如何工作感到困惑。理解原始的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