Проблема с JComboBox в JXTable

Я пытаюсь сделать столбец в 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());
    }
}

person sethu    schedule 03.02.2012    source источник
comment
Можете ли вы воспроизвести проблему с JTable?   -  person Andrew Thompson    schedule 03.02.2012
comment
@ Эндрю Томпсон, да, та же проблема. Не решение, просто (не связанное) предупреждение: не используйте один и тот же экземпляр comboBoxModel как в рендерере, так и в редакторе - редактор постоянно прослушивает модель, что может привести к странным эффектам, возможно, даже к повреждению данных.   -  person kleopatra    schedule 03.02.2012
comment
Хм ... похоже на вариант одной из самых старых ошибок в Swing (нет идентификатора, слишком ленив, чтобы искать в печально известном вялом параде ошибок), который, как я думал, был исправлен: происходит с ядром JTable, ядро ​​​​по умолчанию (метка) визуализатор и основной комборедактор по умолчанию - при первом щелчке по ячейке всплывающее окно иногда отображается, а иногда не отображается (хотя таблица всегда находится в состоянии редактирования, afaics)   -  person kleopatra    schedule 03.02.2012
comment
Клеопатра спасибо. После того, как рендерер и редактор сделали свои модели, проблема решилась.   -  person sethu    schedule 03.02.2012
comment
ааа .. так это было вашей главной заботой :-) Вы не возражаете против того, чтобы всегда не открываться при первом нажатии?   -  person kleopatra    schedule 03.02.2012
comment
Я еще не мог заставить «не открывать при первом нажатии всегда» в моем коде. Пробовал уже раз 20. Так что я надеюсь, что это исправлено .. может быть?   -  person sethu    schedule 03.02.2012
comment
На самом деле я вижу, что здесь отвечают 3 «великих».. Подумал, что просто поделюсь. На самом деле я работаю над Swing Framework. Это еще не сделано. Но надеюсь завершить его в ближайшее время. Он размещен здесь: code.google.com/p/swingobjects. Проверьте класс test.CompTest, чтобы узнать, как его использовать. Как я уже сказал, он еще не завершен, нужно еще соединить много точек.   -  person sethu    schedule 03.02.2012
comment
@sethu, пожалуйста, опубликуйте ответ и отметьте его как действительный   -  person Yves Martin    schedule 24.03.2012


Ответы (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"})));
person sethu    schedule 25.03.2012