【问题标题】:Apparent inconsistency in execution of code代码执行明显不一致
【发布时间】:2015-01-05 00:30:43
【问题描述】:

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

当 Editbutton 为 true 时,Changebutton 应该转到 Edit,当它不是 true 时应该转到 view。

问题是 Editbutton 没有始终如一地执行。

第一次加载代码时,Editbutton 将在 true 和 false 之间切换,这是应该的。但是,如果我按下 Changebutton,Editbutton 将不再在 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);
 }

}

【问题讨论】:

  • 不,不太可编译。 Customers 是什么?
  • "但是,如果我按下Changebutton,Editbutton 将不再在true 和false 之间切换,而是在一次迭代中进入true 和false" 为什么你认为buttonEdit 的listener 应该在什么时候被调用你按下了ChangeButton?
  • @almasshaikh 不应调用 buttonEdit 的侦听器,但由于某种原因,按下 Changebutton 时 buttonEdit 的行为会发生变化

标签: java boolean return listener


【解决方案1】:

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

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

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

如果我再次调用它,它有三个听众。如果我单击该按钮,它将切换编辑模式三次。以此类推。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 2017-01-18
    相关资源
    最近更新 更多