2012-04-19 3 views
0

У меня есть проект, над которым я работаю, что позволяет мне создавать шаблон и вводить данные. Одна вещь, которая не работает, заключается в том, что таблица не динамически обновляется. Он обновляется только после закрытия приложения и запуска его снова. Есть ли аналогичный метод UpdateUI, где он обновляется перед вами, не выходя из приложения и снова открывая его, чтобы увидеть изменение? У меня есть код ниже, может кто-нибудь указать, какой код и где я бы поместил его в класс? Спасибо.JTable Dynamic Update

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.Insets; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.Statement; 
import java.util.ArrayList; 
import java.util.Collections; 

import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.SwingConstants; 
import javax.swing.border.EmptyBorder; 
import javax.swing.border.LineBorder; 
import javax.swing.event.CellEditorListener; 
import javax.swing.event.ChangeEvent; 


public class ViewTable extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private static final String PREFERRED_LOOK_AND_FEEL = null; 
    private static String tableName; 
    private String[] columnNames; 
    private String[][] data; 
    private JPanel mainPanel; 
    private JTable tablePane; 
    private int dataX; 
    private int dataY; 

    public ViewTable(String tableName){ 
     this.tableName=tableName; 

     initComponents(); 
     loadDB(); 
     displayTable(); 

     /*setDefaultCloseOperation(CreateTemplate.DISPOSE_ON_CLOSE); 
     setSize(700,700); 
     setTitle("View Table"); 
     setVisible(true);*/ 
     Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); 
     this.setSize(dim.width, dim.height); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setVisible(true); 


    } 

    private void initComponents() { 
     mainPanel = new JPanel(new BorderLayout()); 
     this.add(mainPanel); 
     mainPanel.setBackground(Color.gray); 

     JPanel topPanel = new JPanel(new BorderLayout()); 
     topPanel.setBackground(Color.DARK_GRAY); 
     mainPanel.add(topPanel,BorderLayout.NORTH); 

     JLabel titleLabel = new JLabel(this.tableName); 
     titleLabel.setBorder(new LineBorder(Color.black)); 
     titleLabel.setFont(new Font("Helvetica", Font.BOLD, 24)); 
     titleLabel.setForeground(Color.white); 
     titleLabel.setHorizontalAlignment(SwingConstants.CENTER); 
     topPanel.add(titleLabel,BorderLayout.CENTER); 


     JPanel buttonPanel = new JPanel(new BorderLayout()); 
     JButton exitButton = new JButton("Finish"); 
     exitButton.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent event){ 
       close_window(); 
      } 
     }); 
     exitButton.setBorder(new EmptyBorder(new Insets(20,20,20,20))); 
     buttonPanel.add(exitButton,BorderLayout.EAST); 

     JButton deleteButton = new JButton("Delete Entry"); 
     deleteButton.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent event){ 
       Object[] rows = new Object[dataX-1]; 
       for (int r=0;r!=rows.length;r++){ 
        rows[r] = data[r][0]; 
       } 
       //JOptionPane delAsk = new JOptionPane("Delete entry:",JOptionPane.PLAIN_MESSAGE,JOptionPane.DEFAULT_OPTION,null,rows,rows[0]); 
       //delAsk. 
       //delAsk.set.InputDialogue(null,"Delete entry:","Delete",JOptionPane.PLAIN_MESSAGE,null,rows,rows[0]); 
       //JDialog dialog = delAsk.createDialog(null, "Delete"); 
       //dialog.show(); 
       //String del = (String)delAsk.getInputValue(); 
       //System.out.println(del); 

       Object deleteRow 
       = JOptionPane.showInputDialog(null,"Which entry do you wish to delete", 
         "Delete Entry",JOptionPane.INFORMATION_MESSAGE,null, 
         rows,rows[0]);  
       int index = -1; 
       for(int i=0;i!=rows.length;i++){ 
        if(rows[i].equals(deleteRow.toString())){ index = i; } 
       } 

       SQLCommands.SQLCommand("DELETE FROM "+tableName+" WHERE recID='"+index+"'"); 
       initComponents(); 
       loadDB(); 
       displayTable(); 
       tablePane.updateUI(); 
      } 
     }); 
     deleteButton.setBorder(new EmptyBorder(new Insets(20,20,20,20))); 
     buttonPanel.add(deleteButton,BorderLayout.WEST); 

     topPanel.add(buttonPanel,BorderLayout.EAST); 

    } 

    private void close_window(){ this.dispose(); } 

    private void loadDB(){ 
     //get column names 
     columnNames = getColumnNames(); 

     for (String S : columnNames){ System.out.println(S); }//JOptionPane.showInputDialog("Enter template name"); } 

     //Temp add new dummy data 
     //SQLCommands.SQLCommand("INSERT INTO "+tableName+" VALUES (1,'av', 'bv', 'cv', 'dv', 'ev')"); 



     //use column names to populate data 

     String[] col = SQLCommands.returnSQLCommand("SELECT "+columnNames[0]+" FROM "+tableName+""); 

     dataX = col.length+1; 
     dataY = columnNames.length; 
     System.out.println(dataX+" "+dataY); 

     data = new String[dataX][dataY]; 
     printTable(data); 
     System.out.println(); 

     //e.g. data[4][0] => "SELECT Name FROM tableName"[4] 

     for(int j=0;j!=columnNames.length;j++){ 
      String n = columnNames[j]; 

      col = SQLCommands.returnSQLCommand("SELECT "+n+" FROM "+tableName+""); 

      for(int i=0; i!=col.length; i++){ 
       data[i][j]=col[i]; 
      } 
     } 
     for(int j=0;j!=dataY;j++){ 
      data[dataX-1][j]=""; 
     } 

     for(String D1[] : data){ 
      for(String D : D1){ 
       System.out.print(D+" "); 
      } 
      System.out.printf("\n"); 
     } 

     /*columnNames = new String[2]; 
     columnNames[0] = "col 1"; 
     columnNames[1] = "col 2"; 
     data = new String[2][2]; 
     data[0][0] = "hello"; 
     data[0][1] = "good bye"; 
     dataX = 2; 
     dataY = 2;*/ 
    } 

    private void displayTable(){ 
     //use JTable 
     tablePane = new JTable(data,columnNames); 
     tablePane.setFillsViewportHeight(true); 
     tablePane.setShowHorizontalLines(true); 

     tablePane.setCellSelectionEnabled(true); 
     tablePane.setRowSelectionAllowed(true); 



     tablePane.getDefaultEditor(String.class).addCellEditorListener(new MyCellEditorListener(tablePane)); 

     //new JScrollPane which uses the table 
     JScrollPane scrollPane = new JScrollPane(tablePane,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     scrollPane.setBorder(new EmptyBorder(new Insets(15,15,15,15))); 

     //put JScrollpane in CENTER box 
     mainPanel.add(scrollPane,BorderLayout.CENTER); 

    } 

    public static String[] getColumnNames(){ 
     Connection connection=null; 
     Statement statement=null; 
     ResultSet result = null; 
     String[] names=null; 

     try { 
      Class.forName("org.sqlite.JDBC"); 
      connection = DriverManager 
        .getConnection("jdbc:sqlite:Media.db"); 
      statement = connection.createStatement(); 
      result = statement.executeQuery("PRAGMA table_info("+tableName+");"); 
      ArrayList<String> nameList = new ArrayList<String>(); 
      while(result.next()){ 
       nameList.add(result.getString(2)); 
      } 
      names = new String[nameList.toArray().length-1]; 
      for (int i=1; i!=nameList.toArray().length; i++){ 
       names[i-1] = (String)nameList.toArray()[i]; 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       statement.close(); 
       connection.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     return names; 
    } 

    private class MyCellEditorListener implements CellEditorListener 
    { 

     private JTable table; 
     private String[][] datain; 

     public MyCellEditorListener(JTable table){ 
      this.table = table; 

      setupDataIn(); 


     } 

     private void setupDataIn(){ 
      datain = new String[dataX][dataY]; 
      for(int i=0; i!=dataX; i++){ 
       for(int j=0; j!=dataY; j++){ 
        datain[i][j]=data[i][j]; 
       } 
      } 
     } 

     @Override 
     public void editingCanceled(ChangeEvent arg0) { 
      //Do Nothing 
     } 

     @Override 
     public void editingStopped(ChangeEvent e) { 
      // Update DB 
      printTable(data); 
      printTable(datain); 

      for(int i=0; i!=dataX; i++){ 
       for(int j=0; j!=dataY; j++){ 
        if(datain[i][j].equals(data[i][j])){ 
         //DO Nothing 
        } else { 
         //Update or add new field 
         if(i==dataX-1){ 
          System.out.println("new field"); 
          String com = "INSERT INTO "+tableName+" VALUES ("+(dataX-1)+", "; 
          for(int y=0;y!=dataY;y++){ 
           if(y==j){ 
            com += "'"+data[i][j]+"', "; 
           } else { 
            com += "'', "; 
           } 
          } 
          com = com.substring(0, com.length()-2); 
          com+=")"; 

          System.out.println(com); 
          SQLCommands.SQLCommand(com); 
          initComponents(); 
          loadDB(); 
          setupDataIn(); 
          displayTable(); 
          tablePane.updateUI(); 
          break; 

         } else { 
          System.out.println("UPDATE "+tableName+" SET "+columnNames[j]+"='"+data[i][j]+"' WHERE recID="+i); 
          SQLCommands.SQLCommand("UPDATE "+tableName+" SET "+columnNames[j]+"='"+data[i][j]+"' WHERE recID="+i); 
         } 
        } 
       } 
      } 

     } 

    } 

    private void printTable(String[][] t){ 
     for(String[] a : t){ 
      for(String b: a){ 
       System.out.print(b+" "); 
      } 
      System.out.println(); 
     } 
    } 

    public static void main(String[] args){ 
     String [] tableNames = SQLCommands.returnSQLCommand("SELECT name FROM sqlite_master"); 
     new ViewTable(tableNames[tableNames.length -1]); 
    } 

} 
+1

Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –

+0

Где ваш код обновления (возможно, я пропустил его в этом гигантском фрагменте кода, который вы опубликовали)? Или вы ожидаете, что таблица волшебным образом обновится, если что-то изменится в базе данных? – Robin

ответ

5

Вы должны использовать TableModel. Оформить оплату How to Use Tables. Затем fireTableDataChanged() (или другой метод одобрения огня *) уведомит вашу таблицу об изменениях.

Возможно, Using JDBC with GUI API может быть полезным. Он демонстрирует очень базовую интеграцию JDBC и JTable.

+1

-1 для вызова fireXX извне модели: это сама модель, которая _must_ уведомляет своих слушателей об изменениях, +1 для остальных так нуль в сумме :-) – kleopatra

+0

@ kleopatra идея в том, что модель уведомляет своих слушателей. Нет намерения вызывать fireTableDataChanged вне модели. Это просто имя метода - «TableModel.fireTableDataChanged()». – tenorsax

+1

ahh, отлично. Вы можете рассмотреть возможность уточнения намерения, f.i. путем удаления _tableModel._ (в рамках реализации модели нет полевой модели :-) – kleopatra

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