2015-05-29 2 views
1

У меня проблема. Я довольно новичок в Java, и на данный момент я стараюсь изучить некоторые основные вещи.Невозможно обновить показанный JTable после вставок

Так я создал небольшой GUI с Textfield фор входом и Button сгореть запрос к базе данных с запросом (которые содержат вход в качестве переменной).

Я заполнил ResultSet с результатом запроса и хочу отобразить результат в JTable. Я судимо его с этим:

public class AppWindow extends JFrame { 

    private ResultSet rs = null; 

    JTextField textfield_where_1; 
    JTextField textfield_where_2; 

    JTable tabellenspass; 

    JButton  button; 


    public AppWindow() { 
     this.getContentPane().setLayout(null); 

     this.initWindow(); 

    protected void initWindow() 
    { 
     // Instanzieren: 
     textfield_where_1 = new JTextField(); 
     textfield_where_2 = new JTextField(); 
     tabellenspass = new JTable(); 


     button = new JButton("muh"); 

     button.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent arg0) { 
       try { 
        Abfrage(); 
       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 

     }); 

     // Positionen festlegen 
     textfield_where_1.setBounds(5,10,400,25); 

     tabellenspass.setBounds(5,40,400,100); 
     button.setBounds(300,110,100,30); 

     // Elemente dem Fenster hinzufügen: 
     this.getContentPane().add(textfield_where_1); 

     this.getContentPane().add(button); 

     this.getContentPane().add(tabellenspass); 
     this.pack(); 
    } 

    public void Abfrage() throws Exception 
    { 
     // Eingabestrings holen 
     String eingabe1 = textfield_where_1.getText(); 

     select_dies_das ausgabe = new select_dies_das(); 

     rs = ausgabe.select(eingabe1); 
     Ausgabe_Tabelle(rs); 


    } 

    private void Ausgabe_Tabelle(ResultSet rs) 
    { 
     try 
     { 

       // Rows/Columns der Tabelle setzen 

      ResultSetMetaData rsmd = (ResultSetMetaData) rs.getMetaData(); 
      // Tabellenmodel 

      DefaultTableModel model = new DefaultTableModel(); 
      tabellenspass.setModel(model); 

      //model.fireTableRowsInserted(0, 5); 
      int columns = rsmd.getColumnCount(); 

      // Resultset Zeiger zurueck setzen 
      rs.beforeFirst();  

      while (rs.next()) { 

       Object[] row = new Object[columns]; 
        for (int i = 1; i <= columns; i++) 
        { 
         row[i - 1] = rs.getObject(i); 
        } 

        model.insertRow(rs.getRow() -1,row); 
        System.out.println("miau"); 
      } 

      // tabellenspass.setModel(model); 
      tabellenspass.repaint(); 
     } 
     catch(Exception e) 
     { 
      System.out.println(e); 
     } 
    } 

С Abfrage() я получаю заполненную и результирующий Ausgabe_Tabelle() я заполняю JTable, но показанная таблица обыкновение меняться.

создать ряд Object[], что я заполнить с Data целого ряда, и это Object я вставить в JTable.

С initWinodw() Я создаю небольшой графический интерфейс.

Может кто-нибудь объяснить мне, почему таблица не обновляется после вставок?

+0

попытки «model.addRow» вместо «model.insertRow» –

ответ

4

Я имею в виду проблему с вашим TableModel, что не правильно initializated, вам нужно использовать public DefaultTableModel(Object[][] data, Object[] columnNames){...} конструктор дать ему header имена :)

DefaultTableModel model = new DefaultTableModel(null,new String[]{"Col1","Col2"}); 

Конечно, нужно, чтобы добавить или удалить колонны к model в соответствии с вашими потребностями, также rs.beforeFirst(); заявление ненужно becouse вы уже используете while loop, который проверяет, если ResultSet имеет еще одну строку с next() методом этого interface, если вы используете это заявление, а также подтвердить, что ResultSet прокручивать или вы получите

org.postgresql.util.PSQLException: Operation requires a scrollable ResultSet, but this ResultSet is FORWARD_ONLY. 

лучше закомментировать эту строку

//rs.beforeFirst(); 

Также вы можете изменить свое model.insertRow(rs.getRow() - 1, row); заявление с этим model.addRow(row); Я попробовал ваш код, и это результат

enter image description here

Возможно, вам стоит рассмотреть возможность добавления t он JTable к JScrollPane для держать видимыми headers и установите layouts вашей конструкции, что-то вроде этого

setTitle("Test"); 
this.getContentPane().setLayout(new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS)); 
JPanel data = new JPanel(); 
this.getContentPane().add(textfield_where_1); 
this.getContentPane().add(data); 
data.add(button); 
JScrollPane scroll = new JScrollPane(tabellenspass); 
data.add(scroll); 
scroll.setPreferredSize(new Dimension(400, 100)); 
button.setPreferredSize(new Dimension(100, 100)); 
textfield_where_1.setPreferredSize(new Dimension(400, 25)); 

enter image description here

+0

Эй, я использую rs.beforefirst (!), потому что я уже сделал распечатку в консоли после запроса, чтобы проверить, есть ли результат (это был просто тест для меня, потому что, как я уже сказал, я пытаюсь изучить некоторые основы; D) Хорошо, я попробую ваши вещи и надеюсь, что это сработает для меня тоже. – user3793935

+0

Ух, теперь это работает. Большое спасибо, сэр!;) – user3793935

+0

приходите, я рад, что это сработало :) – Osuka

0

Сообщать JTable об изменениях использовать fireTableDataChanged:

Уведомляет все слушатель, что все значения ячеек в строках таблицы могут быть изменены.

Также вы можете попробовать перепроверить и перекрашивать или resizeAndRepaint():

tabellenspass.revalidate(); 
tabellenspass.repaint(); 

или

tabellenspass.resizeAndRepaint(); 

И проверить here для получения дополнительной информации ...

+0

Привет! Ум, я не могу использовать его на JTable, но на модели. Но он все еще ничего не меняет: ( (и, кстати, набор результатов не пуст или что-то, строка содержит 213 столбцов, заполненных данными в 5 строк) – user3793935

+0

mmmm ... try 'revalidate()' in 'JTable' ... .. –

+0

Mhm обыкновение работать ли может что-то не так с процедурой initWindow или я, возможно, не используя правильную переменную – user3793935

Смежные вопросы