Java - 使用fireTableDataChanged()更新JTable;

时间:2012-04-15 14:36:59

标签: java swing jtable jbutton

我的程序中有一个JTable。我想点击JButton后更新它。 我写了这个:

DefaultTableModel myTable = new DefaultTableModel(celDatas,celNames);
        JTable source = new JTable(myTable){public boolean isCellEditable(int rowIndex, int colIndex) {
  return false;}};
        JScrollPane pane = new JScrollPane(source);

(...)
    start.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e)
        {
                    query = "Select sal FROM EMP";
    myTable =(DefaultTableModel)source.getModel();
                myTable.fireTableDataChanged();
}

问题是id不会更新JTable上的数据。 如何解决这个问题?


编辑: JTable通过JScrollPane显示在我的家伙中。 我现在做这个:

   source = new JTable(myTable){public boolean isCellEditable(int rowIndex, int colIndex) {return false;}};
   pane = new JScrollPane(source);

我还创建了一个新的空白,从数据库中获取数据+我在那里定义了myTable:

void queryConnection() {
   (...)
        myTable = new DefaultTableModel(celDatas,celNames);

}

我添加了一个JButton,它更新了我的JTable(当我们更改查询时。

start.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e)
    {
          query = "Select sal FROM EMP";
          queryConnection();
    }
}

=============================================== =================================

public class Application2 implements Runnable {
private JTable source;
   private JScrollPane pane;
   private DefaultTableModel myTable;

   private JPanel panel;

   private String[][] celDatas = null;
   private String[] celNames = null;

   public void run() {


(...)


start.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e)
        {
            if(...) {

                query = "Select sal FROM EMP";
                queryConnection();
            }
}

if(query == null) {
            query = "Select * from EMP";
            queryConnection();
        }

        source = new JTable(myTable){public boolean isCellEditable(int rowIndex, int colIndex) {return false;}};
        pane = new JScrollPane(source);
        pane.setSize(f.getSize().width-60,300);
        pane.setLocation(30,20);

panel.add(pane);
f.add(panel);
        f.pack();
}
void queryConnection() {


//here is connection and downloading datas

myTable = new DefaultTableModel(celDatas,celNames);

}

我希望现在更方便吗? ;)

1 个答案:

答案 0 :(得分:3)

如果您正在创建新的TableModel,则不需要调用任何fireXXX()方法,但如果您基于AbstractTableModel编写TableModel,则主要需要调用这些方法(你不是)。

我认为你的问题出在其他地方。您似乎正在创建一个新的JTable并将其添加到新的JScrollPane。您是否将这些组件添加到GUI(您不显示)?如果是这样,您添加的容器是否能够顺利接受新组件?你重新验证并重新绘制容器吗?您新创建的JTable是否显示在GUI中?

或者,GUI中是否已显示JTable?如果是这样,也许你想要做的就是设置它的模型,而不是创建一个新的JTable。我赞成这个解决方案最简单。

编辑1
我会这样做:

  • 在后台线程中访问数据库并从中获取信息。
  • 使用从数据库中提取的数据创建一个新的DefaultTableModel对象。
  • 如果已存在,我不会创建新的JTable。相反,我只需在当前显示的JTable上调用setTableModel(...)并传入我新创建的DefaultTableModel对象。
  • 然后我坐下来享受成功的大笔钱和其他成果。

编辑2
Ganjira,为了让我们能够最好地帮助您,我们需要更好地了解问题,这就是为什么我要求对您的问题进行全面澄清或sscce,其中我已经既没见过。我理解你的问题的问题包括:

  • 同样,您的GUI中是否已经显示了JTable,现在您是否正在尝试根据从数据库中提取的数据更改JTable中显示的数据?
  • 如果是这样,为什么不简单地改变现有JTable的模型而不是创建一个全新的JTable?
  • 如果您还没有在应用程序中使用JTable,现在您想要显示一个,您说明您的数据没有显示,但没有显示代码以帮助我们理解原因。
  • 如果您可以回答前两个问题,我们可能不需要sscce,但如果没有,请理解您当前的帖子不在接近sscce,因为我们无法运行它,我们不能编译它,它不会为我们重现你的问题,...我不得不怀疑你是否甚至已经阅读了链接,因为它解释了为什么所有这些条件都很重要(那简洁如此不要把我们淹没在大量不相关的代码中)。
  • 不,您不需要发布SSCCE,但如果我们无法根据您的问题中的文字和您的代码段来帮助您,那么它确实提供了让我们更好地理解问题的机会并为您找到解决方案。

编辑3
你说:

  

JTable已经在GUI中,因为它显示了该程序的开头'。单击JButton后,我想更改JTable中的值。它并没有改变现有JTable的模型 - 它没有任何改变。

这让我感到困惑,因为最好的解决方案是我一直在提出的建议 - 不要创建新的JTable,而是创建一个新的DefaultTableModel并更改现有JTable的模型。你还没有提到为什么你没有尝试这个,或者如果你已经尝试过,它是如何不适合你的。