我有一个JFrame
,我构建了一个JTable
。
JTable
分两步进行:
我制作了一个函数initTable()
,我制作了我的表
我创建了另一个函数initDataintoTable()
,它将我的数据从arraylist广告到我的桌子。
到目前为止一切正常。当我尝试更新JTable
时出现问题。事实上,我打开JDialog
并尝试列表中的新项目。我到了使用新项目修改Arraylist
的问题,但我无法更新我的表格,我真的不知道在哪里放fireTableDataChanged()
例如以及如何调用它,当我想要它。
在initDataintoTable中,我将一个TableModelListener添加到我的DefaultTableModel表模型中。
protected void initDataIntoTable() {
tablemodel.setRowCount(0);
for (//every item on my list) {
String[] row = {dataitem, dataitem2};
tablemodel.addRow(row);
}
TableModelListener myjtable_listener = new TableModelListener() {
public void tableChanged(TableModelEvent e) {
// I have to write something here to update my table ?
// I don't know if it's here where I have to update my table and if it is, how should I call this listener from the place I want to update ?
tablemodel.fireTableDataChanged(); // ?
}
};
table.getModel().addTableModelListener(jtable_listener);
//tablemodel.addTableModelListener(myjtable_listener);
}
}
在我的jDialog中,我在Ok按钮上有一个ActionListener:
class OKButton implements ActionListener {
public void actionPerformed(ActionEvent e) {
// Here I manage to get my updated list of objects
// What should I call here to update my jtable ?
}
}
okbutton.addActionListener(new OKButton());
我已经在这个网站上看到了一些问题,但我尝试过的任何问题都与我的程序无关。 感谢您的帮助,对不起我的英语。
答案 0 :(得分:3)
您永远不必明确调用fireTableDataChanged
方法,因为数据更改后,TableModel实施可以通知 视图 插入/更新/删除)。
在您调用tablemodel.addRow(...)
的情况下,表格 模型 会通知 视图 数据已经改变,最后一个数据将被更新。
okButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
...
((DefaultTableModel)table.getModel()).addRow(...);
...
}
};
您在评论中说明:
如果没有getTable静态,我无法做
jframe.getTable()
,而我 如果不使表静态,则无法获得getTable()
静态。做完之后 这个,我的程序就像我想的那样工作。
如果您必须添加static
修饰符才能使其正常工作,那么您就遇到了设计问题。您的代码中可能存在变量的范围问题。请参阅下面的示例:InputDialog
是一个不同的类,它包含对没有任何static
变量的表模型的引用。
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
public class Demo {
private void createAndShowGUI() {
DefaultTableModel model = new DefaultTableModel(new Object[]{"TimeStamp", "Value"}, 0) {
@Override
public Class<?> getColumnClass(int columnIndex) {
switch(columnIndex) {
case 0: return Date.class;
default: return super.getColumnClass(columnIndex);
}
}
};
final JTable table = new JTable(model);
JButton button = new JButton("Add entry...");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new InputDialog((DefaultTableModel)table.getModel()).createAndShowGUI();
}
});
JFrame frame = new JFrame("Demo");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(new JScrollPane(table), BorderLayout.CENTER);
frame.add(button, BorderLayout.SOUTH);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
class InputDialog {
private final DefaultTableModel model;
public InputDialog(DefaultTableModel model) {
this.model = model;
}
public void createAndShowGUI() {
final JTextField textField = new JTextField(10);
textField.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
model.addRow(new Object[]{new Date(), textField.getText()});
Window window = SwingUtilities.windowForComponent((Component)e.getSource());
window.dispatchEvent(new WindowEvent(window, WindowEvent.WINDOW_CLOSING));
}
});
JPanel panel = new JPanel();
panel.add(new JLabel("Please input a value and press ENTER key:"));
panel.add(textField);
JDialog dialog = new JDialog();
dialog.setModal(true);
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.add(panel);
dialog.pack();
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Demo().createAndShowGUI();
}
});
}
}