java - 将 JComboBox 放入 JTable 并从列表中获取元素而不是编辑单元格

标签 java swing jtable jcombobox renderer

我想让 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");
        }
    }
}

最佳答案

您必须实现一个 TableCellEditor 而不是 TableCellRenderer 并将其设置为 JTable.setCellEditor(TableCellEditor) .

看看this example .

关于java - 将 JComboBox 放入 JTable 并从列表中获取元素而不是编辑单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12140076/

相关文章:

java - java中Shape下的文本

java - 如何将多个 MouseListener 添加到单个 JFrame?

java - ActionListener 是抽象的并且不会覆盖抽象方法 actionPerformed——尽管包含那个方法

java - 在 JTable 中呈现组合框

java - 如何在java中减去两列值并显示在另一列中

java - Android编辑文本: How to display the data inserted in edittext in a separate activity programmatically?

java - 哪些 Java API 创建线程

java - boolean onClickEventListener 返回的目的

java - 如何将可单击的变量输出到 Java (Intellij) 控制台并将您发送到它们所在的代码行

java - 对于 JTable 的一列,如何在每一行中放置一个唯一的组合框编辑器?