2009-12-07 47 views
2

我正在製作一個顯示圖形和操縱圖形的用戶界面。該類擴展JFrame實現的ActionListener。 ActionListener然後調用不同的類來根據動作操縱圖形。這有效,而類有幾個ActionListeners;然而,現在這個班正變得難以管理。Java架構 - 關於ActionListener約定的問題

我知道爲了封裝的利益,最好在用戶界面類中包含ActionListener,因爲它需要訪問接口的非靜態組件。但是,封裝和可讀性之間似乎存在衝突。

我所提議的是將類分成一個接口類,另一個接口是ActionListener,靜態訪問接口組件。我想知道的是這是否遵循基本的設計慣例?而且,如果這是一個可接受的方法,你會把主類放在用戶界面類或ActionListener類中嗎?

回答

6

Not a duplicate question... but my answer should help with your question

簡而言之,我的首選是讓JFrame類不實現ActionListener,然後使用實現ActionListener的JFrame實現一些命名的內部類。

我會把主要的東西放在一個類中......並稱之爲Main。

這裏是路的一些示例代碼,我喜歡這樣做:

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 


public class Main 
{ 
    private Main() 
    { 
    } 

    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    private static void createAndShowGUI() 
    { 
     final FooFrame frame; 

     frame = new FooFrame(); 
     frame.setupGUI(); 
     frame.pack(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 

然後GUI:

import java.awt.FlowLayout; 
import java.awt.LayoutManager; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 


public class FooFrame 
    extends JFrame 
{ 
    private final JButton incrementBtn; 
    private final JButton decrementBtn; 
    private int value; 

    { 
     incrementBtn = new JButton("++"); 
     decrementBtn = new JButton("--"); 
    } 

    private class IncrementListener 
     implements ActionListener 
    { 

     public void actionPerformed(final ActionEvent evt) 
     { 
      increment(); 
     } 

    } 

    private class DecrementListener 
     implements ActionListener 
    { 

     public void actionPerformed(final ActionEvent evt) 
     { 
      decrement(); 
     } 

    } 

    public void setupGUI() 
    { 
     final LayoutManager layout; 

     layout = new FlowLayout(); 
     setLayout(layout); 
     setupListeners(); 
     addComponents(); 
    } 

    private void setupListeners() 
    { 
     incrementBtn.addActionListener(new IncrementListener()); 
     decrementBtn.addActionListener(new DecrementListener()); 
    } 

    private void addComponents() 
    { 
     add(incrementBtn); 
     add(decrementBtn); 
    } 

    private void increment() 
    { 
     value++; 
     System.out.println("value = " + value); 
    } 

    private void decrement() 
    { 
     value--; 
     System.out.println("value = " + value); 
    } 
} 
+0

偉大的答案,但之前我接受這個答案,讓我相信我理解。你的建議是,JFrame和Actionlistener類都實現了actionlistener。並且JFrame將其解釋並將其傳遞給ActionListener進行處理? – slimbo 2009-12-07 17:30:10

+0

給我一點,我會把一些代碼:-)(只需要進入工作...考試時間:-) – TofuBeer 2009-12-07 17:37:32

+0

謝謝你一噸,我真的很感激。 – slimbo 2009-12-07 20:27:43