Я новичок в работе с JTables и затрудняюсь с тем, чтобы мой редактор JTable работал правильно.Странное мигание ячейки при выборе с помощью пользовательского редактора ячеек
У меня есть несколько пользовательских панелей со списками и кнопками. Для визуализации их в ячейке я использую настраиваемый PanelCellRenderer, который имеет различные конструкторы для каждого типа панели.
Чтобы сделать кнопки доступными, я создал этот простой PanelCellEditor, который расширяет DefaultCellEditor. Чтобы получить доступ к данным, хранящимся в ячейках во время редактирования, я передаю ссылку на PanelCellRenderer.
Проблема, с которой я столкнулась, заключается в том, что, когда я выбираю ячейку (щелкая на ней), из отображения списка с помощью кнопки выбранная ячейка становится полностью пустой. Когда ячейка будет отменена, список с данными и кнопка снова появятся. Любые советы по этому вопросу будут полезны. Благодарю.
public class PanelCellEditor extends DefaultCellEditor {
private PanelCellRenderer pcr;
private Object value;
public PanelCellEditor(final PanelCellRenderer pcr) {
super(new JCheckBox());
this.pcr = pcr;
this.pcr.setOpaque(true);
if (pcr.firstPanel != null) {
pcr.firstPanel.Button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//do something
fireEditingStopped();
}
});
pcr.firstPanel.List.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
String value = (String) ((javax.swing.JList) e.getSource()).getSelectedValue();
//do something
fireEditingStopped();
}
});
}
else if (pcr.secondPanel != null) {
pcr.secondPanel.Button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//do something
fireEditingStopped();
}
});
pcr.secondPanel.List.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
String value = (String) ((javax.swing.JList) e.getSource()).getSelectedValue();
//do something
fireEditingStopped();
}
});
}
}
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
//// if I comment this whole bit ////
if (isSelected) {
pcr.setForeground(table.getSelectionForeground());
pcr.setBackground(table.getSelectionBackground());
} else {
pcr.setForeground(table.getForeground());
pcr.setBackground(table.getBackground());
}
if (pcr.firstPanel != null)
pcr.firstPanel.list.setListData((String[])value);
else if (pcr.secondPanel != null) {
pcr.secondPanel.list.setListData((String[])value);
}
//////// nothing changes /////////
this.value = value;
return pcr;
}
public Object getCellEditorValue() {
return value;
}
public boolean stopCellEditing() {
return super.stopCellEditing();
}
protected void fireEditingStopped() {
super.fireEditingStopped();
}
}