java - JTable 关于无效值的警报

标签 java swing

所以我有一个带有自定义模型的可编辑 Jtable(实际上是 TreeTable)。当前的 setValueAt 方法需要更新,以防止值大于一定数量(取决于行)。

这很容易预防(如果该值无效,则只需不要设置该值),但是通知用户所选金额无效的最佳方法是什么?从模型中弹出对话框似乎相当令人讨厌。

最佳答案

Popping a dialog from the model seems rather nasty.

同意。对列使用自定义编辑器。也许是这样的:

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

public class TableEdit extends JFrame
{
    TableEdit()
    {
        JTable table = new JTable(5,5);
        table.setPreferredScrollableViewportSize(table.getPreferredSize());

        JScrollPane scrollpane = new JScrollPane(table);
        getContentPane().add(scrollpane);

        //  Use a custom editor

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

    class FiveCharacterEditor extends DefaultCellEditor
    {
        FiveCharacterEditor()
        {
            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(
                        null,
                        "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;
        }

    }

    public static void main(String [] args)
    {
        JFrame frame = new TableEdit();
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
    }
}

关于java - JTable 关于无效值的警报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6913767/

相关文章:

java - 在 Java 中, boolean 运算还是整数运算更快?

java - 按列打印二维字符串数组

java - 使用 Java 获取 Solr Server 的架构以查找复制字段

java - 将 JLabels 添加到面板时,JScrollPane 不会变大

java - 初始化菜单时停止来自套接字的错误输入

java - 如何在不舍入的情况下将数字从 double 转换为 int?

java - JFrame 中的移动问题

java - 一个 jtextfields 中 jtextfields 的总和值

java - Java Swing 组件上的 Z 顺序

java - (IntelliJ GUI Designer) 将组件添加到 JPanel 时出现运行时 NullPointerException