Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTable和DefaultTableModel dosen';刷新表数据_Java_Swing_Jtable_Jscrollpane_Defaulttablemodel - Fatal编程技术网

Java JTable和DefaultTableModel dosen';刷新表数据

Java JTable和DefaultTableModel dosen';刷新表数据,java,swing,jtable,jscrollpane,defaulttablemodel,Java,Swing,Jtable,Jscrollpane,Defaulttablemodel,我在更新/刷新表中的数据时遇到问题。我使用的是DefaultTableModel。以下是代码,请分享您的知识和建议。致以最良好的祝愿 *编辑1:* 最初的代码有一个更新表数据的函数,但这被证明是错误的,因为构造函数一次又一次地创建新的JTable和新的JScrollPane。这就是为什么我创建了新的构造函数,并修复了这个bug。在我实现了新的构造函数之后,表数据仍然没有刷新。接下来,我尝试调试构造函数从另一个类(passDatatoTable类)接收的数据。在使用函数setValueAt()和S

我在更新/刷新表中的数据时遇到问题。我使用的是DefaultTableModel。以下是代码,请分享您的知识和建议。致以最良好的祝愿

*编辑1:* 最初的代码有一个更新表数据的函数,但这被证明是错误的,因为构造函数一次又一次地创建新的JTable和新的JScrollPane。这就是为什么我创建了新的构造函数,并修复了这个bug。在我实现了新的构造函数之后,表数据仍然没有刷新。接下来,我尝试调试构造函数从另一个类(passDatatoTable类)接收的数据。在使用函数setValueAt()和System.out.println(getValueAt(I,1))之后,输出为null。就这样 首先是创建gui的主类:

import javax.swing.*;
public class Glavni {
public static void main(String[] args)  {
// TODO Auto-generated method stub
SwingUtilities.invokeLater(new Runnable() {
    public void run() {
            gui Scanner = new gui();
            Scanner.setVisible(true);
    }
});
}

}
第二个是将数据发送到gui的类

public class passDatatoTable {
public void passData(){
String str1,str2,str3,str4;
for (int i =0;i<=10;i++){
        str1="Column 1 of row: "+i;
        str2="Column 2 of row: "+i;
        str3="Column 3 of row: "+i;
        str4="Column 4 of row: "+i;
        gui SendStringsToGUI = new gui(str1, str2, str3, str4);

}
}
}
这里是ActionListeners。按钮next和prev用于分页,按钮adddata用于创建类passDatatoTable的变量,该类用于填充表的数据

以下是代码:

public class gui extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
String[][] data = new String[100][4];

String[] columnNames = new String[]{
     "IP", "PC_NAME", "ttl", "db"
 };
 DefaultTableModel model = new DefaultTableModel(data,columnNames);


 JTable table =  new JTable(model);
 JScrollPane scrollPane = new JScrollPane(table);
 int i=0;
 public gui(String IP, String PC_NAME, String ttl, String gw) {
//Used this constructor to avoid creating new gui in other classes  
model.setValueAt(IP, i, 0);
    model.setValueAt(PC_NAME, i, 1);
    model.setValueAt(ttl, i, 2);
    model.setValueAt(gw, i, 3);
    i++;
    model.fireTableDataChanged();
    table.repaint();
    scrollPane.repaint();

}
    gui(){

    JButton addData= new JButton("Add Data");
    JButton next = new JButton("next");
    JButton prev = new JButton("prev");
    addData.addActionListener(this);
    next.addActionListener(this);
    prev.addActionListener(this);
    JPanel panel = new JPanel(new BorderLayout());
    JPanel buttonPanel = new JPanel();
    buttonPanel.add(addData);
    buttonPanel.add(prev);
    buttonPanel.add(next);
    panel.add(buttonPanel, BorderLayout.SOUTH);
    panel.add(table.getTableHeader(), BorderLayout.PAGE_START);
    panel.add(scrollPane, BorderLayout.CENTER);
    getContentPane().add(panel);
    }
