Хорошо, теперь я заинтересован
Похоже, вы действительно должны очистить свой код, потому что вокруг много ссылок.
Причина, по которой вы не видите таблицу с выбранным индексом, заключается в том, что каждый раз, когда вы создаете новую JTable
, метод, в котором вы печатаете выбранную запись, все еще указывает на оригинал. Так как вы теперь отображаете «вновь» созданную таблицу, старая печатает -1
.
Причина, по которой вы получаете пустую таблицу при использовании DefaultTableModel
, заключается в том, что векторы равны null
(возможно, получены из комбинированного списка) и, следовательно, и данные, и заголовки исчезают из таблицы.
Вам не нужен подкласс, если вы все равно используете Object[][]
в качестве данных.
Итак, вот несколько упрощенный тестовый класс, который вы можете увидеть, чтобы исправить свой.
Я проверяю его как на вашем обычном TableModel
, так и на DefaultTableModel
Это не имеет никакого отношения к вашей пользовательской табличной модели, а к тому, как вы используете ваши ссылки.
Надеюсь, это поможет.
import javax.swing.*;
import java.awt.*;
import javax.swing.table.*;
import java.util.*;
import java.awt.event.*;
public class Test {
private DefaultTableModel tableModel = null;
//private AchievementTableModel tableModel = null;
private Object [] headers = new Object[]{"Name", "Last Name"};
private Object [][] data;
private Object [][] dataA = new Object[][]{{"Oscar","Reyes"},{"John","Doe"}};
private Object [][] dataB = new Object[][]{{"Color","Green"},{"Thing","Car"}};
private JTable table;
public static void main( String [] args ) {
Test test = new Test();
test.main();
}
public void main() {
// Create the frame
JFrame frame = new JFrame();
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
// Create the unique table.
table = new JTable();
frame.add(new JScrollPane( table ));
// Add two buttons
frame.add( new JPanel(){{
// swap table model button ( simulates combo )
add(new JButton("Change Table model"){{
addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
if( tableModel == null ) {
data = dataA;
tableModel = new DefaultTableModel( data, headers );
//tableModel = new AchievementTableModel( data, headers );
table.setModel( tableModel );
} else {
data = data == dataA ? dataB : dataA;
tableModel.setDataVector( data, headers );
//tableModel.replace( data ); // not needed DefaultTableModel already has it.
}
}
});
}});
// and print selectedRow button
add( new JButton("Print selected row"){{
addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
System.out.println(table.getSelectedRow());
}
});
}});
}}, BorderLayout.SOUTH);
// show the frame
frame.pack();
frame.setVisible( true );
}
}
Ваш подкласс без изменений.
class AchievementTableModel extends DefaultTableModel {
public AchievementTableModel(Object[][] c, Object[] co) {
super.dataVector = super.convertToVector(c);
super.columnIdentifiers = super.convertToVector(co);
}
public int getColumnCount() {return super.columnIdentifiers.size();}
public int getRowCount() {return super.dataVector.size();}
public String getColumnName(int c) {return (String)super.columnIdentifiers.get(c);}
@SuppressWarnings("unchecked")
public Object getValueAt(int r, int c) {return ((Vector<Object>)super.dataVector.get(r)).get(c);}
public boolean isCellEditable(int r, int c) {return false;}
public void replace(Object[][] c) {
super.dataVector = super.convertToVector(c);
super.fireTableDataChanged();
}
}
Попробуйте и посмотрите, как он не теряет ссылку на таблицу, и всегда печатайте правильные selectedRow
.
Сравните это с вашим кодом и исправьте его оттуда.