java-JDialog关闭刷新JFrame问题
这个场景是,我的JFrame上有一个名为“MainFrame”的JTable,我可以使用名为“EditFrame”的JDialog编辑保存在xml文件中的数据。我可以通过单击“EditFrame”上的保存按钮来更改xml文件中的数据,但它不会在“MainFrame”上重新加载JTable。大型机的代码如下所示:java-JDialog关闭刷新JFrame问题,java,swing,Java,Swing,这个场景是,我的JFrame上有一个名为“MainFrame”的JTable,我可以使用名为“EditFrame”的JDialog编辑保存在xml文件中的数据。我可以通过单击“EditFrame”上的保存按钮来更改xml文件中的数据,但它不会在“MainFrame”上重新加载JTable。大型机的代码如下所示: package ca.ism.wen.gui; import java.awt.BorderLayout; import java.awt.Container; ... import
package ca.ism.wen.gui;
import java.awt.BorderLayout;
import java.awt.Container;
...
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
public class MainFrame extends JFrame implements ActionListener{
static JTable jt = null;
static List<RdpServ> rdps = null;
static Vector<String> header = null;
static Vector<Vector<String>> data = null;
static TableModel tm = null;
public MainFrame(){
header = new Vector<String>();
...
loadData();
jt = new JTable(tm);
Container con = this.getContentPane();
JScrollPane p = new JScrollPane(jt);
con.add(p);
JButton btnEdit = new JButton("Edit");
btnEdit.setActionCommand("Edit");
btnEdit.addActionListener(this);
JButton btnLogout = new JButton("Logout");
btnLogout.setActionCommand("Logout");
btnLogout.addActionListener(this);
JPanel jp = new JPanel();
jp.add(btnEdit);
jp.add(btnLogout);
con.add(jp, BorderLayout.SOUTH);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(800,600);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if (cmd.equals("Edit")) {
EditFrame ef = new EditFrame();
ef.addWindowListener(new WindowAdapter(){
@Override
public void windowClosed(WindowEvent e) {
refresh();
}
});
}
else if (cmd.equals("Logout")) {
UserDao.signoff();
System.exit(0);
}
}
public static void refresh(){
loadData();
jt.repaint();
}
public static void loadData(){
rdps= UserDao.getRs();
data = new Vector<Vector<String>>();
for (RS rdp:rdps){
Vector<String> v = new Vector<String>();
...
data.add(v);
}
tm = new DefaultTableModel(data,header){
public boolean isCellEditable(int row, int column)
{
return false;
}
};
}
}
包ca.ism.wen.gui;
导入java.awt.BorderLayout;
导入java.awt.Container;
...
导入javax.swing.table.AbstractTableModel;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.table.TableModel;
公共类大型机扩展JFrame实现ActionListener{
静态JTable jt=null;
静态列表rdps=null;
静态向量头=null;
静态向量数据=空;
静态TableModel tm=null;
公共主机(){
header=新向量();
...
loadData();
jt=新的JTable(tm);
Container con=this.getContentPane();
JScrollPane=新的JScrollPane(jt);
续(p);
JButton btnEdit=新JButton(“编辑”);
btnEdit.setActionCommand(“编辑”);
btnEdit.addActionListener(这个);
JButton btnLogout=新JButton(“注销”);
btnLogout.setActionCommand(“注销”);
btnLogout.addActionListener(此);
JPanel jp=新的JPanel();
jp.add(btnEdit);
jp.add(btnLogout);;
con.add(jp,BorderLayout.SOUTH);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
设置大小(800600);
setVisible(真);
}
已执行的公共无效操作(操作事件e){
字符串cmd=e.getActionCommand();
if(cmd.equals(“编辑”)){
EditFrame ef=新的EditFrame();
ef.addWindowListener(新的WindowAdapter(){
@凌驾
公共无效窗口关闭(WindowEvent e){
刷新();
}
});
}
else if(cmd.equals(“注销”)){
UserDao.signoff();
系统出口(0);
}
}
公共静态无效刷新(){
loadData();
jt.repaint();
}
公共静态void loadData(){
rdps=UserDao.getRs();
数据=新向量();
用于(RS rdp:rdps){
向量v=新向量();
...
数据.添加(v);
}
tm=新的DefaultTableModel(数据,标题){
公共布尔值可编辑(int行,int列)
{
返回false;
}
};
}
}
我在谷歌上搜索了很多,并在网上尝试了这个解决方案。它们都不适用于我的代码。请帮忙。谢谢,伙计们
tm = new DefaultTableModel(data,header){
public boolean isCellEditable(int row, int column)
{
return false;
}
};
好的,在创建模型之后,我看不到您在loadData()
函数内将模型
添加回表
。创建tm
后,请尝试:jt.setmodel(tm)
,因为jt
是loadData()函数中的表实例
jt
,tm
有线名称,难以理解:将它们放大一点,例如:jTable
,tModel
等
编辑:
public static void loadData(){
rdps= UserDao.getRs();
data = new Vector<Vector<String>>();
for (RS rdp:rdps){
Vector<String> v = new Vector<String>();
...
data.add(v);
}
tm = new DefaultTableModel(data,header){
public boolean isCellEditable(int row, int column)
{
return false;
}
};
jt.setModel(tm); // <------------------- here
}
publicstaticvoidloaddata(){
rdps=UserDao.getRs();
数据=新向量();
用于(RS rdp:rdps){
向量v=新向量();
...
数据.添加(v);
}
tm=新的DefaultTableModel(数据,标题){
公共布尔值可编辑(int行,int列)
{
返回false;
}
};
jt.setModel(tm);//假设EditFrame
是一个模式对话框。您可以等待它返回,然后刷新表(模式对话框阻塞直到关闭)。另外,取决于你如何设置EditFrame
,windowClosed
我不会被触发…@MadProgrammer,我认为他没有在他的代码显示我时将模型添加回表中。我已经在回答中指出了这一点。@Sage虽然这是一个很好的观点,但仅凭代码片段很难知道。你可能是对的谢谢你的回复。我尝试了你的建议。在loadData()函数的末尾,我添加了jt=new JTable();jt.setModel(tm);当然,我删除了“jt=new JTable(tm);”在大型机构造函数中。但是,它仍然不起作用。@user2962555,为什么要删除jTable
?您不需要创建另一个jTable。您以前的实现很好。只需在load()中调用jt.setModel(tm)
函数。检查编辑是否有效。是的!!!非常感谢您,Sage。我非常感谢您的帮助。此外,我将根据您的建议更改我的标识符名称。谢谢!!