簡體   English   中英

有了這個Java代碼示例,我是否對內部類有基本的了解?

[英]Given this Java code sample, do I have a rudimentary understanding of inner classes?

我正在設計一個倒數計時器, 在這里找到了一個。 這很有效...您輸入秒數,它會自動為您倒數。 我修改代碼以偵聽單選按鈕的選擇以設置開始時間。 當點擊“開始”按鈕時,倒數開始。 我已經解決了布局問題,但是在將ButtonListener放入下面的代碼時遇到了麻煩。

我的UI

只是開始使用嵌套類,所以某些概念對我來說有點模糊。 在下面,如果我理解正確,則ActionEvent是倒數計時,位於ActionListener類內部,該類捕獲按鈕的單擊。 倒數取決於並且不能獨立於按鈕單擊而運行,並且Listener類中的所有變量ALSO也可用於Event類。

所以我在想,如果我想為單選按鈕添加一個ListenerEvent ,則這些Listener將封裝Action ,該封裝以下代碼。 我已經在類聲明中標記了我認為應該去的地方,但沒有在結尾處注明。 我需要做一些更仔細的分析,以確定它們是如何工作的。 那是做事的正確方法嗎? 或者,還有更好的方法? 如果我在radiobuttion event中將startTime變量聲明為public,那么它應該繼續執行其他嵌套類,對嗎?

我是否正確理解所有這些內容? 還是我缺少一些要點。 這是我關於內部類的第一個項目,請保持溫柔。 :)

  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);
  }

在該詞的典型意義上,您的代碼未定義任何內部(=嵌套)類。 您正在使用匿名(內部)類 您可能對此SO問題感興趣:

Java中如何使用匿名(內部)類?

有關真正的內部(嵌套)類的信息,請嘗試Oracle Java教程相關部分 請注意,有兩種內部類,靜態的和非靜態的,將在以下關於SO的問題中進行討論:

Java內部類和靜態嵌套類

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM