【发布时间】:2012-12-06 05:42:59
【问题描述】:
我正在尝试将 JXTable 中的列作为组合框。很难解释我面临的问题。当您单击下拉菜单时,有时下拉菜单不会保持打开足够长的时间让您选择值。它只是关闭并选择了一些值。有时,您可以选择一个值。 这是 SSCCE:
import java.awt.Color;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultCellEditor;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.table.DefaultTableModel;
import org.jdesktop.swingx.JXFrame;
import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.renderer.CellContext;
import org.jdesktop.swingx.renderer.ComponentProvider;
import org.jdesktop.swingx.renderer.DefaultTableRenderer;
public class Test {
public static void main(String[] args) {
JXFrame frame=new JXFrame();
Object[][] rows = new Object[10][];
for (int i = 0; i < rows.length; i++) {
rows[i] = new Object[]{
"Test data ","Yes"};
}
DefaultTableModel model = new DefaultTableModel(rows,
new String[]{
"Title 1", "Title 2"
});
final JXTable table = new JXTable(model);
DefaultComboBoxModel cmodel = new DefaultComboBoxModel(new String[] {"Yes","No","Maybe"});
table.getColumnExt(1).setCellRenderer(new DefaultTableRenderer(new ComboBoxProvider(cmodel)));
table.getColumnExt(1).setCellEditor(new ComboBoxEditor(cmodel));
table.setVisibleRowCount(10);
frame.setContentPane(table);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
class ComboBoxEditor extends DefaultCellEditor {
public ComboBoxEditor(ComboBoxModel model) {
super(new JComboBox(model));
}
}
class ComboBoxProvider extends ComponentProvider<JComboBox> {
private static final long serialVersionUID = 1L;
private JComboBox box;
public ComboBoxProvider(ComboBoxModel model){
box.setModel(model);
}
@Override
protected void configureState(CellContext context) {
box.setForeground(Color.black);
}
@Override
protected JComboBox createRendererComponent() {
box = new JComboBox();
box.setForeground(Color.black);
return box;
}
@Override
protected void format(CellContext context) {
box.setForeground(Color.black);
rendererComponent.setSelectedItem(context.getValue());
}
}
【问题讨论】:
-
你能用
JTable复制这个问题吗? -
@AndrewThompson 是的,同样的问题。不是一个解决方案,只是一个(不相关的)当心:不要在渲染器和编辑器中使用相同的 comboBoxModel 实例 - 编辑器会永久监听模型,这可能会导致奇怪的效果,甚至可能破坏数据
-
Hmm ... 看起来像是 Swing 中最古老的 bug 之一的变体(没有 id,懒得在臭名昭著的缓慢 bug 队列中搜索),我认为它已修复:发生使用核心 JTable、核心默认(标签)渲染器和核心默认组合编辑器 - 第一次单击单元格时,有时会显示有时不显示弹出窗口(尽管表格始终处于编辑状态,afaics)
-
感谢 kleopatra。让渲染器和编辑器有自己的模型后,问题就解决了。
-
啊 .. 所以这是你主要关心的 :-) 你不介意第一次点击时不打开吗?