public void actionPerformed(ActionEvent e) {
if ("Add Data".equals(e.getActionCommand())){

    passDatatoTable passSomeData = new passDatatoTable();
    passSomeData.passData();
          }
if ("next".equals(e.getActionCommand())) {
     Rectangle rect = scrollPane.getVisibleRect();
     JScrollBar  bar = scrollPane.getVerticalScrollBar();
     int blockIncr = scrollPane.getViewport().getViewRect().height;
         bar.setValue(bar.getValue() + blockIncr);
         scrollPane.scrollRectToVisible(rect);
 }
 if ("prev".equals(e.getActionCommand())) {
     Rectangle rect = scrollPane.getVisibleRect();
     JScrollBar  bar = scrollPane.getVerticalScrollBar();
     int blockIncr = scrollPane.getViewport().getViewRect().height;
         bar.setValue(bar.getValue() - blockIncr);
         scrollPane.scrollRectToVisible(rect);
 }

 }

您的问题可能在这里:

class passDatatoTable {
   public void passData() {
      String str1, str2, str3, str4;
      for (int i = 0; i <= 10; i++) {
         str1 = "Column 1 of row: " + i;
         str2 = "Column 2 of row: " + i;
         str3 = "Column 3 of row: " + i;
         str4 = "Column 4 of row: " + i;
         gui SendStringsToGUI = new gui(str1, str2, str3, str4); // **** line (A)
      }
   }
}

您的问题可能在这里:

class passDatatoTable {
   public void passData() {
      String str1, str2, str3, str4;
      for (int i = 0; i <= 10; i++) {
         str1 = "Column 1 of row: " + i;
         str2 = "Column 2 of row: " + i;
         str3 = "Column 3 of row: " + i;
         str4 = "Column 4 of row: " + i;
         gui SendStringsToGUI = new gui(str1, str2, str3, str4); // **** line (A)
      }
   }
}

您似乎正在为新的
Gui
对象设置表模型数据,该对象与当前显示的
Gui
不关联,因此
JTable
表中没有显示任何内容

使用模型更新方法将允许您根据需要更新模型数据:

public void updateModel(String IP, String PC_NAME, String ttl, String gw) {
   model.setValueAt(IP, i, 0);
   model.setValueAt(PC_NAME, i, 1);
   model.setValueAt(ttl, i, 2);
   model.setValueAt(gw, i, 3);
   i++;
}
您需要将
Gui
对象的引用传递给
PassDatatoTable
对象。后一个对象在其当前形式中几乎没有功能,因此最好将此功能引入
Gui
类中

此外,无需致电:

model.fireTableDataChanged();

这将自动发生。

您似乎正在为新的
Gui
对象设置表格模型数据,该对象与当前显示的
Gui
不关联,因此
JTable
表格中没有显示任何内容

使用模型更新方法将允许您根据需要更新模型数据:

public void updateModel(String IP, String PC_NAME, String ttl, String gw) {
   model.setValueAt(IP, i, 0);
   model.setValueAt(PC_NAME, i, 1);
   model.setValueAt(ttl, i, 2);
   model.setValueAt(gw, i, 3);
   i++;
}
您需要将
Gui
对象的引用传递给
PassDatatoTable
对象。后一个对象在其当前形式中几乎没有功能,因此最好将此功能引入
Gui
类中

此外,无需致电:

model.fireTableDataChanged();

这将自动发生。

谢谢大家的帮助。最后我解决了这个问题。重要的是将一个对象发送给在表中填充数据的类。换句话说,我就是这么做的:

还记得向表传递数据的类吗?就像我在这里做的那样修改它:

public class passDatatoTable {
passDatatoTable(ScanFrame gui){
    String str1,str2,str3;

    for (int i =0;i<=10;i++){
            str1="Column 1 of row: "+i;
            str2="Column 2 of row: "+i;
            str3="Column 3 of row: "+i;
            gui.model.setValueAt(str1, gui.i, 0);
            gui.model.setValueAt(str2, gui.i, 2);
            gui.model.setValueAt(str3, gui.i, 3);
            gui.i++;
    }
}}
现在重要的时刻到来了。Remmember按钮“添加数据”?您所需要做的并不是将此gui的引用发送到将数据填充到表中的类(passDatatoTable类),它将正常工作

public void actionPerformed(ActionEvent e) {
if ("Add Data".equals(e.getActionCommand())){

passDatatoTable passSomeData = new passDatatoTable();
passSomeData.passData(this);//here!! just add this and it will work!!
      }
if ("next".equals(e.getActionCommand())) {
 Rectangle rect = scrollPane.getVisibleRect();
 JScrollBar  bar = scrollPane.getVerticalScrollBar();
 int blockIncr = scrollPane.getViewport().getViewRect().height;
     bar.setValue(bar.getValue() + blockIncr);
     scrollPane.scrollRectToVisible(rect);
}
if ("prev".equals(e.getActionCommand())) {
 Rectangle rect = scrollPane.getVisibleRect();
 JScrollBar  bar = scrollPane.getVerticalScrollBar();
 int blockIncr = scrollPane.getViewport().getViewRect().height;
     bar.setValue(bar.getValue() - blockIncr);
     scrollPane.scrollRectToVisible(rect);
}

}
编辑

