当前位置: 首页 > 知识库问答 >
问题:

为什么fireTableStructureChanged()不更新我的表?

长孙德惠
2023-03-14
public class MyTableModel extends AbstractTableModel{
JComboBox box;
public MyTableModel(JComboBox choice){
    super();
    box = choice;
}

public void updateTable(){
    this.fireTableStructureChanged();
}

@Override
public int getColumnCount() {
    //implemented
}

@Override
public int getRowCount() {
    //implemented
}

@Override
public Object getValueAt(int row, int col) {
    //implemented
}

choice5是一个JComboBox

    table1 = new JTable(new MyTableModel(choice5));

从choice5中选择项目时

    ((MyTableModel)table1.getModel()).updateTable();

被称为(编辑:对于我可以选择的每个项目,我可能有一个不同的jtable我想要显示)

编辑(SSCCE):

import java.awt.BorderLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JTable;

public class TestTableModel extends JFrame {
 static JComboBox<String> choice5 = new JComboBox<String>(new String[]{"","1","2","3"});
 static JTable table1 = new JTable(new MyTableModel(choice5));
 static JFrame frame = new JFrame();

 public static void main(String[] args) {
    frame.setLayout(new BorderLayout());
    choice5.addItemListener(new ItemListener(){
        @Override
        public void itemStateChanged(ItemEvent e) {
            if(e.getStateChange() == ItemEvent.SELECTED) {
                ((MyTableModel)table1.getModel()).updateTable();
                frame.pack();
            }}});
    frame.add(BorderLayout.SOUTH, choice5);
    frame.add(BorderLayout.CENTER, table1);
    frame.pack();
    frame.setVisible(true);
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
}

MyTableModel

import javax.swing.JComboBox;
import javax.swing.table.AbstractTableModel;
public class MyTableModel extends AbstractTableModel{
 JComboBox box;

public MyTableModel(JComboBox choice){
    super();
    box = choice;
}
public void updateTable(){this.fireTableStructureChanged();}

@Override
public int getColumnCount() {return box.getSelectedIndex();}
@Override
public int getRowCount() { return box.getSelectedIndex();}
@Override
public Object getValueAt(int row, int col) {return box.getSelectedItem();}
}

共有1个答案

宰父远
2023-03-14

表结构是行、列和列头。表格数据显示在单元格中。

>

  • 尝试使用FireTableRowsupDated:

     public void updateTable(){this.fireTableRowsUpdated(0, this.getRowCount() - 1);}
    

    尝试使用SetModel并使用EventQueue确保您的代码在UI线程上执行:

     choice5.addItemListener(new ItemListener(){
         @Override
         public void itemStateChanged(ItemEvent e) {
             if(e.getStateChange() == ItemEvent.SELECTED) {
                 EventQueue.invokeLater(() -> {
                     table1.setModel(new MyTableModel(choice5));
                     frame.pack();
                 });
             }}});
    

    JScrollPane中尝试您的JTable。它们之间有魔力,就像巧克力和花生酱:

     frame.add(BorderLayout.SOUTH, choice5);
     frame.add(BorderLayout.CENTER, new JScrollPane(table1));
    

    火化的

      null

    来源:Oracle

    可燃烧的结构改变的

    public void fireTableStructureChanged()

  •  类似资料:
    • 我有这样的Jpa存储库:

    • 我是java新手,所以请不要后悔java中的对象和东西正在传递引用的值,但下面是我试图传递对象的代码。当我通过传递到函数中更新值时,a的值没有改变。发生了什么请帮助我。。。

    • 问题内容: 我有如下代码: 但是,不是在每次调用setText时在循环的每次迭代后更新文本区域,而是仅在完成所有任务运行后才更新文本。为什么会发生这种情况,我该如何解决? 问题答案: 您可能正在使用Swing线程,该线程正在等待代码执行才能更新UI。尝试为该循环使用单独的线程。

    • 与其他包管理器(如)相比,我发现当更新与给定项目相关的包时,有一种奇怪的行为。 还根据留档,和选项 根据composer.json将依赖项升级到最新版本,并更新composer.lock文件。 事实上,正确地更新了新的包版本号。但是没有被修改,并且列出了旧的版本过低的包。 为什么会发生这种情况?是我做错了什么,还是这就是应该怎么做的?如果是这样的话,为什么两个文件中的一个是最新的,而另一个不是最新

    • 我通过使用map函数迭代来显示我的状态,这是一个数组。此外,我有一个按钮,在点击反转数组。 我认为我想做什么是相当明显的。但这对我不起作用,我不知道为什么。我必须单击两次来完成第一次还原,出现了奇怪的情况,即呈现的数组和Chrome中React开发工具在组件状态中显示的数组不匹配。 我无法解释这种行为。我开始认为这与我从道具中获得阵列有关,但我真的不知道。有什么想法吗?