2011-05-17 63 views
2

我想創建一個(簡單的,有希望的)自定義Swing組件,方法是組合多個現有組件。就我而言,它是一個由JLabel組成的開關開關,以及兩個用於On和Off的JButton。我通過擴展JPanel來開始OnOffSwitch。構造函數添加子組件,並將其自身設置爲按鈕的ActionListener。該類有一個isOn()方法用於查詢組件的當前狀態。撰寫Swing組件:如何添加添加ActionListeners的能力?

我現在想添加將ActionListeners添加到OnOffSwitch類的功能。我預計這個功能可以通過擴展像JPanel這樣的Swing組件來實現,但JPanel不具備這個功能。從外觀上看,每個具有此功能的Swing組件都會自行重新實現它:向列表添加偵聽器,觸發ActionEvents等。

什麼是實現我想要的正確方法?我可以從各種Swing組件中複製/粘貼代碼(或者重新編寫它的要點),或者我可以實現我自己的OnOffSwitchListener接口。爲了保持一致,似乎我所有的組件都應該使用ActionListeners。

回答

5

我個人不認爲你需要一個自定義的Swing組件。無需您的UI類來擴展任何Swing類;你不太可能提供更多的自定義行爲。 (我可能會承認構成其他人的JPanel。)

我寧願將構圖放在繼承上。擁有一個擁有Swing數據成員的UI類,併爲其提供添加和刪除偵聽器的方法,以滿足您的需求。您可以通過這種方式更改行爲,而無需重寫UI類。它只不過是一個容器。

public class MyUI 
{ 
    private Button b = new Button(); 

    public void addButtonListener(ActionListener listener) { this.b.addActionListener(listener); } 
} 
+0

1我同意使用現有的部件組合物;對於我以前的誤讀抱歉。 – trashgod 2011-05-17 19:53:00

3

通過的來源外觀上來看,它確實每個Swing組件有這個[的ActionListener]功能重新實現它本身:在增加聽衆的名單,是ActionEvent的燒製等

是的。這就是您在編寫自定義Swing組件時必須執行的操作。

就像你說的,你可以從現有的Swing組件複製ActionListener代碼,

7

我會使用一個JToggelButton,如圖here,或委託給所包含的按鈕,如@duffymo建議。如果真的需要需要定製OnOffSwitchEvent,則標準接線在EventListenerList中概述,其中的一個實例包含在每個JComponent中。

附錄:下面是一個委託給包含兩個按鈕的ButtonGroup的示例。標籤用符號裝飾,但Icon的任何實現都更加靈活。

BttonGroupTest iamge

import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.ButtonGroup; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JToggleButton; 

/** @see https://stackoverflow.com/questions/6035834 */ 
public class ButtonGroupTest extends JComponent { 

    private static final String ON = "On"; 
    private static final String OFF = "Off"; 
    private final JToggleButton bOn = new JToggleButton(ON); 
    private final JToggleButton bOff = new JToggleButton(OFF); 
    private final JLabel label = new JLabel(" \u2301 "); 
    private final ButtonHandler handler = new ButtonHandler(); 

    public ButtonGroupTest() { 
     this.setLayout(new FlowLayout()); 
     label.setOpaque(true); 
     label.setBackground(Color.red); 
     label.setFont(label.getFont().deriveFont(36f)); 
     ButtonGroup bg = new ButtonGroup(); 
     this.add(bOn); 
     bg.add(bOn); 
     bOn.setSelected(true); 
     bOn.addActionListener(handler); 
     this.add(label); 
     this.add(bOff); 
     bg.add(bOff); 
     bOff.addActionListener(handler); 
    } 

    public void addActionListener(ActionListener listener) { 
     bOn.addActionListener(listener); 
     bOff.addActionListener(listener); 
    } 

    private class ButtonHandler implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      String cmd = e.getActionCommand(); 
      if (ON.equals(cmd)) { 
       label.setBackground(Color.red); 
      } else { 
       label.setBackground(Color.black); 
      } 
     } 
    } 

    private void display() { 
     JFrame f = new JFrame("ButtonGroupTest"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

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

      @Override 
      public void run() { 
       new ButtonGroupTest().display(); 
      } 
     }); 
    } 
} 
相關問題