Выбор строки JTable - событие не запускается и синий цвет не отображается
У меня есть JTable, который позволяет только выбор строки с использованием ListSelectionListener, как показано в фрагменте кода ниже. В JTable есть две проблемы:
Q1) Хотя я установил первую строку, выбранную по умолчанию, с помощью метода setSelectionRow, связанное событие listSelection не запускается при запуске программы. Событие запускается, только если я нажимаю на другую строку, но не на первую строку. Что, по вашему мнению, я должен сделать, чтобы это исправить, учитывая приведенный ниже код?
Q2) Когда я выбираю строку, она не окрашена в синий цвет в JTable. Я заметил, что это начало происходить после того, как я ввел ListSelectionListener в модель выбора JTable. Перед добавлением слушателя таблица делала этот цвет бизнеса, когда я выбрал строку. Что, по вашему мнению, я должен сделать, чтобы это исправить, учитывая приведенный ниже фрагмент кода? Большое спасибо.
jTableBookings = new javax.swing.JTable();
jTableBookings.setModel(new MyBookingTableModel(bookingTableData));
jTableBookings.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
jTableBookings.setRowSelectionAllowed(true);
jTableBookings.setCellSelectionEnabled(false);
jTableBookings.setColumnSelectionAllowed(false);
initColumnSizesForMinaBokBokningarJTable(jTableBookings);
//QUESTION 1
//Set selected row to first row for inital load.
if (jTableBookings.getModel().getRowCount() > 0) {
jTableBookings.setRowSelectionInterval(0, 0);
}
//QUESTION 2
jTableBookings.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
int sel = jTableBookings.getSelectedRow();
fillBookingRecordFields(sel); //Here we do some business logic based on the selected row
}
});
jScrollPane9.setViewportView(jTableBookings);
1 ответ
1) myTable.changeSelection (строка, столбец, ложь, ложь);
2) отключить setCellSelectionEnabled() и setColumnSelectionAllowed(), затем работает
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
class SelectedColumnTest {
private JTableHeader header;
private Object selectedColumn = null;
private String[] columnNames = {"String", "Integer", "Boolean"};
private Object[][] data = {{"aaa", 12, true}, {"bbb", 5, false}, {"CCC", 92, true}};
private TableModel model = new DefaultTableModel(data, columnNames) {
private static final long serialVersionUID = 1L;
@Override
public Class<?> getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};
private JTable table = new JTable(model);
public JComponent makeUI() {
//table.setRowSelectionAllowed(true);
//table.setCellSelectionEnabled(false);
//table.setColumnSelectionAllowed(false);
JPanel p = new JPanel(new BorderLayout());
p.add(new JScrollPane(table));
table.setPreferredScrollableViewportSize(table.getPreferredSize());
table.changeSelection(0, 0, false, false);
return p;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
createAndShowGUI();
}
});
}
public static void createAndShowGUI() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(new SelectedColumnTest().makeUI());
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}