Проблемы с TableCellEditor и JComboBox

Я пытаюсь заставить jtable содержать поля со списком для одного из столбцов, но это не работает, оно просто отображается как обычные ячейки таблицы. на данный момент я следую примеру оракула: http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/uiswing/examples/components/TableRenderDemoProject/src/components/TableRenderDemo.java

Я перепробовал все темы, размещенные здесь об этом, а также о различных методах, я заставил его работать один раз, но потерял его после того, как попробовал другой метод. Что я делаю неправильно? Я не включаю весь код, он слишком длинный, только соответствующую часть. clientTable ранее был объявлен как jTable.

    // Define Table model for clients table
    class ClientsTableModel extends DefaultTableModel {

        public ClientsTableModel(Vector<Vector<String>> clientsDataVector,
                Vector<String> clientColumNamesVector) {
            super(clientsDataVector, clientColumNamesVector);
        }

        @Override
        public int getColumnCount() {
            return clientColumNames.length;
        }

        @Override
        public int getRowCount() {
            return clientsDataVector.size();
        }

        @Override
        public String getValueAt(int row, int column) {
            return clientsDataVector.get(row).get(column);
        }

        @Override
        public void setValueAt(Object aValue, int row, int column) {
            clientsDataVector.get(row).set(column, (String) aValue);
        }
        @Override
        public Class<?> getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }

    }

    // create table model and add to clients table
    clientColumNames = new String[] { "ID", "Name", "Type", "Address",
            "Email", "Phone", "Comment" };
    clientColumNamesVector = new Vector<String>(
            Arrays.asList(clientColumNames));
    clientsDataVector = new Vector<Vector<String>>(1, 1);
    clientsTableModel = new ClientsTableModel(clientsDataVector,
            clientColumNamesVector);
    clientsTableModelEvent = new TableModelEvent(clientsTableModel);
    clientsTableModel.addTableModelListener(new TableModelListener() {
        @Override
        public void tableChanged(TableModelEvent arg0) {
        }
    });

    // create clients table and set type column to be combo box
    String[] clientTypes = { "REGULAR", "GOLD", "PLATINUM" };
    clientsTable = new JTable(clientsTableModel);
    clientsTable.setAutoCreateRowSorter(true);
    clientsTable.setFillsViewportHeight(true);
    JComboBox clientsTypeComboBox = new JComboBox(clientTypes);
    TableColumn clientsTypeColumn = clientsTable.getColumnModel().getColumn(2);
    clientsTypeColumn.setCellEditor(new DefaultCellEditor(clientsTypeComboBox));
    DefaultTableCellRenderer cellRenderer = new DefaultTableCellRenderer();


    // create client scroll pane
    JScrollPane clientsScrollPane = new JScrollPane(clientsTable);
    GridBagConstraints gbc_clientsScrollPane = new GridBagConstraints();
    gbc_clientsScrollPane.insets = new Insets(0, 0, 5, 0);
    gbc_clientsScrollPane.fill = GridBagConstraints.BOTH;
    gbc_clientsScrollPane.gridx = 0;
    gbc_clientsScrollPane.gridy = 0;
    viewClientsPanel.add(clientsScrollPane, gbc_clientsScrollPane);

person ido flax    schedule 02.12.2013    source источник


Ответы (2)


он просто отображается как обычные ячейки таблицы.

Это происходит потому, что у вас есть средство визуализации по умолчанию для вашего столбца. Когда вы начинаете редактировать, столбец отображается как JComboBox, потому что вы установили DefaultCellEditor с JComboBox. Если вы хотите всегда отображать ячейки как JComboBox, вы можете реализовать TableCellRenderer для пользовательского представления ячейки, прочитайте руководство для этого. Вот простой пример для вас:

import java.awt.Component;

import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

public class Example extends JFrame {

    public Example() {
        DefaultTableModel m = new DefaultTableModel(new Object[][]{{"2",2,3},{"1",4,5}},new Object[]{1,2,3});
        JTable t = new JTable(m);
        t.getColumnModel().getColumn(0).setCellEditor(new DefaultCellEditor(new JComboBox(new Object[]{"1","2"})));
        t.getColumnModel().getColumn(0).setCellRenderer(getCellRenderer());
        t.setRowHeight(25);
        getContentPane().add(new JScrollPane(t));
        pack();
    }


    private TableCellRenderer getCellRenderer() {
        return new TableCellRenderer() {

            JComboBox box = new JComboBox(new Object[]{"1","2"});
            @Override
            public Component getTableCellRendererComponent(JTable arg0, Object arg1,boolean arg2, boolean arg3, int arg4, int arg5) {
                box.setSelectedItem(arg1);
                return box;
            }
        };
    }


    public static void main(String[] args) throws InterruptedException {
        Example ex = new Example();
        ex.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ex.setVisible(true);
    }
}

и это выглядит следующим образом:

введите здесь описание изображения

person alex2410    schedule 03.12.2013
comment
неправильно, очень неправильно, box.setSelectedItem(arg1); вызывается внутри XxxRenderer, а не в Renderer, это событие для модели setValueAt() - person mKorbel; 03.12.2013

спасибо за ваши ответы, мне действительно удалось найти, что было не так. В итоге я использовал tableCellEditor, и вы сделали свое поле со списком для реализации tablecellrenderer, которое я пробовал раньше, но главное, что я не сделал, — это переопределить методы jtable getcellrendere/editor: clientTable = new JTable (clientsTableModel) {

        @Override
        public TableCellEditor getCellEditor(int row, int col) {
            if (col==2) return clientsTypeCellEditor;
            return super.getCellEditor(row, col);
        }

        @Override
        public TableCellRenderer getCellRenderer(int arg0, int arg1) {
            // TODO Auto-generated method stub
            return super.getCellRenderer(arg0, arg1);
        }

    };
person ido flax    schedule 06.12.2013