代码执行中的表观不一致

时间:2014-11-08 06:14:47

标签: java boolean return listener

我有一个Edit按钮,用于控制Changebutton的操作。

当Editbutton为true时,Changebutton应该转到Edit,当它不为true时,它应该去查看。

问题是Editbutton没有一致地执行。

第一次加载代码时,编辑按钮将在true和false之间切换。但是,如果我按下Change按钮,Edit按钮将不再在true和false之间切换,但会在一次迭代中变为true然后变为false。第三次按预期执行,这个交替循环继续。

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

以下是我的代码的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);
 }

}

1 个答案:

答案 0 :(得分:1)

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

在我调用它之后,它有一个监听器切换编辑模式(或者按钮应该做的任何事情)。

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

如果我再次打电话,它有三个听众。如果单击该按钮,则会切换编辑模式三次。等等。

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

此外,通常的Java约定是使用小写字母开始方法名称 - 但是,这只是一个样式问题,并且不会阻止程序运行,因此如果需要,请更改它。

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