Поведение Java - JTable и TableCellRenderer - PullRequest
1 голос
/ 03 сентября 2011

У меня есть пользовательский JTable (15 строк по 20 столбцов), который был создан для работы со всеми JComponents.В настоящее время я использую его для смеси JComboBoxes, JTextFields и JButtons.О, и я использую Java5 (требование).

У меня два вопроса:

1) Первый касается класса TableCellRenderer и его единственного метода:

public Component getTableCellRendererComponent(final JTable table,
                                                   final Object value,
                                                   final boolean isSelected,
                                                   final boolean hasFocus,
                                                   final int row,
                                                   final int column) {...}

Все, что он делает, это приводит аргумент Object value к JComponent и потенциально меняет цвет фона.Ничего страшного.У меня вопрос, почему этот метод часто называется оооочень?При выборе одной ячейки она вызывается 23 раза.Когда Alt-Tabbing между двумя UNRELATED приложениями (я использую Win7), этот метод вызывается более 200 раз (и только для JButtons и JTextFields)!Нужно ли это каким-либо образом, и если нет, как я могу положить конец ненужным вызовам рендеринга?

2) Второй вопрос касается самой JTable.Когда я редактирую ячейку (курсор в JTextField и мигает) и щелкаю по другой ячейке, эта ячейка только выделена.Если я затем нажму на другую ячейку, я начну редактировать эту ячейку.Все, что я могу думать, это то, что из исходного компонента редактирования я выбираю JTable, а затем выбираю компонент внутри.Есть ли способ изменить это?Либо идти в одну сторону (всегда выбирает jtable при первом клике), либо другой (всегда входит в ячейку при первом клике).Я бы предпочел первый вариант, если это возможно.

Спасибо всем, кто может дать некоторое понимание / помощь!

1 Ответ

2 голосов
/ 03 сентября 2011

1) Почему вы храните Компоненты в TableModel? Это не эффективно. Вы должны хранить данные в TableModel. JTable был разработан для визуализации данных с использованием одного компонента. По умолчанию для рендеринга обычно используется JLabel. Затем при редактировании ячейки используется другой компонент.

Когда вы щелкаете по ячейке, вам может потребоваться повторно отобразить предыдущую строку (чтобы удалить выделенную строку), а затем отобразить текущую строку с выделенной областью. Таким образом, средство визуализации вызывается для каждой видимой ячейки, на которую влияют. Вкладка в приложение, вероятно, приводит к повторному отображению всех видимых ячеек.

2) Трудно ответить, так как это не стандартное поведение. Вы также должны использовать пользовательские редакторы, и я не знаю, как выглядит ваш пользовательский код. В редакторе по умолчанию есть метод setClickCountToStart (), который по умолчанию равен 2. Возможно, вы установили его на 1.

Измените ваше решение на использование данных (не компонентов) в TableModel и опубликуйте SSCCE , если у вас есть дополнительные вопросы.

...