【java】swing中jtable点击事件

最近,笔者遇到这样一个需求:利用jtable显示结果,当双击某一行时,显示该记录的具体细节。

思路:将具体细节存放在一个文件中,当鼠标双击某一行时,找到对应的文件,并将文件的内容呈现出来。

1.设置单元格不可编辑

DefaultTableModel mm = new DefaultTableModel() {

private static final long serialVersionUID = 1L;

// 设置单元格不可编辑

public boolean isCellEditable(int rowIndex, int ColIndex) {

return false;

}

};

// 准备数据......

准备数据部分根据您的需求而定,这里提供一个参考:

String[] columnNames = { "序号", "能耗成本", "管道混合成本", "罐底混合成本", "切换次数", "用罐个数" };

mm.setColumnIdentifiers(columnNames);

FileReader reader = new FileReader(filePath);

BufferedReader br = new BufferedReader(reader);

String line;

int lineNo = 1;

while ((line = br.readLine()) != null) {

String data[] = line.split(" ");

// 一次读入一行数据

Vector v = new Vector<>(5);

v.add(0, lineNo + "");

v.add(1, data[0]);

v.add(2, data[1]);

v.add(3, data[2]);

v.add(4, data[3]);

v.add(5, data[4]);

mm.addRow(v);

lineNo++;

}

// 关闭读写器

br.close();

reader.close();

// 不要在UI线程外更新操作UI,这里SwingUtilities会找到UI线程并执行更新UI操作

SwingUtilities.invokeLater(() -> {

resultTable.setModel(mm);

boolean[] flags = new boolean[mm.getRowCount()];

for (int i = 0; i < mm.getRowCount(); i++) {

Map referenceCost = Config.getInstance().referenceCost;

Map resultCost = new HashMap();

resultCost.put("energyCost", Double.parseDouble(mm.getValueAt(i, 1) + ""));

resultCost.put("pipeMix", Double.parseDouble(mm.getValueAt(i, 2) + ""));

resultCost.put("tankMix", Double.parseDouble(mm.getValueAt(i, 3) + ""));

resultCost.put("chargeTime", Double.parseDouble(mm.getValueAt(i, 4) + ""));

resultCost.put("tankUsed", Double.parseDouble(mm.getValueAt(i, 5) + ""));

}

// 突出显示非支配解

setRowsColor(resultTable, flags);

});

值得提醒的是,上面的代码需要查询文件,一般比较耗时,因此,笔者采用的是多线程更新的方式,以防止UI阻塞。

2.设置鼠标双击事件

JTable resultTable = new JTable();

resultTable.setEnabled(false);

resultTable.addMouseListener(new MouseListener() {

@Override

public void mouseReleased(MouseEvent e) {

}

@Override

public void mousePressed(MouseEvent e) {

}

@Override

public void mouseExited(MouseEvent e) {

}

@Override

public void mouseEntered(MouseEvent e) {

}

@Override

public void mouseClicked(MouseEvent e) {

// 点击几次,这里是双击事件

if (e.getClickCount() == 2) {

int row = resultTable.getSelectedRow();

System.out.println(row);

}

}

});