【问题标题】:Issue with a JComboBox in a JXTableJXTable 中的 JComboBox 问题
【发布时间】: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。让渲染器和编辑器有自己的模型后,问题就解决了。
  • 啊 .. 所以这是你主要关心的 :-) 你不介意第一次点击时不打开吗?

标签: java swing swingx jxtable


【解决方案1】:

要解决这个问题,请确保您不要为编辑器和渲染器共享相同的 DefaultComboxBoxModel 实例。所以不要这样:

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.getColumnExt(1).setCellRenderer(new DefaultTableRenderer(new ComboBoxProvider(
             new DefaultComboBoxModel(new String[] {"Yes","No","Maybe"}))));
    table.getColumnExt(1).setCellEditor(new ComboBoxEditor(
            new DefaultComboBoxModel(new String[] {"Yes","No","Maybe"})));

【讨论】:

    猜你喜欢
    • 2013-07-30
    • 1970-01-01
    • 2023-03-25
    • 2015-08-02
    • 1970-01-01
    • 2013-12-18
    • 2012-06-26
    • 2021-01-01
    • 1970-01-01
    相关资源
    最近更新 更多