【问题标题】:How to disable all but one button in a JPanel and enable them one after the other如何禁用JPanel中除一个按钮之外的所有按钮并一个接一个地启用它们
【发布时间】:2016-10-01 15:27:50
【问题描述】:

我创建了一个带有 11 个按钮(全部在一个数组中)的 JPanel。现在我在这些按钮上设置了 actionListeners,但我希望最初只启用一个按钮,然后在其上的 actionListener 完成后,启用下一个按钮。这是我的代码!

public class Beginner extends JPanel {

    static JButton quest;
    Random rand = new Random();

    int n = 10;

    static List <Point> points = new ArrayList<Point> ();

    Quest1 q1;
    Quest2 q2;
    Quest3 q3;
    Quest4 q4;
    Quest5 q5;
    Quest6 q6;
    Quest7 q7;
    Quest8 q8;
    Quest9 q9;
    Quest10 q10;
    Quest11 q11;

    public Beginner() {

        int radius = 200;
        Point center = new Point (250, 250);

        double angle = Math.toRadians(360 / n);      
        points.add(center);
        for (int i = 0; i < n; i++) {
            double theta = i * angle;

            int dx = (int) (radius * Math.sin(theta));    
            int dy = (int) (radius * Math.cos(theta));
            Point p = new Point (center.x + dx , center.y + dy);
            points.add(p);
        }
        draw (points);
    }

    public void draw (List<Point> points) {
        JPanel panels = new JPanel();
        SpringLayout spring = new SpringLayout();
        int count = 1;
        for (Point point: points) {
            quest = new JButton("Question " + count);
            quest.setForeground(Color.BLACK);
            Font fonte = new Font("Script MT Bold", Font.PLAIN, 20);
            quest.setFont(fonte);
            add (quest);
            count++;
            spring.putConstraint(SpringLayout.WEST, quest, point.x, SpringLayout.WEST, panels );

            spring.putConstraint(SpringLayout.NORTH, quest, point.y, SpringLayout.NORTH, panels );
            setLayout(spring);
            panels.setOpaque(false);
            panels.setVisible(true);
            panels.setLocation(5,5);
            add(panels);
            //I want to disable all but one button at this point

            quest.addActionListener (new ActionListener() {
                public void actionPerformed (ActionEvent p) {
                    if (point.equals(points.get(0))) {
                        q1 = new Quest1();
                        //then, enable the next after this is completed
                    }   
                    else if (point.equals(points.get(1))) {
                        q2 = new Quest2();
                        //same comment in Quest1 follows....and so on!
                    }
                    else if (point.equals(points.get(2))) {
                        q3 = new Quest3();
                    }
                    else if (point.equals(points.get(3))) {
                        q4 =  new Quest4();
                    }
                    else if (point.equals(points.get(4))) {
                        q5 = new Quest5();
                    }
                    else if (point.equals(points.get(5))) {
                        q6 = new Quest6();
                    }  
                    else if (point.equals(points.get(6))) {
                        q7 = new Quest7();
                    }  
                    else if (point.equals(points.get(7))) {
                        q8 = new Quest8();
                    }  
                    else if (point.equals(points.get(8))) {
                        q9 = new Quest9 () ;
                    }
                    else if (point.equals(points.get(9))) {
                        q10 = new Quest10() ;
                    }
                    else if (point.equals(points.get(10))) {
                        q11 =  new Quest11 ();
                    }
                } 
            });
        }
    }
}

【问题讨论】:

  • 您上面的代码与您的问题无关,我建议您尝试帮助我们帮助您。我建议您重新开始并简化——创建并发布minimal reproducible example,您可以在其中创建一个非常简单的程序,该程序包含一个包含几个按钮的 GUI,您尝试解决主要问题,然后告诉我们您遇到了什么问题'正在使用此代码。请尽可能具体和描述性。
  • 你应该考虑重新做上面的代码,因为它包含很多不需要的冗余,你有很多行代码似乎都在做完全相同的事情,以及一堆 Quest 对象如果将它们放在一个 ArrayList 或数组中,看起来会更快乐。
  • 另外,ActionListeners 应该几乎立即运行,因此您的请求(没有更多细节)实际上没有意义,除非您希望按钮按顺序启用。请澄清。
  • 也许你明白了.....我希望它们按顺序启用,比如先启用一个,然后再启用第二个,这就是我要说的!我只是想让你们了解全貌!
  • 使用逻辑一致的缩进代码行和块的形式。缩进是为了让代码的流程更容易理解!

标签: java arrays swing if-statement point


【解决方案1】:

如果您想按顺序启用按钮,我会使用至少两个字段,一个填充您的按钮的ArrayList&lt;JButton&gt;,以及一个int buttonListIndex int 索引字段来告诉程序哪个按钮处于活动状态。您可以通过setEnabled(true) 启用和禁用按钮。在 ActionListener 中,增加索引 int 并使用 for 循环遍历所有按钮,禁用除与索引对应的按钮之外的所有按钮。我将把代码实现留给你。

【讨论】:

  • 如果这是语法...我会更喜欢它!我的按钮已经是数组列表的一部分。
  • @Presh_K7:不要欺骗自己失去编码的机会。请先尝试自己执行此操作。再次在您最初的问题中,我什至还没有看到任何尝试。如果您在尝试中遇到困难,请将其作为编辑发布在您的问题中,我将与您合作。
  • 好的!如何创建 int buttonListIndex 来告诉程序哪个按钮处于活动状态......我很困惑!
  • 如何创建任何 int 变量?然后在需要时增加它。
  • 请在此链接上查看我的问题!....我需要你的帮助@stackoverflow.com/questions/39806053/…
猜你喜欢
  • 2022-12-20
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 2022-09-27
  • 1970-01-01
  • 2012-08-16
  • 1970-01-01
相关资源
最近更新 更多