2011-04-03 38 views
2

纯粹的初学者问题在这里。 我正在修改代码,现在我坚持下列问题;Java Swing;两个类,如果陈述和新的行动听众在哪里?

我的计时器在上层被调用。但是我的int count正在被调用在下面的类中。

每当我添加一个if语句像;

if (count == 2) { t.stop();} 

我得到的错误,因为int在下面的类和上面的类中的t(计时器)。

  1. 如何在涉及两个类时添加if语句?

  2. 如果我想添加一个新的actionlistener按钮来停止计数, 是否我把这个放在上面或下面的类中?

Code here

在此先感谢

+0

另外,'JPanel'的默认布局是'FlowLayout'。 – trashgod 2011-04-03 10:19:54

回答

8

由于ClockListenernested class(下),封闭实例(上)可以访问侦听器的私有字段。如果你有一个参考的ClockListener一个实例,

ClockListener cl = new ClockListener(); 

,你可以用它来初始化定时器

Timer t = new Timer(1000, cl); 

,您可以在您的测试中使用它:

if (cl.count == 2) { t.stop(); } 

补遗:作为参考,这是您的程序的一个变体,它使用JToggleButton来控制计时器。如建议earlier,您曾使用Calendar来最小化Timer漂移。和你一样,我放弃了在低分辨率应用中无关的方法。

import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.ItemEvent; 
import java.awt.event.ItemListener; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.JToggleButton; 
import javax.swing.Timer; 

/** @see https://stackoverflow.com/questions/5528939*/ 
class ClockExample extends JFrame { 

    private static final int N = 60; 
    private static final String stop = "Stop"; 
    private static final String start = "Start"; 
    private final ClockListener cl = new ClockListener(); 
    private final Timer t = new Timer(1000, cl); 
    private final JTextField tf = new JTextField(3); 

    public ClockExample() { 
     t.setInitialDelay(0); 

     JPanel panel = new JPanel(); 
     tf.setHorizontalAlignment(JTextField.RIGHT); 
     tf.setEditable(false); 
     panel.add(tf); 
     final JToggleButton b = new JToggleButton(stop); 
     b.addItemListener(new ItemListener() { 

      @Override 
      public void itemStateChanged(ItemEvent e) { 
       if (b.isSelected()) { 
        t.stop(); 
        b.setText(start); 
       } else { 
        t.start(); 
        b.setText(stop); 
       } 
      } 
     }); 
     panel.add(b); 

     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.add(panel); 
     this.setTitle("Timer"); 
     this.pack(); 
     this.setLocationRelativeTo(null); 
     this.setVisible(true); 
    } 

    public void start() { 
     t.start(); 
    } 

    private class ClockListener implements ActionListener { 

     private int count; 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      count %= N; 
      tf.setText(String.valueOf(count)); 
      count++; 
     } 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       ClockExample clock = new ClockExample(); 
       clock.start(); 
      } 
     }); 
    } 
} 
+0

作为参考,我已经包括了您的术语'lower'和'upper',但[正确的](http://download.oracle.com/javase/tutorial/java/javaOO/nested.html)是'inner '(对于你的非静态嵌套'ClockListener')和'enclosing'(对于你的外部'JFrame')。 – trashgod 2011-04-03 10:49:51

+0

谢谢你我的坏! – Opoe 2011-04-03 10:57:30

+0

完全没有;这个术语可能是模糊的。我已经添加了一个指向该教程的链接。 – trashgod 2011-04-03 11:09:35

1

其范围分辨率。使t公开(不可取)或在第二个类中创建另一个计时器,当您调用它时将通过第二个类的构造器。它会引用原来的计时器。