java - 代码执行明显不一致

标签 java boolean return listener

我有一个编辑按钮,它控制更改按钮的操作。

当“编辑”按钮为 true 时,“更改”按钮应转到“编辑”,当它不为 true 时,应转到“查看”。

问题是“编辑”按钮执行不一致。

第一次加载代码时,编辑按钮将在 true 和 false 之间切换,正如它应该的那样。但是,如果我按下 Change 按钮,Edit 按钮将不再在 true 和 false 之间切换,而是会在一次迭代中先变为 true,然后变为 false。第三次它将按预期执行,并继续此交替循环。

我在 Editbutton 的监听器中使用 return 语句,该语句应该在 if 语句之后停止代码。我添加了数字来跟踪正在执行的内容,似乎代码第二次执行超过返回语句时,例如没有停止。要么是这样,要么是由于某种原因,代码第二次重新加载。

下面是我的代码的 MCVE 版本:

public class Toolbar {

    static Color c;
    static JButton buttonEdit = new JButton("Edit");
    public static JFrame frame = new JFrame();
    static boolean Edit, Delete;


    public static void main(String[] args) {
        Toolbar.WorkDiaryAllGui();
        System.out.println("TOOLBAR");
    }

    public static JPanel Toolbar(String panelname){

        FlowLayout layout = new FlowLayout();

        JPanel Toolbar = new JPanel(new BorderLayout());
        Toolbar.setLayout(layout);

        JButton Changebutton = new JButton("Diary");    
        Changebutton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                WorkDiaryAllGui();

            }
        });




        buttonEdit.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                if(Edit==false){
                Edit = true;
                buttonEdit.setBackground(Color.CYAN);
                System.out.println(1);
                return; 
                }


                if(Edit==true){
                Edit = false;
                buttonEdit.setBackground(c);
                System.out.println(2);
                return; 
                }


            }
        });

        Toolbar.add(Changebutton);
        Toolbar.add(buttonEdit);

        return Toolbar;

    }

    public static void WorkDiaryAllGui(){

        JPanel WorkDiaryAll = new JPanel();

        WorkDiaryAll.add(Toolbar.Toolbar("Whole Diary"));

        frameGui(WorkDiaryAll, "Whole Diary");
    }

    public static void frameGui(JPanel panel, String name){

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setContentPane(panel);

        frame.setSize(1200,500);

        frame.setVisible(true);
 }

}

最佳答案

每次调用 Toolbar 时,您都会向按钮添加另一个监听器。

在我调用它一次之后,它有一个监听器,可以切换编辑模式(或按钮应该执行的任何操作)。

如果我再次调用它,它会返回一个新的 JPanel,其中包含与之前相同的按钮,它现在有两个用于切换编辑模式的监听器。当我单击该按钮时,它会切换编辑模式两次。

如果我再次调用它,它有三个监听器。如果我单击该按钮,它会切换编辑模式三次。等等。

我建议让 Toolbar (该方法)在每次调用时创建全新的 GUI 对象。如果您这样做,Toolbar(类)应该不需要任何字段(至少在您问题的代码版本中)。

此外,通常的 Java 约定是以小写字母开头的方法名称 - 然而,这只是一个样式问题,并不会阻止您的程序运行,因此如果您愿意,请更改它。

更严重的样式问题(但仍然只影响代码的可读性,而不影响代码是否有效) - 方法名称应该描述它们的作用。 Toolbar 是工具栏吗?我不认为它是工具栏,所以它不应该被命名为Toolbar。 (同样,WorkDiaryAllGui 并不支持所有 GUI 的日记,并且 frameGui 也不支持 GUI)。如果您需要其他样式提示,请考虑将您的代码(一旦有效)发布到 https://codereview.stackexchange.com/ .

关于java - 代码执行明显不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26814399/

相关文章:

java - 将特定的 Java 枚举和类移植到 C#

java - 首次尝试使用链接参数失败的 Facebook 发布

java - 函数返回空(范围问题)

c# - boolean 值作为方法参数不改变状态

javascript - 为什么在此示例中处理我的字符串时会得到额外的 ', '?

java - 无法访问实体类中的字段

java - 我如何才能从任何类访问这个数组?

c# - 如何使用 if 语句返回此变量?

Jquery every - 停止循环并返回对象

javascript - 使用类而不是使用抛出对象作为返回值的函数有什么优点?