1

我的程序中有一个 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);

}

我希望现在更方便?;)

4

1 回答 1

3

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

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

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

编辑 1
我会这样做:

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

编辑 2
Ganjira,为了让我们能够最好地帮助您,我们需要更好地理解问题,这就是为什么我要求对您的问题或sscce进行全面澄清,但我都没有看到。我在理解您的问题方面遇到的问题包括:

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

编辑 3
你说:

JTable 已经在 GUI 中,因为它显示了“程序的开始”。单击 JButton 后,我想更改 JTable 中的值。它不会改变现有 JTable 的模型——它不会改变任何东西。

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

于 2012-04-15T14:42:25.413 回答