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

已填充JTable但未显示。使用DefaultTableModel

皮骏
2023-03-14

我不明白为什么我的jtable没有更新。

下面是我的代码:

package it.franpic.chat.client.prestazioni.view;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.util.List;

import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;

import it.franpic.chat.client.prestazioni.model.RecordBean;

public class FinestraPrincipale {

    private JFrame frame;
    private JTable tabellaDati;
    private JScrollPane scrollPaneTabella;
    private JSplitPane splitPaneContenuti;

    /**
     * Launch the application.
     */
    public void avvia() {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    FinestraPrincipale window = new FinestraPrincipale();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public FinestraPrincipale() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel pnlOpzioni = new JPanel();
        frame.getContentPane().add(pnlOpzioni, BorderLayout.NORTH);
        pnlOpzioni.setBorder(new TitledBorder(new LineBorder(new Color(0, 0, 0)), "Opzioni", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)));
        pnlOpzioni.setLayout(new BorderLayout(0, 0));

        JCheckBox chckbxAggiornaAutomaticamente = new JCheckBox("Aggiorna Automaticamente");
        chckbxAggiornaAutomaticamente.setEnabled(false);
        pnlOpzioni.add(chckbxAggiornaAutomaticamente);
        chckbxAggiornaAutomaticamente.setVerticalAlignment(SwingConstants.TOP);

        splitPaneContenuti = new JSplitPane();
        splitPaneContenuti.setOneTouchExpandable(true);
        splitPaneContenuti.setOrientation(JSplitPane.VERTICAL_SPLIT);
        frame.getContentPane().add(splitPaneContenuti, BorderLayout.CENTER);

        JScrollPane scrollPaneGrafico = new JScrollPane();
        splitPaneContenuti.setLeftComponent(scrollPaneGrafico);

        scrollPaneTabella = new JScrollPane();
        splitPaneContenuti.setRightComponent(scrollPaneTabella);

        tabellaDati = new JTable();
        tabellaDati.setModel(new DefaultTableModel(
            new Object[][] {
            },
            new String[] {
                "ISTANTE", "GESTITE", "DISTRIBUITE", "PIANIFICATO", "SOSTENIBILE", "LOGGATI", "LOGGATI_PIANIFICATO"
            }
        ) {
            Class[] columnTypes = new Class[] {
                String.class, Integer.class, Integer.class, Integer.class, Integer.class, Integer.class, Integer.class
            };
            public Class getColumnClass(int columnIndex) {
                return columnTypes[columnIndex];
            }
        });
        tabellaDati.getColumnModel().getColumn(3).setPreferredWidth(76);
        tabellaDati.getColumnModel().getColumn(6).setPreferredWidth(127);
        tabellaDati.setColumnSelectionAllowed(true);
        tabellaDati.setCellSelectionEnabled(true);
        scrollPaneTabella.setViewportView(tabellaDati);
    }

    public void aggiornaTabella(List<RecordBean> lista) {
        DefaultTableModel model = (DefaultTableModel) tabellaDati.getModel();
        model.setRowCount(0);
        System.out.println("tabellaDati.getRowCount() = " + tabellaDati.getRowCount());

        for (RecordBean record : lista) {
            model.addRow(new Object[]{record.getMomento(), record.getGestite(), record.getDistribuite(), record.getSostenibile(), record.getPianificato(), record.getLoggati(), record.getLoggatiPianificato()});
        }

        System.out.println("tabellaDati.getRowCount() = " + tabellaDati.getRowCount());
    }   

}

这是调用这些方法的main类的代码:

package it.franpic.chat.client.prestazioni.control;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;

import it.franpic.chat.client.prestazioni.model.RecordBean;
import it.franpic.chat.client.prestazioni.view.FinestraPrincipale;

