簡體   English   中英

在 JTable / TableModel 中編輯列的單元格限制

[英]Editing cell restrictions of a column in a JTable / TableModel

我希望修改 JTable 中處理單元格輸入的方式。 目前我正在使用 DefaultTableModel,如下所示。

 DefaultTableModel model = new DefaultTableModel() {

                @Override
                public boolean isCellEditable(int row, int col) {
                    return col == 1 || col == 2 || col == 6;
                }

                @Override
                public Class getColumnClass(int col) {
                    if (col == 6) {
                        return Integer.class;
                    } else {
                        return String.class;
                    }
                }

            };

使用此代碼,第 6 列強制用戶輸入一個整數。 我想通過不允許數字超出范圍(例如 1-100)以及該字段永遠不會為空(該列將在用戶交互之前包含數據)來更進一步。 我已閱讀文檔,但似乎找不到任何管理列類型行為的內容。 謝謝!

您需要創建一個自定義編輯器。

以下示例演示了強制數據為 5 個字符的編輯器:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;

public class TableFiveCharacterEditor extends DefaultCellEditor
{
    private long lastTime = System.currentTimeMillis();

    public TableFiveCharacterEditor()
    {
        super( new JTextField() );
    }

    public boolean stopCellEditing()
    {
        JTable table = (JTable)getComponent().getParent();

        try
        {
            String editingValue = (String)getCellEditorValue();

            if(editingValue.length() != 5)
            {
                JTextField textField = (JTextField)getComponent();
                textField.setBorder(new LineBorder(Color.red));
                textField.selectAll();
                textField.requestFocusInWindow();

                JOptionPane.showMessageDialog(
                    table,
                    "Please enter string with 5 letters.",
                    "Alert!",JOptionPane.ERROR_MESSAGE);
                return false;
            }
        }
        catch(ClassCastException exception)
        {
            return false;
        }

        return super.stopCellEditing();
    }

    public Component getTableCellEditorComponent(
        JTable table, Object value, boolean isSelected, int row, int column)
    {
        Component c = super.getTableCellEditorComponent(
            table, value, isSelected, row, column);
        ((JComponent)c).setBorder(new LineBorder(Color.black));

        return c;
    }

    private static void createAndShowUI()
    {
        JTable table = new JTable(5, 5);
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        JScrollPane scrollPane = new JScrollPane(table);

        //  Use a custom editor

        TableCellEditor fce = new TableFiveCharacterEditor();
        table.setDefaultEditor(Object.class, fce);

        JFrame frame = new JFrame("Table Five Character Editor");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( scrollPane );
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}

您需要修改編輯器以確保:

  1. 通過使用 Integer.parseInt(...) 方法,數據是一個整數
  2. 整數值在您想要的范圍內

編輯:

我如何應用它來影響一列而不是整個表格。

您可以將編輯器添加到TableColumn

table.getColumnModel().getColumn(...).setCellEditor(...);

覆蓋 DefaultCellEditor 的行為可實現所需的結果。

            DefaultCellEditor editor = new DefaultCellEditor(new JTextField()) {
                @Override
                public boolean stopCellEditing() {
                    JTable table = (JTable) getComponent().getParent();
                    try {
                        String value = (String) getCellEditorValue();
                        if (Integer.parseInt(value) < 1) {
                            JTextField textField = (JTextField) getComponent();
                            textField.setBorder(new LineBorder(Color.red));
                            textField.selectAll();
                            textField.requestFocusInWindow();
                            return false;
                        }
                    } catch (NumberFormatException ex) {
                        return false;
                    }
                    return super.stopCellEditing();
                }
            };

然后添加到所需的表列中。

table.getColumnModel().getColumn(6).setCellEditor(editor);

編輯:如果拋出 NumberFormatException,則 if 語句中的行為不會發生,您可能希望將相同的代碼行放在 catch 中。

暫無
暫無

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

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