/* ButtonPanel.java */ import java.awt.*; import java.awt.event.*; import java.beans.*; import java.io.*; public class ButtonPanel extends Panel implements Serializable, ItemListener { //---Instanzvariablen------------------------------------ protected CheckboxGroup cbg; protected Checkbox[] cb; transient protected PropertyChangeSupport pcs; //---Methoden-------------------------------------------- public ButtonPanel() { cbg = new CheckboxGroup(); cb = new Checkbox[0]; initTransientState(); } //---Anzahl der RadioButtons----------------------------- public void setButtonCnt(int cnt) { if (cnt != cb.length) { int oldvalue = cb.length; //Bisherige Buttons entfernen if (cb.length > 0) { removeAll(); } cb = new Checkbox[cnt]; setLayout(new GridLayout(cnt, 1)); for (int i = 0; i < cnt; ++i) { cb[i] = new Checkbox( "RadioButton " + i, cbg, (i == 0 ? true : false) ); cb[i].addItemListener(this); add(cb[i]); } //PropertyChangeEvents senden pcs.firePropertyChange("buttonCnt", oldvalue, cnt); if (cnt > 0) { setSelected(0); } //Neu layouten setSize(getPreferredSize()); invalidate(); doLayout(); Container owner = getParent(); if (owner != null) { owner.invalidate(); owner.doLayout(); } } } public int getButtonCnt() { return cb.length; } //---Beschriftung der Buttons---------------------------- public void setLabel(int index, String label) { if (index >= 0 && index < cb.length) { cb[index].setLabel(label); } } public String getLabel(int index) { String ret = "***invalid index***"; if (index >= 0 && index < cb.length) { ret = cb[index].getLabel(); } return ret; } //---Selektiertes Element-------------------------------- public void setSelected(int index) { if (index >= 0 && index < cb.length) { int oldvalue = getSelected(); cb[index].setState(true); pcs.firePropertyChange("selected", oldvalue, index); } } public int getSelected() { int ret = -1; for (int i = 0; i < cb.length; ++i) { if (cb[i].getState()) { ret = i; break; } } return ret; } //---Verwaltung der PropertyChangeListener--- public void addPropertyChangeListener( PropertyChangeListener l ) { pcs.addPropertyChangeListener(l); } public void removePropertyChangeListener( PropertyChangeListener l ) { pcs.removePropertyChangeListener(l); } //---Reaktion auf Zustandsänderungen--------------------- public void itemStateChanged(ItemEvent event) { Checkbox changedcb = (Checkbox) event.getItemSelectable(); if (changedcb.getState()) { for (int i = 0; i < cb.length; ++i) { if (cb[i] == changedcb) { pcs.firePropertyChange("selected", -1, i); break; } } } } //---Private Methoden------------------------------------ /** * Initialisierung der nicht-persistenten Instanzvariablen. */ private void initTransientState() { pcs = new PropertyChangeSupport(this); } /** * Wird überlagert, um nach dem Deserialisieren den transienten * Zustand zu initialisieren. */ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); initTransientState(); } }