当前位置: 首页 > 知识库问答 >
问题:

在jtable上面绘制jtable单元格编辑器

葛驰
2023-03-14

设计定制JTable我已经知道DefaultCellEditor在其构造函数中允许使用JComboBox。单击此JComboBox以显示列表项时,它显示在JTable的其他单元格上方。问题是,我需要一个更复杂的行为,就像JComboBox提供的那样,这样我就用一个JList和一个JButton实现了一个JTextField,当点击JButton(或者用户在JTextField中输入文本)时,JList中的元素就变得可见了。这三个元素在一个JPanel中。当我尝试将此面板用作单元格编辑器(扩展AbtractCellEditor并实现TableCellEditor)时,列表中的元素显示在编辑单元格内,但我无法使用组合来模拟DefaultCellEditor的行为,以便列表元素显示在JTable上方。

这里我定义了自定义单元格编辑器:(非常短的版本);

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractCellEditor;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.TableCellEditor;

public class CustomCellEditor extends AbstractCellEditor implements     TableCellEditor {
private JList list;
private JButton button;
private JTextField editor;
private JPanel mainPanel;

public CustomCellEditor() {
    list = new JList(new String[] { "One", "Two", "Three" });
    editor = new JTextField();
    button = new JButton("Click me ");
    button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            list.setVisible(!list.isVisible());
        }
    });

    JPanel auxPanel = new JPanel(new BorderLayout());
    auxPanel.add(editor, BorderLayout.CENTER);
    auxPanel.add(button, BorderLayout.EAST);
    mainPanel = new JPanel(new BorderLayout());
    mainPanel.add(auxPanel, BorderLayout.NORTH);
    mainPanel.add(list, BorderLayout.CENTER);
}
@Override
public Object getCellEditorValue() {
    return editor.getText();
}

@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
    return mainPanel;
}

}

这是一个带有jtable的主程序,这个面板作为单元格编辑器:

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;

public class CustomTable {

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            CustomTable instance = new CustomTable();
            instance.createAndShowUI();
        }
    });
}

private void createAndShowUI() {       
    JTable table = new JTable(new CustomTableModel());
    //So that I can see the contents of the list when edited
    table.setRowHeight(60);
    TableColumn editableColumn = table.getColumnModel().getColumn(0);
    editableColumn.setPreferredWidth(250);
    editableColumn.setCellEditor(new CustomCellEditor());
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(table, BorderLayout.CENTER);
    frame.pack();
    frame.setVisible(true);     
}

private class CustomTableModel extends AbstractTableModel   {
    private final String[] columnNames = {"Editable column", "Other column"};

    private final Object[][] data = {
        {"Ricardo", "Mr."},
        {"Josefina", "Ms."}
    };

            @Override
    public int getRowCount() {
        return data.length;
    }

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

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        return data[rowIndex][columnIndex];
    }

    @Override
    public boolean isCellEditable(int row, int col) {
        if (0 == col)
            return true;
        return false;
    }

    @Override
    public void setValueAt(Object value, int row, int col) {
        data[row][col] = value;
        fireTableCellUpdated(row, col);
    }

}

}

有人能帮我吗?

谢谢

共有1个答案

邴烨
2023-03-14

使用JComboBox作为表格编辑器依赖于它是一个按钮,当按下时会显示弹出组件。由于单元格中有几个组件,请考虑以下选项:

>

使用JDialog将组件添加到模式对话框中,如图所示。

 类似资料:
  • 我想要一个有4列的jtable。一列必须是组合框。其他列是字符串。 只要找到问题:在注释语句jcb.seteditable(true)时;,如果我在comboxcell上单击一次,它就会打开这个单元格。但我不知道为什么效果更好。此外,我希望combox可编辑。 我怎么能对其他细胞有同样的行为。 再次您好,我已经更新了代码,以便使-如果我通过重写方法在单元格上单击一次,单元格可以编辑-如果我通过重写

  • 问题内容: 我需要在jTable中显示数字,精确到小数点后两位。为此,我创建了一个自定义单元格编辑器,如下所示: 该单元格编辑器非常适合将点用作小数点的英语语言环境。但是在德语语言环境中,它不接受逗号作为小数点的值。请让我知道我的代码中有问题的地方。提前致谢。 编辑:这是我如何使其工作: 问题答案: 使用语言环境来发挥您的优势:

  • 我有一个JTable,它应该是2列(String,JComboBox)。当我初始化表时,一切看起来都很好。只要一个I在表中选择了一个值,JComboBox单元格就会获取所选项的数据类型。 我想保持JCOmboBox在那里,让它触发数据更改事件,表忽略该列中的数据更改,并保持ComboBox填充。 我的表将此作为覆盖

  • 问题内容: 我试图以编程方式开始在按键上编辑当前行的第三列。 我实现了一个KeyListener,其中包含以下代码 当我释放Enter时,单元格确实是可编辑的(我可以在末尾键入),但是没有插入符号。 当我用鼠标单击时,行为是预期的(我可以进行编辑,并且存在carret)。 另外,我注意到在释放键时,我的celleditor为null,而在mouseclick上,它也不为null。 我究竟做错了什么

  • 问题内容: 你们真是太棒了,为我在最后一个问题上指明了正确的方向,我在这里对我原来的问题进行了扩展: 如何将JTable列设置为String并排序为Double? 由于现在我使用自定义单元格渲染器将价格列的格式设置为$ ###,## 0.00,因此我现在还为该单元格设置了JTextField编辑器。单元格的编辑工作正常,除了更新值时,自定义渲染器中设置的数字格式似乎不再格式化单元格(在提交编辑后,