public class Client {
    public static void main(String[] args) {
        FinestraPrincipale finestraPrincipale = new FinestraPrincipale();
        GestoreDb gestoreDb = new GestoreDb();


        String adessoFormatoMySql = LocalDateTime.now().format(DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss"));

        List<RecordBean> lista = gestoreDb.getRecordsDaDate("2019-01-26 18:00:00", adessoFormatoMySql);

        finestraPrincipale.avvia();
        finestraPrincipale.aggiornaTabella(lista);
    }
}

AggiorNatabella(List lista) 中,在AddRow循环之后,我尝试过:

  • Tabelladati.setModel(模型);
  • .invalidate()方法在GUI的每个组件上(即使不推荐)
  • GUI每个组件的
  • .repaint()方法
  • model.fire....()方法(即使不推荐)

AggiorNatabella(List lista) 方法中的2println中,我可以看到填充了JTable的行,但未显示它们。

共有1个答案

顾靖
2023-03-14

这个...

public class Client {
    public static void main(String[] args) {
        FinestraPrincipale finestraPrincipale = new FinestraPrincipale();
        GestoreDb gestoreDb = new GestoreDb();


        String adessoFormatoMySql = LocalDateTime.now().format(DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss"));

        List<RecordBean> lista = gestoreDb.getRecordsDaDate("2019-01-26 18:00:00", adessoFormatoMySql);

        finestraPrincipale.avvia();
        finestraPrincipale.aggiornaTabella(lista);
    }
}

解释了很多。

首先,创建Finestraprincipale的实例,加载一些数据并调用Finestraprincipale.avvia,但是avvia正在创建Finestraprincipale的新实例

public void avvia() {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                // Hello new instance...
                FinestraPrincipale window = new FinestraPrincipale();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}
public void avvia() {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}
 类似资料:
  • 问题内容: 如何用对象类型的列表中的值填充JTable。我的代码如下所示: 我已经有了列,列表将来自schedule变量?考虑这些列,如何将其放到表中? 问题答案: 看一下DefaultTableModel。您可以遍历List并为每一行创建Object数组。

  • 问题内容: 我正在使用DecimalFormat将双精度格式设置为2个小数位,如下所示: 它可以工作,但是如果我有一个像20这样的数字,它就给我这个: 我想要这个: 有什么建议? 问题答案: DecimalFormat类用于将十进制数字值转换为String。在您的示例中,您将使用来自format()方法的String并将其放回double变量中。如果然后输出该double变量,则不会看到格式化的字

  • 问题内容: 我有一个带有表,组合框的框架,我想通过组合框用数据库中的数据填充表,但是如果我与itemlistener一起使用,我不会看到没有itemlistener的表,然后我会看到包含数据的表(combob = combobox) 问题答案: 您有几个问题: 您使用不正确。您的代码可能可以运行(我不确定),但是它没有利用的功能。 从ResultSet读取数据的代码没有意义,因为您甚至根本没有从R

  • 问题内容: 我想在运行时用许多行填充JTable(说10000)。但是我所有的尝试都非常糟糕且效率低下。 起点是获取代表一行的对象列表的方法。我试图通过SwingWorker填写表格,但这对我来说仅适用于小数据。 另一个尝试是直接设置数据而不使用任何类型的线程,但这也非常慢,至少UI不会像SwingWorker那样被阻塞。 那么,您如何做到这一点呢?该表应逐行或逐块填充,但不能全部由一个填充,同时

  • 我有一个带有table的框架,combobox,我想通过combobox用来自数据库的数据填充表,但是如果我使用itemlistener我看不到表,没有itemlistener和,我就看到了带有数据的表(combob=combobox)

  • 我使用的是fpdf的“表格填写”脚本。org来填充我创建的PDF表单上的一些字段。这似乎工作正常。 我希望生成的PDF表单被展平,以便用户无法编辑表单字段。为此我使用PDFTK。但是,当我尝试展平PDF时,我得到一个表单字段为空的PDF。 关于如何使PDF扁平化(使用PHP)的任何建议都将不胜感激。谢谢! 这是我的代码: 下载原始Test.pdf文件:Test.pdf 下载Filled1。pdf文