Редактирование ячеек и "Вещество" L & F в JTable - PullRequest
2 голосов
/ 07 марта 2011

Это дуэт вопросов, на которые, я думаю, лучше ответить вместе.

1) Как сделать весь JTable недоступным для редактирования?(Есть ли другой способ, кроме помещения его в цикл и использования метода isCellEditable?)

2) Теперь более сложный;Я использую DefaultTableCellRenderer (), который я переопределил, чтобы изменить пару вещей, таких как шрифты и т. Д. Проблема в том, что я также использую вещество L & F в своем приложении, и если я использую:

table.setDefaultRenderer(Object.class, renderer);

тогда я получу свои новые шрифты, но L & F уйдет за весь JTable.

Честно говоря, я нахожусь после эффекта затенения цвета на каждом другом ряду кожи вещества, и я не хочу терять его, но в то же время я также хотел бы использовать свой "расширенный рендер" ...

Есть идеи?Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 01 апреля 2011

С опозданием, но

1) Я предполагаю, что вы используете DefaultTableModel?

JTable table = null;
Vector dataVector = null;
Vector columnNames = null;
table.setModel(new DefaultTableModel(dataVector, columnNames) {
    @Override
    public boolean isCellEditable(int row, int column) {
        return false;
    }
});

Как правило, это не большая проблема, касающаяся отдельных методов в Java, и я могуНе понимаю, почему ты не хочешь этого делать.Более того, в целом, компонент не должен отвечать за решение о редактируемости.Что бы это значило для setEditable (true) для JTable с табличной моделью, которая выбирает данные, скажем, из RSS-канала?Вы не можете редактировать канал, и только модель знает это.Документ в памяти всегда доступен для редактирования, поэтому он работает для JTextComponent и его подклассов (JTextArea, JTextPane, JEditorPane, JTextField).

2) Вместо расширения DefaultTableCellRenderer, расширьте SubstanceDefaultTableCellRendRec.Это должно делать свое дело.То есть Substance хочет, чтобы вы возвращали подкласс SubstanceDefaultTableCellRenderer из getTableCellRendererComponent.Это не должно быть проблемой, если вы меняете только шрифт и цвет шрифта.Просто расширьте SubstanceDefaultTableCellRenderer и переопределите getTableCellRendererComponent, чтобы он выглядел как


class MyTableRenderer extends SubstanceDefaultTableCellRenderer {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {

        JLabel label = (JLabel)super.getTableCellRendererComponent(table,
            value, isSelected, hasFocus, row, column);
        label.setFont(label.getFont().deriveFont(Font.BOLD, 14));
        return label;
    }
}

Это зависит от вещества, и я не могу сказать, что мне это очень нравится.Это вызвало у меня несколько головных болей, так как у меня много пользовательских средств визуализации, которые я бы очень хотел не зависеть от Вещества.

2 голосов
/ 07 марта 2011

Для 1), просто ваш TableModel всегда возвращает false из метода isCellEditable () .Если вы просто используете простой экземпляр DefaultTableModel, расширьте его, чтобы переопределить этот метод.

для 2), вы можете изменить шрифты JTable в UIDefaults LookAndFeel.Класс UIDefaults содержит множество шрифтов, цветов, интервалов и других настроек для внешнего вида.

...