【发布时间】:2015-08-07 07:19:58
【问题描述】:
我正在开发的 GUI 中有一个 JTable。 The rows and columns in the JTable get filled in when a specific node in the JTree is selected.当我第一次在 JTree 中选择一个节点时,表格会被填充值。当我选择某个其他节点时,表会更新,但与该节点对应的值会作为附加行添加到现有 JTable(其中包含来自前一个节点的值)中。我真正想要的是刷新整个表,因为新值属于与节点对应的不同文件。我尝试查看不同的解决方案,例如
fireTableDataChanged()
repaint()
revalidate()
但到目前为止没有任何效果。这是执行操作的代码部分。
private static final Object[][] rowData = {};
private static final Object[] columnNames = {"m/z","Intensity"};
private static DefaultTableModel listTableModel = new DefaultTableModel(rowData,columnNames){
//make the cells in the JTable non-editable
@Override
public boolean isCellEditable(int row, int column) {
//all cells false
return false;
}
};
private static final JTable spectralDataTable = new JTable(listTableModel);
private JPanel spectralContent;
public void actionPerformed(ActionEvent e) {
//Handle open button action.
if (e.getSource() == OpenFileButton) {
int returnVal = fc.showOpenDialog(GUIMain.this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
file = fc.getSelectedFile();
File[] filesInDirectory = file.listFiles();
SortFile sf = new SortFile();
// Calls sortByNumber method in class SortFile to list the files number wise
filesInDirectory = sf.sortByNumber(filesInDirectory);
tree = new JTree(addNodes(null, filesInDirectory, file));
// Add a listener
tree.addTreeSelectionListener(new TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent e) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) e
.getPath().getLastPathComponent();
System.out.println("You selected " + node);
ReadFile rf = new ReadFile();
System.out.println(node.getParent().toString());
ArrayList<String> fileDataOfSelectedNode = rf.fileInput(node.getParent().toString() + "/" + node.toString());
// Call the listTo Array Method which converts the list containing coordinates + m/z and int columns to string array
InputData inputDataObject = new InputData();
String[] fileDataArrayI = inputDataObject.listToArray(fileDataOfSelectedNode);
float[] mzArray = new float[fileDataArrayI.length];
float[] intensityArray = new float[fileDataArrayI.length];
float[] mzList = new float[fileDataArrayI.length];
RawDataStorage dsr;
dsr = inputDataObject.extractMzIntensity(fileDataArrayI, mzArray, intensityArray, node.toString());
for(int i = 0; i<dsr.mzArray.length;i++)
{
System.out.println(dsr.mzArray[i]);
listTableModel.addRow(new Object[]{dsr.mzArray[i], dsr.intensityArray[i]});
}
// listTableModel.fireTableDataChanged();
// spectralDataTable.repaint();
listTableModel.fireTableDataChanged();
spectralDataTable.getModel().addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent e) {
spectralDataTable.repaint();
spectralDataTable.revalidate();
}
});
}
});
System.out.println("After the loops");
spectralDataTable.setCellEditor(null);
spectralDataTable.getTableHeader().setFont(new Font("SansSerif", Font.BOLD, 12));
spectralDataTable.setFocusable(false);
spectralDataTable.setRowSelectionAllowed(true);
spectralDataScrollPane = new JScrollPane(spectralDataTable);
spectralDataScrollPane.setPreferredSize(new Dimension(170, 250));
spectralDataScrollPane.setVisible(true);
spectralContent.add(spectralDataScrollPane);
spectralContent.validate();
spectralContent.repaint();
spectralFilesScrollPane = new JScrollPane();
spectralFilesScrollPane.getViewport().add(tree);
spectralFilesScrollPane.setPreferredSize(new Dimension(290, 465));
content.add(spectralFilesScrollPane);
// // content.invalidate();
content.validate();
content.repaint();
}
}
}
谁能帮我指出错误?
【问题讨论】:
-
我无法理解您要做什么?默认表模型负责触发事件等。您无需执行任何操作。为什么要在最后添加几行时刷新整个表?
-
我不想在最后添加行。树中的每个节点都是一个文件名。当我单击树中的一个节点时,将读取与该节点对应的文件,并将该文件中的数据显示在 JTable 中。所有文件都有不同的值,因此每次都应该更改整个 JTable。
标签: java user-interface jtable jtree defaulttablemodel