从帖子中理解您想要实现的目标有点困难,但如果您有兴趣了解编辑器内容何时更改,您可以尝试
final JComboBox combo = new JComboBox();
combo.setEditable(true);
((JTextComponent) combo.getEditor().getEditorComponent()).getDocument().addDocumentListener(new DocumentListener() {
protected void updatePopup() {
if (combo.isDisplayable()) {
if (!combo.isPopupVisible()) {
combo.showPopup();
}
}
}
@Override
public void insertUpdate(DocumentEvent e) {
updatePopup();
}
@Override
public void removeUpdate(DocumentEvent e) {
updatePopup();
}
@Override
public void changedUpdate(DocumentEvent e) {
updatePopup();
}
});
通常,我会创建一个“DocumentHandler”作为具体类并使用它,但该示例演示了基本思想
更新了一个 UI 示例
public class TestComboBox extends JFrame {
public TestComboBox() {
setTitle("Test");
setSize(200, 200);
setLayout(new GridBagLayout());
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
final JComboBox combo = new JComboBox();
/**** You have to do this first
**** Doing this invalidates any previous listeners
****/
combo.setUI(ColorArrowUI.createUI(combo));
combo.setEditable(true);
((JTextComponent) combo.getEditor().getEditorComponent()).getDocument().addDocumentListener(new DocumentListener() {
protected void updatePopup() {
if (combo.isDisplayable()) {
if (!combo.isPopupVisible()) {
combo.showPopup();
}
}
}
@Override
public void insertUpdate(DocumentEvent e) {
updatePopup();
}
@Override
public void removeUpdate(DocumentEvent e) {
updatePopup();
}
@Override
public void changedUpdate(DocumentEvent e) {
updatePopup();
}
});
combo.setModel(createComboBoxModel());
add(combo);
setVisible(true);
}
protected ComboBoxModel createComboBoxModel() {
DefaultComboBoxModel model = new DefaultComboBoxModel();
File file = new File("../TestWords/Words.txt");
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(file));
String text = null;
while ((text = reader.readLine()) != null) {
model.addElement(text);
}
} catch (Exception e) {
} finally {
try {
reader.close();
} catch (Exception e) {
}
}
return model;
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
}
new TestComboBox();
}
public static class ColorArrowUI extends BasicComboBoxUI {
public static ComboBoxUI createUI(JComponent c) {
return new ColorArrowUI();
}
@Override
protected JButton createArrowButton() {
return new BasicArrowButton(
BasicArrowButton.SOUTH,
Color.cyan, Color.magenta,
Color.yellow, Color.blue);
}
}
}
使用 UI 设置
使用画家设置
更新
这是 kleopatra 向您展示的代码
Painter painter = new Painter<JComponent>() {
@Override
public void paint(Graphics2D g, JComponent object, int width, int height) {
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height);
}
};
JButton org = null;
for (int i = 0; i < combo.getComponentCount(); i++) {
if (combo.getComponent(i) instanceof JButton) {
org = (JButton) combo.getComponent(i);
UIDefaults buttonDefaults = new UIDefaults();
buttonDefaults.put("ComboBox:\"ComboBox.arrowButton\"[Enabled].foregroundPainter", painter);
org.putClientProperty("Nimbus.Overrides.InheritDefaults", false);
org.putClientProperty("Nimbus.Overrides", buttonDefaults);
break;
}
}