2015-08-18 2 views
-1

В настоящее время я работаю над проектом gui, который управляет базой данных sql. В настоящее время я добавляю, удаляя журналы и показывая таблицы, существующие в mysql. Проблема в том, что мои кнопки добавления и удаления на моей панели должны перерисовывать/обновлять таблицу на этой панели, поскольку запись добавляется или удаляется, но во время тестирования я обнаружил, что метод repaint не обновляет таблицу после первого использования кнопки , Что может вызвать эту проблему? Заранее спасибо ..Метод repaint() не работает более одного раза

public JTabbedPane addComponentToPane() { 
     //Container pane = new Container(); 
     JTabbedPane tabbedPane = new JTabbedPane(); 

     JPanel card1 = new JPanel(); 
     JPanel card2 = new JPanel(); 
     JPanel card3 = new JPanel(); 
     JPanel card4 = new JPanel(); 
     JPanel card5 = new JPanel(); 
     JPanel card6 = new JPanel(); 
     JPanel card7 = new JPanel(); 
     JPanel card8 = new JPanel(); 

     card1.setLayout(new BorderLayout()); 
     card2.setLayout(new BorderLayout()); 
     card3.setLayout(new BorderLayout()); 
     card4.setLayout(new BorderLayout()); 
     card5.setLayout(new BorderLayout()); 
     card6.setLayout(new BorderLayout()); 
     card7.setLayout(new BorderLayout()); 
     card8.setLayout(new BorderLayout()); 

     JScrollPane actor = new JScrollPane(createTables("actor")); 

     card1.add(actor, BorderLayout.CENTER); 
     card3.add(createTables("address"), BorderLayout.CENTER); 
     card4.add(createTables("category"), BorderLayout.CENTER); 
     card5.add(createTables("city"), BorderLayout.CENTER); 
     card6.add(createTables("country"), BorderLayout.CENTER); 
     card7.add(createTables("customer"), BorderLayout.CENTER); 
     card8.add(createTables("film"), BorderLayout.CENTER); 

     JButton button = new JButton("Yeni Kayıt"); 
     button.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       addRecord("actor");     
       card1.remove(actor); 
       card1.add(createTables("actor"), BorderLayout.CENTER); 
       card1.validate(); 
       card1.repaint();     
      } 
     }); 
     JButton delButton = new JButton("Kayıt sil"); 
     delButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       delRecord("actor"); 
       card1.remove(actor); 
       card1.add(createTables("actor"), BorderLayout.CENTER); 
       card1.validate(); 
       card1.repaint(); 
      } 
     });`` 

     card1.add(button, BorderLayout.SOUTH); 
     card1.add(delButton, BorderLayout.EAST); 

     tabbedPane.addTab("Şirketler", null, card1, "şirket tanımları"); 
     tabbedPane.addTab("Sorumlular", card2); 
     tabbedPane.addTab("Varlık Grupları", card3); 
     tabbedPane.addTab("Bilgi Varlıkları", card4); 
     tabbedPane.addTab("Varlık Değerleri", card5); 
     tabbedPane.addTab("Açıklıklar", card6); 
     tabbedPane.addTab("Tehditler", card7); 
     tabbedPane.addTab("Ek-A", card8); 

     //pane.add(tabbedPane, BorderLayout.CENTER); 
     return tabbedPane; 
    } 

Создать метод таблицы, создающий Jtable из таблицы sql.

private JScrollPane createTables(String tablename) { 
     Connection con = null; 
     Statement statement = null; 
     ResultSet result = null; 
     String query; 
     JScrollPane jsp = null; 

     try { 
      Class.forName("com.mysql.jdbc.Driver").newInstance(); 
      con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "root", "root"); 
      statement = con.createStatement(); 
      query = "select * from " + tablename; 
      result = statement.executeQuery(query); 
      ResultSetMetaData rsmt = result.getMetaData(); 
      int columnCount = rsmt.getColumnCount(); 
      Vector column = new Vector(columnCount); 
      for (int i = 1; i <= columnCount; i++) { 
       column.add(rsmt.getColumnName(i)); 
      } 
      Vector data = new Vector(); 
      Vector row = new Vector(); 
      while (result.next()) { 
       row = new Vector(columnCount); 
       for (int i = 1; i <= columnCount; i++) { 
        row.add(result.getString(i)); 
       } 
       data.add(row); 
      } 
      defTableModel = new DefaultTableModel(data, column); 
      table = new JTable(defTableModel) { 
       @Override 
       public boolean isCellEditable(int row, int column) { 
        return false; 
       } 
      ; 
      }; 
      //table.setAutoCreateRowSorter(true); 
      TableRowFilterSupport.forTable(table).searchable(true).apply(); 
      table.setRowSelectionAllowed(true); 

      jsp = new JScrollPane(table); 

     } 
     catch (Exception e) { 
      e.printStackTrace(); 
      // JOptionPane.showMessageDialog(null, "ERROR"); 
     } 
     finally { 
      try { 
       statement.close(); 
       result.close(); 
       con.close(); 
      } 
      catch (Exception e) { 
       //JOptionPane.showMessageDialog(null, "ERROR CLOSE"); 
      } 
     } 

     return jsp; 
    } 
+0

Вы могли бы попробовать вызвать 'перепроверить(); перекрасить()' вместо 'Validate(); перекрасить();' – Robin

+0

Я уже пробовал это, но спасибо за совет. –

+1

Можете ли вы разместить функцию 'createTables()'? Еще лучше, можете ли вы опубликовать [MCVE] (http://stackoverflow.com/help/mcve)? –

ответ

0

я мог видеть несколько несоответствий в коде:

  1. Переменная actor не будучи установлен в добавленном компонент в слушателе действий.
  2. Первый раз, когда вы добавляете new JScrollPane(createTables("actor")), а затем вы добавляете только createTables("actor").

Возможно, возникла проблема (1).

+0

Это не проблема. Я должен это сделать, потому что мне нужно воссоздать таблицу по мере изменения базы данных. Если я снова добавлю переменную actor, функция не будет вызываться во второй раз, и старая таблица будет добавлена, так как она не является динамической. –

+0

@Sertage сделал это более понятным. Если вы не можете использовать актера, потому что он должен быть «final», вы можете либо сделать его переменной-членом класса, либо использовать 'removeAll', а не' remove' в прослушивателе действий. – KDM

+0

Я думаю, что создание переменной actor переменной-членом не является правильным решением, так как это всего лишь случай, и функция removeAll также удаляет кнопки с панели, которая не нужна. Можете ли вы придумать способ, которым я могу удалить только таблицу? Спасибо. –

0

Я думаю, что проблема является ссылкой на актера:

card1.remove(actor); 
card1.add(createTables("actor"), BorderLayout.CENTER); 

Здесь переменная актер не более упоминается в CARD1. Чтобы не потерять эту ссылку, вы должны сделать что-то вроде этого, в обоих actionPerformed методов:

card1.remove(actor); 
actor = new JScrollPane(createTables("actor")); 
card1.add(actor, BorderLayout.CENTER); 
+0

Ну, я думаю, вы обнаружили проблему, но у меня все еще нет решения, потому что я получаю сообщение об ошибке, когда пытаюсь ссылаться на переменную actor, говоря, что «локальные переменные, на которые ссылается внутренний класс, должны быть окончательными» –

+0

Это тупой вопрос, но делает переменную окончательным жизнеспособным вариантом? –

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