美好的一天!
我有一个jTable,我由JButton侦听器填充它。在通过鼠标双击填充jTable之后,我调用JOptionPane.showMessageDialog。之后,该问题被指责。再次单击JButton后,将再次填充jTable。如果我再次双击row \ cell,它将显示JOptionPane的2条消息,而不是一条。据我了解,我需要刷新模型,但没有成功。
我的代码:
Form.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());
在公共无效actionPerformed(ActionEvent e)之后{正如我在控制台中看到的,第二个按钮执行后,Form.table.getRowCount()== 3。还添加了
System.out.println("click:" + mouseEvent.getClickCount());
作为public void mousePressed(MouseEvent mouseEvent)的第一行正如我所看到的,在每次单击表中的第二个按钮执行两次之后我有 :点击数:1点击数:1第一次执行时,只需点击:1
似乎有一个接一个的视图。
整个Form.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);
}
}
美好的一天!我有一个jTable,我正在通过JButton侦听器填充它。在通过鼠标双击填充jTable之后,我调用JOptionPane.showMessageDialog。之后,该问题被指责。单击后...
在coderanch论坛上得到了答案,决定在那里提交。也许将来有人会需要它。