【问题标题】:Paint jtable cell editor above jtable在 jtable 上方绘制 jtable 单元格编辑器
【发布时间】:2013-11-29 18:29:10
【问题描述】:

设计一个自定义的 JTable 我已经知道 DefaultCellEditor 在他的构造函数中承认了一个 JComboBox。此 JComboBox 在单击以显示列表项时显示在 JTable 的其他单元格上方。问题是我需要像 JComboBox 提供的那样更复杂的行为,以便我实现了一个带有 JList 和 JButton 的 JTextField,当单击 JButton(或用户在 JTextField 中输入文本)时 JList 中的元素变得可见。这 3 个元素在 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);
    }

}

}

有人可以帮我吗?

谢谢!!

【问题讨论】:

  • SO 中的人会很乐意为您提供帮助,但您必须先展示您的工作 :) 或者更好的是,发布 SSCCE 来展示您的问题。
  • 很好的描述,为了更好地帮助尽快发布 SSCCE,简短,可运行,可与局部变量中的 JTable 硬编码数据进行编译

标签: java swing jtable


【解决方案1】:

使用JComboBox 作为表格编辑器依赖于它是一个在按下时显示弹出组件的按钮。由于单元格中有多个组件,请考虑以下替代方案:

  • 将组件添加到面板,如here 所示,用于一组JRadioButton 实例。

  • 将组件添加到模态对话框,如here 使用JDialog 所示。

【讨论】:

  • 感谢trashgod,模态对话框可以作为一种解决方法,但对我来说,DefaultCellEditor 如何完成以显示jtable单元格上方的组合列表仍然是一种谜
  • @RicharddeOlba:给定 L&F 的 JComboBox UI 委托(通常)包含扩展 JPopupMenuBasicComboPopup
猜你喜欢
  • 2023-03-23
  • 2011-09-27
  • 2019-04-30
  • 1970-01-01
  • 2014-01-01
  • 2010-12-22
  • 2011-03-26
  • 1970-01-01
  • 2012-05-29
相关资源
最近更新 更多