计数点击按钮

时间:2014-05-24 22:35:38

标签: java swing jbutton actionlistener

我想问一下哪个函数或其他函数必须写入,这样每次按下“开始”按钮(函数:addbutton),另一个按钮退出(函数:addButton2)将其标题更改为我按下的次数开始?

class DroppingFrame extends JFrame   {
  public DroppingFrame() {  
    int clicked=0;
    String b="a";
    setSize(1400, 700);
    setTitle("Dropping");

    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    });
    Container contentPane = getContentPane();
    canvas = new JPanel();
    contentPane.add(canvas, "Center");
    JPanel p = new JPanel();

    addButton(p, "Drop ball", clicked, new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        //addButton.setText(String.valueOf(++clicked));

        Ball b = new Ball(canvas);
        // if(b== new Ball(canvas)){
        // clicked++;
        // }
        b.start();    
      }  
    });

    addButton2(p, b, clicked, new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        canvas.setVisible(false);
        System.exit(0);
      }
    });

    contentPane.add(p, "South");
  }

  public void addButton(Container c, String title, int i, ActionListener a) {
    //i++;
    //title = Integer.toString(i);
    JButton b = new JButton(title);
    c.add(b);
    b.addActionListener(a);
  }

  public void addButton2(Container c, String title, int i, ActionListener a ) {
    i++;
    title = Integer.toString(i);
    JButton b = new JButton(title);
    c.add(b);
    b.addActionListener(a);
  }

  private JPanel canvas;
}

3 个答案:

答案 0 :(得分:1)

需要引用第二个按钮,以便启动按钮可以更新其文本。

保持简单:

  • 使用setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);而不是添加WindowListener来关闭窗口。

  • 使用JFrame#dispose以编程方式关闭JFrame。

  • 赞成组合而不是继承这意味着如果你没有覆盖现有类的任何逻辑/实现,那么就不要扩展它。

  • 创建单独的方法来添加每个组件没有任何意义。要么使方法通用,要么只是删除它。

示例代码:

public class DroppingFrame {    
    private int clicked = 0;
    public DroppingFrame() {
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Container contentPane = frame.getContentPane();
        JPanel p = new JPanel();

        final JButton btn2 = new JButton(String.valueOf(clicked));
        btn2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                frame.dispose();
            }
        });

        JButton btn1 = new JButton("Drop ball");
        btn1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                btn2.setText(String.valueOf(++clicked));
            }
        });

        p.add(btn1);
        p.add(btn2);
        contentPane.add(p, BorderLayout.SOUTH);
        frame.setVisible(true);
    }    
}

答案 1 :(得分:1)

我的偏好是:

  1. 使clicked成为一个类字段 - 这样你就可以访问它并在事件处理程序中改变它
  2. 为按钮创建类字段
  3. 重构addButton方法,因此只有其中一个方法 - 这使您的代码更加整洁:
  4. 更改方法返回类型以返回创建的按钮,然后您决定是否将其存储在调用者中。这只是闻起来更好。
  5. 代码如下:

    class DroppingFrame extends JFrame {
        final JPanel canvas = new JPanel();
        JButton button2;
        int clicked = 0;
        public DroppingFrame() {
            setSize(1400, 700);
            setTitle("Dropping");
    
            addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
            Container contentPane = getContentPane();
            contentPane.add(canvas, "Center");
            JPanel p = new JPanel();
    
            addButton(p, "Drop ball", clicked, new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    Ball b = new Ball(canvas);
                    b.start();
                    button2.setText(String.valueOf(++clicked));
                }  
            });
    
            button2 = addButton(p, String.valueOf(clicked), clicked, new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    canvas.setVisible(false);
                    System.exit(0);
                }
            });
    
            contentPane.add(p, "South");
        }
    
        public JButton addButton(Container c, String title, int i, ActionListener a) {
            JButton b = new JButton(title);
            c.add(b);
            b.addActionListener(a);
            return b;
        }
    }
    

答案 2 :(得分:0)

这不正确.. addButton总是创建一个新按钮,它的引用会丢失..你应该把它放在类范围内。

所以创建一个类变量:

JButton button = new JButton();

更改您的功能:

public void addButton(Container c, String title, int i, ActionListener a) {
  button.setText(title);
  c.add(button);
   button.addActionListener(a);
 }

还可以更改actionPerformed override:

public void actionPerformed(ActionEvent evt) {
    button.setText(String.valueOf(++clicked));
    ....
});