pvbemu/src/desktop/util/UComboBox.java

96 lines
2.8 KiB
Java

package util;
// Java imports
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
// Wrapper around JComboBox<String> to enforce desired behaviors
public class UComboBox extends JComboBox<String> {
// Instance fields
private HashMap<ActionListener, ActionListener> actionListeners;
///////////////////////////////////////////////////////////////////////////
// Constants //
///////////////////////////////////////////////////////////////////////////
// Empty item set
private static final String[] EMPTY = new String[0];
///////////////////////////////////////////////////////////////////////////
// Constructors //
///////////////////////////////////////////////////////////////////////////
// Default constructor
public UComboBox() {
this(null);
}
// List constructor
public UComboBox(String[] items) {
super();
actionListeners = new HashMap<ActionListener, ActionListener>();
setItems(items);
}
///////////////////////////////////////////////////////////////////////////
// Public Methods //
///////////////////////////////////////////////////////////////////////////
// Add a listener to receive action events
public void addActionListener(ActionListener l) {
// Error checking
if (l == null)
return;
// Wrap the event listener in a guard
ActionListener L = e->{
// Search the stack trace for an invocation not from Java itself
var trace = Thread.currentThread().getStackTrace();
for (int x = 2; x < trace.length; x++)
if (trace[x].getModuleName() == null)
return;
// Call the event handler
l.actionPerformed(e);
};
// Manage the collections
actionListeners.put(l, L);
super.addActionListener(L);
}
// Retrieve a list of the current action listeners
public ActionListener[] getActionListeners() {
return actionListeners.keySet().toArray(
new ActionListener[actionListeners.size()]);
}
// Remove an action listener from the collection
public void removeActionListener(ActionListener l) {
var L = actionListeners.get(l);
if (L == null)
return;
actionListeners.remove(l);
super.removeActionListener(L);
}
// Update the items in the list
public void setItems(String[] items) {
int index = getSelectedIndex();
setModel(new DefaultComboBoxModel<String>(
items != null ? items : EMPTY));
setSelectedIndex(index);
}
}