JTable устанавливает модель и сохраняет форматы столбцов (ширина, выравнивание и т. Д.) - PullRequest
1 голос
/ 07 марта 2012

Это потрясающий опыт с привязкой JTable.Вот что я сделал.Я создал JTable со столбцами установленной ширины, отформатировал его, используя renderers, и добавил некоторые коды к нему. Но когда я пытаюсь привязать его к модели, все столбцы были заменены полями модели .Есть ли способ, как правильно его связать?

Я избегаю циклов, потому что в базе данных более 100 тысяч записей.Я пытаюсь использовать другие методы, такие как BeansBinding и EntityManager, но я не знаю, как изменить источник данных (, поэтому я выбираю привязку его к модели ), потому что я тестируюэто для резервного копирования базы данных и скоро будет внедрено на новый сервер.

Это то, что я делал в .Net, я обычно создаю сетку данных и связываю ее с набором данных, и она отлично работает.Но я не могу применить это к Java.Мне нужно ваше мнение о том, как я могу сделать это в Java, которая может обрабатывать более 100 тысяч записей.

    PreparedStatement pst = conn.prepareStatement("SQL Query here");
    ResultSet rs = pst.ExecuteQuery();
    jTable1.setModel(DbUtils.resultSetToTableModel(rs));

Приведенный выше код работает хорошо, но моя очень большая проблема заключается в том, что он переопределяет мои отформатированные столбцы с помощьюстолбцы в модели.

Пожалуйста, помогите мне в этом.

Ответы [ 3 ]

2 голосов
/ 07 марта 2012

На основании комментариев вы можете попробовать добавить следующий метод в DbUtils:

public static void updateTableModelData(DefaultTableModel tModel, ResultSet rs) 
        throws Exception {
    tModel.setRowCount(0);
    ResultSetMetaData metaData = rs.getMetaData();

    while (rs.next()) {
        Vector newRow = new Vector();
        for (int i = 1; i <= numberOfColumns; i++) {
            newRow.addElement(rs.getObject(i));
        }
        tModel.addRow(newRow);
    }
}

и тогда ваш код станет:

PreparedStatement pst = conn.prepareStatement("SQL Query here");
ResultSet rs = pst.ExecuteQuery();
DbUtils.updateTableModelData((DefaultTableModel) jTable1.getModel(), rs);
2 голосов
/ 07 марта 2012

слишком широкий вопрос

1) никогда, действительно, никогда не ставьте 100+ thousand records в представление, и это справедливо для всех языков программирования, действительно бесполезно

2) (мой взгляд)BeansBindings устарели, вместо этого используйте стандартную TableModel

3) ничего лучше, так как @camickr TableFromDatabase или другое предложение ищет ResultSetTableModel

0 голосов
/ 10 июля 2015

Я обнаружил, что вы можете создать свой метод форматирования и вызывать его после блока try, как показано ниже.

 private void UpdateTable() throws SQLException {
     String sql = "select * from invoice";
    proDialog.setValue(10);
    table.setShowHorizontalLines(true);
    table.setShowVerticalLines(true);
    proDialog.setValue(20);
    try (
        PreparedStatement pst = con.prepareStatement(sql);

          ResultSet rs = pst.executeQuery();

            )
            {           
        table.setModel(DbUtils.resultSetToTableModel(rs));          
    } catch (Exception e) {
         JOptionPane.showMessageDialog(null, e);
    }
    format();       
}

public void format() {
TableColumnModel m = table.getColumnModel();
m.getColumn(2).setCellRenderer(FormatRenderer.getDateTimeRenderer());
m.getColumn(1).setCellRenderer(FormatRenderer.getTimeRenderer());
m.getColumn(2).setCellRenderer(NumberRenderer.getPercentRenderer());
m.getColumn(4).setCellRenderer(NumberRenderer.getCurrencyRenderer());
m.getColumn(4).setCellRenderer(NumberRenderer.getPercentRenderer());
m.getColumn(5).setCellRenderer(NumberRenderer.getCurrencyRenderer());
}

Это будет прекрасно работать

...