Поместите JComboBox в JTable и сделайте получение элемента из списка вместо редактирования ячейки

Я хотел бы сделать одну ячейку в JTable объектом JComboBox и иметь возможность ее использовать. Это должна быть только одна ячейка, а не весь столбец. Таблица может содержать определенную ячейку, но не всегда, ее размещение не статично. Моя проблема заключается в том, чтобы поместить JComboBox в JTable, который можно использовать. Я приложил код, который я смог сделать до сих пор. Таблица содержит JComboBox, но когда я нажимаю на нее, списка нет и включается редактор ячеек. Я хотел бы, чтобы список отображался. Что мне делать или что нужно добавить/изменить в коде, чтобы достичь моей цели?

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRootPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;

public class CustomCellRenderer {
    JTable table;
    TableColumn tcol;

    public static void main(String[] args) {
        new CustomCellRenderer();
    }

    public CustomCellRenderer() {
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        Object data[][] = { { "Vinod", "Computer", "3" },
                { "Rahul", "History", "2" }, { "Manoj", "Biology", "4" },
                { "Sanjay", "PSD", "5" } };
        String col[] = { "Name", "Course", "Year" };
        DefaultTableModel model = new DefaultTableModel(data, col);
        table = new JTable(model);
        tcol = table.getColumnModel().getColumn(0);
        tcol.setCellRenderer(new CustomTableCellRenderer());
        tcol = table.getColumnModel().getColumn(1);
        tcol.setCellRenderer(new CustomTableCellRenderer());
        tcol = table.getColumnModel().getColumn(2);
        tcol.setCellRenderer(new CustomTableCellRenderer());
        JTableHeader header = table.getTableHeader();
        JScrollPane pane = new JScrollPane(table);
        panel.add(pane);
        frame.add(panel);
        frame.setSize(500, 150);
        frame.setUndecorated(true);
        frame.getRootPane().setWindowDecorationStyle(JRootPane.PLAIN_DIALOG);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public class CustomTableCellRenderer extends DefaultTableCellRenderer implements ActionListener {
        public Component getTableCellRendererComponent(JTable table,
                Object obj, boolean isSelected, boolean hasFocus, int row,
                int column) {
            Component cell = super.getTableCellRendererComponent(table, obj,
                    isSelected, hasFocus, row, column);

            if (((String) obj).equals("History")) {
                JComboBox comboBox = new JComboBox();
                comboBox.addItem("History");
                comboBox.addItem("English");
                comboBox.addItem("Biology");
                comboBox.addItem("PE");
                comboBox.addItem("None of the above");
                comboBox.addActionListener(this);

                return comboBox;
            }
            return cell;
        }

        public void actionPerformed(ActionEvent e) {
            System.out.println("Perform some action");
        }
    }
}

person dawrutowicz    schedule 27.08.2012    source источник


Ответы (1)


Вы должны реализовать TableCellEditor, а не TableCellRenderer, и установить его с помощью JTable.setCellEditor(TableCellEditor).

Посмотрите на этот пример.

person gontard    schedule 27.08.2012
comment
спасибо, я только что нашел этот пример и хотел сообщить здесь. - person dawrutowicz; 27.08.2012
comment
пожалуйста. Если этот ответ решит вашу проблему, примите его. - person gontard; 27.08.2012