Добрый день!
У меня есть jTable, я заполняю его слушателем JButton. после заполнения jTable двойным щелчком мыши я вызываю JOptionPane.showMessageDialog. После этого проблема накапливается. После повторного нажатия кнопки JButton jTable снова заполняется. И если я дважды нажму на строку \ ячейка снова, он покажет мне 2 сообщения от JOptionPane вместо одного. Как я понимаю, мне нужно обновить sh модель, но у меня ничего не получилось.
Мой код:
Форма. java
btnExec = new JButton("Exec");
table = new JTable();
scrollPane.setViewportView(table);
// Create Button Listener
ActionListener startProcess = new ExecButtonPressed();
btnExec.addActionListener(startProcess);
ExecButtonPressed. java
public class ExecButtonPressed implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
try {
System.out.println("table rows:" + Form.table.getRowCount());
DefaultTableModel tableModel = new DefaultTableModel();
prepare(tableModel); // create headers
fill(tableModel); // add rows
Form.table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
Form.table.setModel(tableModel);
sortresize(Form.table); //resize width of columns + sort by id desc
Form.table.setDefaultEditor(Object.class, null);
DoubleClicker.whattodo(); // class of double-click behavior logic
}catch (Exception e1) {
e1.printStackTrace();
}
}
//
private void prepare(DefaultTableModel tableModel) throws Exception {
try {
tableModel.addColumn("id");
tableModel.addColumn("name");
tableModel.addColumn("age");
}catch (Exception e1) {
e1.printStackTrace();
}
}
//
private void fill(DefaultTableModel tableModel) {
Object [] line = {"01", "Qw" , "20"};
tableModel.addRow(line);
Object [] line2 = {"02", "As" , "21"};
tableModel.addRow(line2);
Object [] line3 = {"03", "Zx" , "22"};
tableModel.addRow(line3);
}
//
private void sortresize(JTable table) {
//Resize width
for (int column = 0; column < table.getColumnCount(); column++) {
TableColumn tableColumn = table.getColumnModel().getColumn(column);
if (column == 0) {
tableColumn.setPreferredWidth( 45 );
} else if (column == 1){
tableColumn.setPreferredWidth( 50 );
} else if (column == 2){
tableColumn.setPreferredWidth( 55 );
}
}
//Sort table.
if (table.getRowCount() > 1){
TableRowSorter<TableModel> sorter = new TableRowSorter<>(table.getModel());
table.setRowSorter(sorter);
List<RowSorter.SortKey> sortKeys = new ArrayList<>();
int columnIndexToSort = 0;
sortKeys.add(new RowSorter.SortKey(columnIndexToSort, SortOrder.DESCENDING));
sorter.setSortKeys(sortKeys);
sorter.sort();
};
}
//
}
DoubleClicker. java
public class DoubleClicker {
public static void whattodo() {
Form.table.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent mouseEvent) {
try {
System.out.println("click:" + mouseEvent.getClickCount());
Form.table = (JTable) mouseEvent.getSource();
Point point = mouseEvent.getPoint();
int row = Form.table.rowAtPoint(point);
int columnid = Form.table.columnAtPoint(point);
Form.table.convertRowIndexToModel(row);
Form.table.convertColumnIndexToModel(columnid);
if (mouseEvent.getClickCount() == 2 && Form.table.getSelectedRow() != -1) {
if (Form.table.getColumnName(columnid).equalsIgnoreCase("name")) {
JOptionPane.showMessageDialog(null,
(String) Form.table.getValueAt(row,columnid), "Selected name", 1);
}
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
}
}
Я пробовал разные варианты, например
tableModel.setRowCount(0);
tableModel.getDataVector().removeAllElements();
tableModel.fireTableDataChanged();
Может быть, я поставил его в неправильном месте? потому что каждый щелчок мыши регистрируется дважды при втором нажатии кнопки.
Обновление: я добавил
System.out.println("table rows:" + Form.table.getRowCount());
сразу после публикации c void actionPerformed (ActionEvent e) {и, как я вижу в консоли, Form.table.getRowCount () == 3 после выполнения второй кнопки. Также, как я вижу, добавлено
System.out.println("click:" + mouseEvent.getClickCount());
в качестве первой строки publi c void mousePressed (MouseEvent mouseEvent), после того, как 2-е нажатие кнопки в каждом клике по таблице выполняется дважды, которое я получил: click: 1 click : 1 при первом выполнении это просто щелчок: 1
Похоже, что одно представление за другим.
всей формы. java на случай, если кто-то будет щедрым на компиляцию
public class Form {
private JFrame frame;
public static JTable table;
public static JButton btnExec;
public static JScrollPane scrollPane;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Form window = new Form();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public Form() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
btnExec = new JButton("Exec");
btnExec.setBounds(10, 11, 89, 23);
frame.getContentPane().add(btnExec);
scrollPane = new JScrollPane();
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setBounds(10, 45, 369, 174);
frame.getContentPane().add(scrollPane);
table = new JTable();
scrollPane.setViewportView(table);
// Create Button Listener
ActionListener startProcess = new ExecButtonPressed();
btnExec.addActionListener(startProcess);
}
}