【发布时间】:2016-08-25 11:21:39
【问题描述】:
我已阅读文档和教程,并在此处搜索,但无济于事。
Oracle tutorial: how to use custom render for ComboBox
Another question similar with a somehow vague answer
我认为这很重要,因为很多人都问过这个问题,但没有人能提供一个简单、可行的例子。所以我必须自己问:
我们如何制作一个带有下拉菜单的组合框,让我们可以选择多个选项?
什么不工作:
-
JList在这里被证明是没用的,因为我不能让它出现在下拉菜单中。 - Swing 中没有
CheckBoxList。
我已经在组合的下拉菜单中使用复选框进行了 SCCEE,但复选框拒绝被选中,复选框中的复选框丢失。
我们怎样才能做到这一点?
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.util.List;
import javax.swing.DefaultCellEditor;
import javax.swing.DefaultListModel;
import javax.swing.DefaultListSelectionModel;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.ListCellRenderer;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.TableColumn;
public class ComboOfCheckBox extends JFrame {
public ComboOfCheckBox() {
begin();
}
private void begin() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
JTable table = new JTable(new Object[2][2], new String[]{"COL1", "COL2"});
final JCheckBox chx1 = new JCheckBox("Oh");
final JCheckBox chx2 = new JCheckBox("My");
final JCheckBox chx3 = new JCheckBox("God");
String[] values = new String[] {"Oh", "My", "God"};
JCheckBox[] array = new JCheckBox[] {chx1, chx2, chx3};
final JComboBox<JCheckBox> comboBox = new JComboBox<JCheckBox>(array) {
@Override
public void setPopupVisible(boolean visible){
if (visible) {
super.setPopupVisible(visible);
}
}
};
class CheckBoxRenderer implements ListCellRenderer {
private boolean[] selected;
private String[] items;
public CheckBoxRenderer(String[] items) {
this.items = items;
this.selected = new boolean[items.length];
}
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
boolean cellHasFocus) {
JLabel label = null;
JCheckBox box = null;
if (value instanceof JCheckBox) {
label = new JLabel(((JCheckBox)value).getText());
box = new JCheckBox(label.getText());
}
return box;
}
public void setSelected(int i, boolean selected) {
this.selected[i] = selected;
}
}
comboBox.setRenderer(new CheckBoxRenderer(values));
panel.add(comboBox);
panel.add(new JCheckBox("Another"));
getContentPane().add(panel);
pack();
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
ComboOfCheckBox frame = new ComboOfCheckBox();
}
});
}
}
【问题讨论】:
-
@FaithReaper -
How can we make a combobox with a drop-down menu, allowing us to choose more than one options?== 1. 在某些操作、选择(鼠标/键事件)之后,弹出窗口不会消失或保持可见,2. 那么有一个问题,你如何可以/你想隐藏弹出窗口(以避免混淆用户) -
@FaithReaper - here is half way to your goal,您可以使用 JWindow 并检查 mouseEvents(来自 SwingUtilities)是否有特殊弹出窗口(这不会在第一次隐藏。鼠标/keyEvent)
-
@mKorbel 我正在和 Andrew 交谈......他坚持认为这是不可能的。至于你的顾虑,我已经找到了解决方法,这些行:
@Override public void setPopupVisible(boolean visible){ if (visible) { super.setPopupVisible(visible); } }。诀窍是:只听visible==true。当弹出菜单被通知visible==false时,忽略它。当我点击其他地方时,弹出菜单会隐藏。运行我的 SCCEE,你会看到它。 -
下面的方法怎么样:制作一个支持多选的swing组件 b.尝试将其用作渲染器?
-
... no one can provide a simple, workable example.- 因为尝试在圆孔中安装方形钉子不是一个好主意(由于太多原因在评论中列出)。组合框用于选择单个项目。仅仅因为组合框显示弹出窗口并不意味着它应该用于选择弹出窗口中的多个项目。有更好的 Swing 组件可以使用,例如JPopupMenu。它允许您在弹出窗口中显示JCheckBoxMenuItems。有关此方法的示例,请参阅 Table Column Adjuster。
标签: java swing popup jcombobox jcheckbox