添加新行后,JTable不刷新 [英] JTable doesn't refresh after adding new row

查看:90
本文介绍了添加新行后,JTable不刷新的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在JScrollPane中有一个JTable.调用应该填充表的函数后,我看不到任何更改!我尝试使用table.repaint()model.fireTableDataChanged()以及其他一些我不记得了的东西-没有任何效果.我在做什么错??

我的功能:

public static void fillVodicTable(JTable table){

    DefaultTableModel model=new DefaultTableModel(); //also tried (DefaultTableModel)table.getModel();
    table.setModel(model);
    model.setColumnIdentifiers(new String[]{"Ime", "Priimek", "Epošta", "Datum rojstva", "Licenca", "Jeziki"});
    String [] row={"a","b","c","d","e","f"};

    model.addRow(row);
}

解决方案

1)没有理由要求为DefaultTableModel

调用model.fireTableDataChanged()

2)没有理由要求table.repaint(),这是没有用的

3)什么是for(Jezik j : v.getTuji_jeziki()) row[5]+=", "+j.toString();您问题的 * *可能超过100%

4)DefaultTableModel在所有情况下均适用,但仅需要在EDT上进行更新,换句话说,这是所有Swing JComponent一起使用的常见问题

5)获得更好的帮助,以便尽快使用 SSCCE

来编辑您的问题.

6)EDT == 事件调度线程

7)SSCCE

  • DefaultTableModel

  • model.addRow(row);

  • 自包含

  • 正确

  • 示例

然后

import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;
import javax.swing.border.LineBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

public class DefaultTableModelDemo {

    public static final String[] COLUMN_NAMES = {
        "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"
    };
    private DefaultTableModel model = new DefaultTableModel(COLUMN_NAMES, 0);
    private JTable table = new JTable(model);
    private JPanel mainPanel = new JPanel(new BorderLayout());
    private Random random = new Random();

    public DefaultTableModelDemo() {
        JButton addDataButton = new JButton("Add Data");
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(addDataButton);
        addDataButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                addDataActionPerformed();
            }
        });
        model = new DefaultTableModel(COLUMN_NAMES, 0) {

            private static final long serialVersionUID = 1L;

            @Override
            public Class getColumnClass(int column) {
                return getValueAt(0, column).getClass();
            }
        };
        table = new JTable(model) {

            private static final long serialVersionUID = 1L;

            @Override
            public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                Component c = super.prepareRenderer(renderer, row, column);
                if (isRowSelected(row) && isColumnSelected(column)) {
                    ((JComponent) c).setBorder(new LineBorder(Color.red));
                }

                return c;
            }
        };
        mainPanel.add(new JScrollPane(table), BorderLayout.CENTER);
        mainPanel.add(buttonPanel, BorderLayout.SOUTH);
    }

    private void addDataActionPerformed() {
        for (int i = 0; i < 5; i++) {
            Object[] row = new Object[COLUMN_NAMES.length];
            for (int j = 0; j < row.length; j++) {
                row[j] = random.nextInt(5);
            }
            model.addRow(row);
        }
    }

    public JComponent getComponent() {
        return mainPanel;
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame frame = new JFrame("DefaultTableModelDemo");
                frame.getContentPane().add(new DefaultTableModelDemo().getComponent());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

I have a JTable inside a JScrollPane. After calling my function which should populate the table I can't see any changes! I'v tried with table.repaint(), model.fireTableDataChanged() and probably some other stuff that I can't remember anymore - nothing worked. What am I doing wrong??

My function:

public static void fillVodicTable(JTable table){

    DefaultTableModel model=new DefaultTableModel(); //also tried (DefaultTableModel)table.getModel();
    table.setModel(model);
    model.setColumnIdentifiers(new String[]{"Ime", "Priimek", "Epošta", "Datum rojstva", "Licenca", "Jeziki"});
    String [] row={"a","b","c","d","e","f"};

    model.addRow(row);
}

解决方案

1) there no reason call for model.fireTableDataChanged() for DefaultTableModel

2) there no reason call for table.repaint(), is useless

3) what's for(Jezik j : v.getTuji_jeziki()) row[5]+=", "+j.toString(); there could be more than 100% ** of your issues

4) DefaultTableModel works in all cases, but requierd only update on EDT, in other hands this is common issue for all Swing JComponents together

5) for better help sooner edit yout question with a SSCCE

6) EDT == Event Dispatch Thread

7) SSCCE

  • DefaultTableModel

  • model.addRow(row);

  • Short

  • Self Contained

  • Correct

  • Example

then

import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;
import javax.swing.border.LineBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

public class DefaultTableModelDemo {

    public static final String[] COLUMN_NAMES = {
        "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"
    };
    private DefaultTableModel model = new DefaultTableModel(COLUMN_NAMES, 0);
    private JTable table = new JTable(model);
    private JPanel mainPanel = new JPanel(new BorderLayout());
    private Random random = new Random();

    public DefaultTableModelDemo() {
        JButton addDataButton = new JButton("Add Data");
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(addDataButton);
        addDataButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                addDataActionPerformed();
            }
        });
        model = new DefaultTableModel(COLUMN_NAMES, 0) {

            private static final long serialVersionUID = 1L;

            @Override
            public Class getColumnClass(int column) {
                return getValueAt(0, column).getClass();
            }
        };
        table = new JTable(model) {

            private static final long serialVersionUID = 1L;

            @Override
            public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                Component c = super.prepareRenderer(renderer, row, column);
                if (isRowSelected(row) && isColumnSelected(column)) {
                    ((JComponent) c).setBorder(new LineBorder(Color.red));
                }

                return c;
            }
        };
        mainPanel.add(new JScrollPane(table), BorderLayout.CENTER);
        mainPanel.add(buttonPanel, BorderLayout.SOUTH);
    }

    private void addDataActionPerformed() {
        for (int i = 0; i < 5; i++) {
            Object[] row = new Object[COLUMN_NAMES.length];
            for (int j = 0; j < row.length; j++) {
                row[j] = random.nextInt(5);
            }
            model.addRow(row);
        }
    }

    public JComponent getComponent() {
        return mainPanel;
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame frame = new JFrame("DefaultTableModelDemo");
                frame.getContentPane().add(new DefaultTableModelDemo().getComponent());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

这篇关于添加新行后,JTable不刷新的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