JTable не обновляется после добавления новой строки - PullRequest
1 голос
/ 26 марта 2012

У меня есть JTable внутри JScrollPane. После вызова моей функции, которая должна заполнить таблицу, я не вижу никаких изменений! Я пробовал с 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);
}

Ответы [ 5 ]

3 голосов
/ 26 марта 2012

1) нет причин для вызова model.fireTableDataChanged() для DefaultTableModel

2) нет причины звонить по table.repaint(), бесполезно

3) что for(Jezik j : v.getTuji_jeziki()) row[5]+=", "+j.toString(); может быть более 100% ** ваших проблем

4) DefaultTableModel работает во всех случаях, но требует только обновления EDT, в других случаях это общая проблема для всех компонентов Swing J * вместе

5) для лучшей помощи скорее отредактируйте свой вопрос с помощью SSCCE

6) EDT == Тема отправки события

7) SSCCE

  • DefaultTableModel

  • * * model.addRow тысячи тридцать один (строка); * ** тысяча тридцать два тысяча тридцать три *
  • Short

  • Автономный

  • Правильно

  • Пример

тогда

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);
            }
        });
    }
}
1 голос
/ 10 января 2015

1.Для заполнения jtable данных:

void update_table() throws SQLException {
   rs=statement.executeQuery("select * from details");
    jTable1.setModel(DbUtils.resultSetToTableModel(rs));

}

2.Затем вызовите функцию update для события action для кнопок и обновите jtable

. Для получения дополнительной информации вы можете просмотреть этот учебник: Как обновить JTable после вставки, удалить или обновить данные в java Netbeans ID

1 голос
/ 21 октября 2014

Я знаю его старый, но у меня была та же проблема, и решение было добавить

jTable1.setAutoCreateColumnsFromModel(true);
0 голосов
/ 12 января 2015
  1. Я создал новый проект, в котором я выбрал новый фрейм и перетащил таблицу, метку, текстовое поле и кнопку из элементов управления Swing в свой фрейм.

2.Создать стол в бэк-энде…

Скачать rs2xml jar-файл по этой ссылке

Скачать rs2xml.jar

Добавить его в библиотеку проекта…

Щелкните правой кнопкой мыши по проекту> свойства> библиотека> добавить Jar / папку> выберите jar> ok

5. Затем подключите mysqlследующий код

public class DBConnect {

Connection connection = null;

public Connection getConnection() {
    try {
        Class.forName("com.mysql.jdbc.Driver");
        connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "");
        System.out.println("connection successfully");
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return connection;
}
}

Вызовите функцию на странице, используя следующий код

con=new DBConnect();
statement=con.getConnection().createStatement();

7. Затем, чтобы создать функцию обновления, введите следующий код…

void update_table() throws SQLException{
    rs=statement.executeQuery("select * from details");
    jTable1.setModel(DbUtils.resultSetToTableModel(rs));
}

8.В событии действия кнопок введите следующее и вызовите функцию обновления

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         

   try {
       Object name=jTextField1.getText();
       String sql="insert into details (name) values('"+name+"')";
        int  resultset=statement.executeUpdate(sql);
        update_table();
   } catch (SQLException ex) {
       Logger.getLogger(update.class.getName()).log(Level.SEVERE, null, ex);
   }

}

9. Затем запустите проект…

ВЫ также можете следовать этомуУчебник: -

Как обновить JTable после вставки, удалить или обновить данные в java Netbeans ID

0 голосов
/ 02 января 2015

Я знаю, что это старый, но у меня недавно была та же проблема, и решение было позвонить

model.fireTableDataChanged();

сразу после добавления новой строки в модель.

Подвох заключался в следующем: у меня был стол, на котором я разрешил сортировку. Не щелкая заголовки столбцов, чтобы строки сортировались соответствующим образом, я смог добавить данные в модель и просмотреть изменения в таблице, вызвав table.revalidate(); Однако, если в любой момент я щелкнул заголовки столбцов, любая строка добавленные впоследствии не будут показаны, хотя данные модели корректно обновлялись. Вызывая model.fireTableDataChanged(); только после добавления данных в модель, он работает как чудо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...