JTable - Как установить текстовую маску для ячеек в определенном столбце?

1

У меня есть JTable, который пользователь сможет добавлять, редактировать и удалять ячейки (все это без дополнительных компонентов, кроме JTable). Я хочу установить пользовательскую маску (похожую на JFormattedTextField) для всех ячеек определенного столбца.

Пример: JTable имеет 2 столбца: время и описание. Все ячейки из столбца "Время" имеют маску HH: MM, а ячейки из столбца "Описание" не имеют маски.

Как я могу это достичь?

Благодарю.

Теги:
cell
swing
mask
jtable

2 ответа

1
Лучший ответ

Хорошо, похоже, я нашел хорошее решение. В этой теме: Изменение шрифта JTable Cell во время редактирования. Вот этот код на решающем ответе:

DefaultCellEditor dce = new DefaultCellEditor( textField );
myTable.getColumnModel().getColumn(1).setCellEditor(dce);

Затем я адаптировался к использованию MaskFormatter:

table.setModel(new DefaultTableModel(new String[][] { } , new String[] {"Time", "Description"} ) );
JFormattedTextField ftext = new JFormattedTextField();
MaskFormatter mask;
try {
    mask = new MaskFormatter("##:##");
    mask.install(ftext);
} catch (ParseException e) {
    e.printStackTrace();
}
table.getColumnModel().getColumn(0).setCellEditor(new DefaultCellEditor(ftext));

Это было в основном тем, что я искал. Спасибо за ответы.

  • 0
    Я пытался добиться того же, но когда я попробовал вашу реализацию, маска воздействует только на первую ячейку, в которой я щелкаю в столбце. У тебя та же проблема?
3

Существует вопрос здесь о проверке JTable поле для адреса IP. В принятом ответе SO User (peeskillet) показывает, как проверять ввод для JTable с регулярным выражением как "маска". Если вы можете приспособить регулярное выражение к своей маске и изучить его код, он любезно предоставил его, чтобы вы пошли в правильном направлении.

Удачи!

РЕДАКТИРОВАТЬ

Код, который я имею в виду:

import javax.swing.DefaultCellEditor;
import javax.swing.InputVerifier;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;

public class TableVerifyInput {

//The 'mask' as you say for the fields
private static final String IP_REGEX = "^(?:[0-9]{1,3}\\.){3}[0-9]{1,3}$";

public TableVerifyInput() {
    final InputVerifier verifier = getInputVerifier();
    final DefaultCellEditor editor = getTableCellEditor(verifier);

    String[] cols = {"IP address", "Column 2"};
    Object[][] data = {{null, null}, {null, null}};
    DefaultTableModel model = new DefaultTableModel(data, cols);

    JTable table = new JTable(model) {
        public TableCellEditor getCellEditor(int row, int column) {
            int modelColumn = convertColumnIndexToModel(column);

            if (modelColumn == 0) {
                return editor;
            } else {
                return super.getCellEditor(row, column);
            }
        }
    };

    JFrame frame = new JFrame("Table Cell Verify");
    frame.add(new JScrollPane(table));
    frame.pack();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}

private InputVerifier getInputVerifier() {
    InputVerifier verifier = new InputVerifier() {

        @Override
        public boolean verify(JComponent input) {
            JTextField field = (JTextField) input;
            String text = field.getText();
            return text.matches(IP_REGEX) || text.isEmpty();
        }

        @Override
        public boolean shouldYieldFocus(JComponent input) {
            boolean valid = verify(input);
            if (!valid) {
                JOptionPane.showMessageDialog(null, "Invalid IP address");
            }
            return valid;
        }

    };
    return verifier;
}

private DefaultCellEditor getTableCellEditor(final InputVerifier verifier) {
    DefaultCellEditor editor = new DefaultCellEditor(new JTextField()) {
        {
            getComponent().setInputVerifier(verifier);
        }

        @Override
        public boolean stopCellEditing() {
            if (!verifier.shouldYieldFocus(getComponent())) {
                return false;
            }
            return super.stopCellEditing();
        }

        @Override
        public JTextField getComponent() {
            return (JTextField) super.getComponent();
        }

    };
    return editor;
}

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

Еще раз, кредит для SO User peeskillet для этого вклада.

  • 0
    Если я правильно понял его код, он проверяет, ввел ли пользователь текст в указанном формате регулярных выражений, а затем выдает ошибку, если она ошибочна. Но то, что я действительно ищу, это маска редактирования, потому что я не хочу беспокоить пользователя сообщениями об ошибках.
  • 0
    Что конкретно вы подразумеваете под маской редактирования? Где это только позволяет вам вводить определенные символы или что-то подобное?
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню