簡體   English   中英

在jtable上方繪制jtable單元編輯器

[英]Paint jtable cell editor above jtable

設計一個自定義的JTable我已經知道DefaultCellEditor在他的構造函數中允許一個JComboBox。 單擊此JComboBox以顯示列表項時,該JComboBox顯示在JTable的其他單元格上方。 問題是我需要像JComboBox所提供的那樣更復雜的行為,以便在單擊JButton(或用戶在JTextField中輸入文本)時,我實現了帶有JList和JButton的JTextField。變得可見。 這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);
    }

}

}

有人能幫我嗎?

謝謝!!

使用JComboBox作為表編輯器依賴於它是一個在按下時顯示彈出組件的按鈕。 由於單元中有多個組件,請考慮以下替代方法:

  • 組分添加到面板,如圖這里為一組的JRadioButton實例。

  • 將組件添加到模式對話框,如此處所示使用JDialog

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM