难以在java中启动我的miniproject数据包跟踪器

时间:2017-02-19 03:43:56

标签: java swing jbutton changelistener

我是java的初学者,我正在尝试在java中创建数据包跟踪器,现在我正在使用eclipse启动GUI。我正在尝试更改我的按钮名称开始重新启动并恢复暂停动作监听器我不知道如何更改按钮的名称任何人都可以帮助我吗? 我的代码是

Jbutton btnResume = new Jbutton("Resume");
brnResume.addChangeListener(new ChangeListener(){
public void stateChanged(ChangeEvent arg0){
JButton btnResume = new Jbutton("Pause");
}}

它无法帮助我使用这种方法

1 个答案:

答案 0 :(得分:2)

您尝试创建一个具有相同名称的新变量,并假设这将更改原始变量引用的对象。这意味着您对哪些对象以及引用变量的工作方式感到困惑。了解原始btnResume变量引用JButton对象,并且此对象可能显示在GUI中。在ChangeListener中(我们不确定它是如何被调用的,或者即使它被调用),您正在创建一个新的JButton对象,并将其分配给一个新的局部变量。请注意,这个新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