import javax.swing.*;
 public class Glavni {
public static void main(String[] args)  {
    // TODO Auto-generated method stub
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
                gui Scanner = new gui();
                Scanner.CreateAndShowGUI();
        }
    });
}

    }
忘记添加主类。给你。
如果你有任何问题,请提出。感谢“装满鳗鱼的气垫船”和“赖美乌斯”为他们的时间提供的巨大帮助

谢谢你们的帮助。最后我解决了这个问题。重要的是将一个对象发送给在表中填充数据的类。换句话说,我就是这么做的:

还记得向表传递数据的类吗?就像我在这里做的那样修改它:

public class passDatatoTable {
passDatatoTable(ScanFrame gui){
    String str1,str2,str3;

    for (int i =0;i<=10;i++){
            str1="Column 1 of row: "+i;
            str2="Column 2 of row: "+i;
            str3="Column 3 of row: "+i;
            gui.model.setValueAt(str1, gui.i, 0);
            gui.model.setValueAt(str2, gui.i, 2);
            gui.model.setValueAt(str3, gui.i, 3);
            gui.i++;
    }
}}
现在重要的时刻到来了。Remmember按钮“添加数据”?您所需要做的并不是将此gui的引用发送到将数据填充到表中的类(passDatatoTable类),它将正常工作

public void actionPerformed(ActionEvent e) {
if ("Add Data".equals(e.getActionCommand())){

passDatatoTable passSomeData = new passDatatoTable();
passSomeData.passData(this);//here!! just add this and it will work!!
      }
if ("next".equals(e.getActionCommand())) {
 Rectangle rect = scrollPane.getVisibleRect();
 JScrollBar  bar = scrollPane.getVerticalScrollBar();
 int blockIncr = scrollPane.getViewport().getViewRect().height;
     bar.setValue(bar.getValue() + blockIncr);
     scrollPane.scrollRectToVisible(rect);
}
if ("prev".equals(e.getActionCommand())) {
 Rectangle rect = scrollPane.getVisibleRect();
 JScrollBar  bar = scrollPane.getVerticalScrollBar();
 int blockIncr = scrollPane.getViewport().getViewRect().height;
     bar.setValue(bar.getValue() - blockIncr);
     scrollPane.scrollRectToVisible(rect);
}

}
编辑

import javax.swing.*;
 public class Glavni {
public static void main(String[] args)  {
    // TODO Auto-generated method stub
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
                gui Scanner = new gui();
                Scanner.CreateAndShowGUI();
        }
    });
}

    }
忘记添加主类。给你。
如果你有任何问题,请提出。感谢“装满鳗鱼的气垫船”和“赖美乌斯”为他们的时间提供的巨大帮助

您可能希望花费一些精力来描述问题的细节。到底发生了什么?应该发生什么?你采取了什么步骤来调试这个问题?好的,我会更新我的问题,我会告诉你我是怎么解决这个问题的。可能的问题重复了。请不要再发布完全相同的问题,而是坚持旧的问题,试着理解答案。你还需要1)更改命名方案,以符合Java命名约定。类名称以大写字母开头,而方法和变量名称以小写字母开头。2)接受前面问题中的一些答案。你可能希望花费一些精力描述问题的细节。到底发生了什么?应该发生什么?你采取了什么步骤来调试这个问题?好的,我会更新我的问题,我会告诉你我是怎么解决这个问题的。可能的问题重复了。请不要再发布完全相同的问题,而是坚持旧的问题,试着理解答案。你还需要1)更改命名方案,以符合Java命名约定。类名称以大写字母开头,而方法和变量名称以小写字母开头。2)接受前面问题中的一些答案。感谢大家的帮助。我确实用了你的建议,但效果很好。谢谢你们的帮助,谢谢你们的帮助。我确实用了你的建议,但效果很好。感谢您的帮助。您需要在此处以及有关stackoverflow的其他问题中接受最佳答案。您需要在此处以及有关stackoverflow的其他问题中接受最佳答案。