1

我正在设计一个倒数计时器,并在这里找到了一个。这个效果很好……你输入秒数,它会自动为你倒计时。我修改代码以侦听单选按钮选择以设置开始时间。单击“开始”按钮时将开始倒计时。我已经完成了布局,但是在将 ButtonListener 放置在下面的代码中时遇到了问题。

我的用户界面

开始使用嵌套类,所以有些概念对我来说有点模糊。下面,如果我理解正确,那ActionEvent是倒计时,它位于ActionListenerclassk 内部,它捕获按钮单击。倒计时依赖于并且不能独立于按钮单击运行,并且Listener类中的所有变量也可用于Event该类。

所以我在想,如果我想为单选按钮添加一个Listenerand ,那些将封装,它将封装下面的代码。我已经标记了我认为他们应该去哪里的类声明,但没有标记结束括号。我需要做一些更仔细的分析来弄清楚它们是如何工作的。这是做事的正确方法吗?或者,还有更好的方法?如果我在 radiobuttion 中将我的 startTime 变量声明为 publicEventListenerActionevent,它应该遵循其他嵌套类,对吗?

我是否正确理解了这一切?还是我错过了一些重要的观点。这是我的第一个内部类项目,所以请温柔。:)

  public Test() {
    super("Countdown timer");
    final String startTime = "10"
    text = new JTextField(startTime, 18);
    start = new JButton("Start");
    pr = new JRadioButton("30");
    sr = new JRadioButton("15");
    lr = new JRadioButton("5");
        JPanel radioPanel = new JPanel(new GridLayout(0, 1));
        radioPanel.add(pr);
        radioPanel.add(sr);
              radioPanel.add(lr);

//new button action listener here {
     // new button action event here {   

    start.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent click) {
        final long current = System.currentTimeMillis();
        try {
          final long limit = Integer.parseInt(text.getText().trim())* 1000; // X seconds
          timer = new Timer(1000, new ActionListener() {
            public void actionPerformed(ActionEvent event) {
              long time = System.currentTimeMillis();
              long passed = time - current;
              long remaining = limit - passed;
              if(remaining <= 0) {
                text.setText(startTime);
                timer.stop();
              } else {
                long seconds = remaining/1000;
                long minutes = seconds/60;
                long hours = minutes/60;
                text.setText(String.format("%02d:%02d:%02d remaining", hours, minutes, seconds%60));
              }
            }
            });
          timer.start();
        } catch(NumberFormatException nfe) {
          // debug/report here
          nfe.printStackTrace();
        }
      }});
    JPanel panel = new JPanel();
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
    panel.add(radioPanel);
    panel.add(text);
    panel.add(start, BorderLayout.CENTER );
    add(panel);
  }
4

1 回答 1

1

您的代码没有定义任何典型的内部(=嵌套)类。您正在使用Anonymous (inner) Classes。您可能对这个 SO 问题感兴趣:

Java 中如何使用匿名(内部)类?

有关真正的内部(=嵌套)类的信息,请尝试Oracle 的Java 教程的相关部分。请注意,有两种内部类,静态和非静态,在 SO 的以下问题中讨论:

Java内部类和静态嵌套类

于 2013-04-13T09:04:14.510 回答