2016-06-02 1 views
0

У меня есть текстовое поле, которое позволяет пользователям помещать запросы типа типа с идеей, что при нажатии кнопки результат оператора select будет показан в JTable. Я не получаю никаких ошибок, но также ничего не отображается в текстовой панели при нажатии кнопки. У меня есть ниже:Как заполнить JTable из базы данных при событии кнопки

public class Console { 

    String myquery=""; 

    private JFrame frame; 
    private JTextField textField; 


    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        Console window = new Console(); 
        window.frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 


    public Console() { 
     initialize(); 
    } 


    private void initialize() { 
     frame = new JFrame(); 
     frame.setBounds(100, 100, 950, 800); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    JTextArea textAreaQuery = new JTextArea(); 
      JTable table_ResQues = new JTable(); 
      JButton btnNewButton = new JButton("Execute"); 
      btnNewButton.addActionListener(new ActionListener() { 

       public void actionPerformed(ActionEvent e) 
       { 
        String connectDB = "jdbc:ucanaccess:///Users/sebastianzeki/Documents/PhysJava/Physiology.mdb;"; 
        System.out.println("Connection To Database Made"); 
        Connection conn = null; 

         try { 
          conn = DriverManager.getConnection(connectDB); 
         } catch (SQLException e1) { 
          e1.printStackTrace(); 
         } 
         Statement st = null; 
         try { 
          st = conn.createStatement(); 
         } catch (SQLException e1) { 
          e1.printStackTrace(); 
         } 
         myquery=textAreaQuery.getText(); 
         String stg2 = "Select "+myquery; 
         ResultSet rs = null; 
         try { 
          rs = st.executeQuery(stg2); 
          table_ResQues.setModel(getDataFromDatabase); 
         } catch (SQLException e1) { 
          e1.printStackTrace(); 
         } 
       } 
} 

и код для построения модели:

public TableModel getDataFromDatabase() 
{ 
    DefaultTableModel model = new DefaultTableModel(5, 5); 
    model.setValueAt("Hard", 0, 0); 
    model.setValueAt("Coded", 1, 1); 
    model.setValueAt("Data", 2, 2); 

    return model; 
} 
    } 
+0

Невозможно определить из этого кода, будут ли отображаться ваша таблица, текстовая область и т. Д. Кроме того, не используйте 'Vector' – pvg

+0

Они отображаются только не заполненными –

+1

', но и ничего не отображается в текстовой области' - я предполагаю, что вы имеете в виду «JTable». Основной код выглядит разумным. Вы используете метод setModel (...) 'для обновления таблицы, которая правильна, если таблица добавлена ​​в JScrollPane и scrollPane, добавленную в фрейм. Поэтому, полагая, что ResultSetMetaData и ResultSet действительно возвращают некоторые данные, он должен работать. – camickr

ответ

1

Ive удалил локальную переменную

Нет, вы удалили переменную экземпляра. Вы действительно попробовали это с помощью своего реального кода или просто отредактировали вопрос?

Я понятия не имею, как обеспечить проверяемую базу данных по этому вопросу

Я уже предложил вам создать метод, чтобы упростить логику. Somethng как:

public TableModel getDataFromDatabase() 
{ 
    DefaultTableModel model = new DefaultTableModel(5, 5); 
    model.setValueAt("Hard", 0, 0); 
    model.setValueAt("Coded", 1, 1); 
    model.setValueAt("Data", 2, 2); 

    return model; 
} 

Затем в ActionListener вы просто сделать что-то вроде:

table_ResQues.setModel(getDataFromDataBase()); 

После того, как вы получите эту основную логику рабочего перемещении SQL логики в метод getDataFromDatabase().

Итак, теперь вы создаете свой SSCCE, показывающий, как вы на самом деле создаете фрейм и добавляете компоненты в фрейм. Код должен быть компилируемым и исполняемым.

Edit:

Вы сказали, чтобы отобразить таблицу является ScrollPane. Это не лишние усилия для этого. Вместо использования:

panel.add(table); 

вы используете:

panel.add(new JScrollPane(table)); 

Я хотел бы также предположить, что для проверки макета можно использовать код, как следующий, чтобы отобразить фиктивную таблицу:

//JTable table_ResQues = new JTable(); 
JTable table_ResQues = new JTable(5,5); 

Затем, когда вы используете метод setModel(), затрагиваются только данные, а не макет таблицы.

Я не могу помочь, но чувствую, что это проблема с fireTableDataChanged.

Я сомневаюсь. Этот метод вызывается TableModel при изменении данных в модели. Он не используется в этом случае, потому что вы используете метод setModel(...). Это заставит таблицу автоматически перерисовывать().

+0

OK отредактирован.Я не могу помочь, но чувствую, что это проблема с fireTableDataChanged. Я думаю, что JTable не заполняется ничем, когда кадр загружается, а затем, когда нажата кнопка, он не знает, что данные изменились, поэтому ничего нового не добавлено? –

+0

Вы полностью пропустили точку метода getDataFromDatabase(). В любом коде SQL нет необходимости. – camickr

+0

ОК. Похоже, мне просто пришлось добавить его в JscrollPane. Спасибо @camickr –

0

Это мое решение проблемы. Я сохранил имена переменных, но не все из них соответствовали соглашениям Java. Я думаю, что все, что вам нужно, это то, что пользователь будет вводить SQL-запрос в JTextArea и видеть результат запроса в JTable.

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.FlowLayout; 
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.ResultSetMetaData; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JSplitPane; 
import javax.swing.JTable; 
import javax.swing.JTextArea; 
import javax.swing.table.AbstractTableModel; 

public class Console { 
    private JFrame frame; 
    private JTextArea textAreaQuery; 
    private JTable table_ResQues; 
    private JButton btnNewButton; 

public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       Console window = new Console(); 
       window.frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

public Console() { 
    initialize(); 
} 

private void initialize() { 
    frame = new JFrame("SQL Query"); 
    frame.setBounds(100, 100, 950, 800); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    textAreaQuery = new JTextArea(); 
    btnNewButton = new JButton("Execute"); 
    table_ResQues = new JTable(); 

    JPanel queryPanel=new JPanel(new BorderLayout()); // holds JTextArea and JButton 

    queryPanel.add(new JScrollPane(textAreaQuery), BorderLayout.CENTER); 

    JPanel btnPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); 
    btnPanel.add(btnNewButton); 
    queryPanel.add(btnPanel, BorderLayout.SOUTH);  

    JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, queryPanel, 
      new JScrollPane(table_ResQues)); 
    splitPane.setOneTouchExpandable(true); 
    splitPane.setDividerLocation(150); 
    frame.setContentPane(splitPane);   
    btnNewButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      /*try { 
       Class.forName("com.mysql.jdbc.Driver"); 
      } catch (ClassNotFoundException e2) {     
       e2.printStackTrace(); 
      }*/ 
      String connectDB = "jdbc:ucanaccess:///Users/sebastianzeki/Documents/PhysJava/Physiology.mdb;";   
      Connection conn = null; 
      Statement st = null; 
      try { 
       conn = DriverManager.getConnection(connectDB); 
       //conn = DriverManager.getConnection("jdbc:mysql://localhost/cwcx", "root", "admin");// MySQL connection 
       st = conn.createStatement(); 
       System.out.println("Connection To Database Made"); 
      } catch (SQLException e1) { 
       e1.printStackTrace(); 
      } 

      String myquery = textAreaQuery.getText(); 
      if(myquery.endsWith(";")){ 
       myquery=myquery.substring(0, myquery.length()-1); 
      } 
      ResultSet rs = null; 
      try { 
       rs = st.executeQuery(myquery); 
       // extract column information 
       ResultSetMetaData rsmd = rs.getMetaData(); 
       int columnCount = rsmd.getColumnCount(); 
       List<String> columnData = new ArrayList<String>(columnCount); 
       for (int i = 1; i <= columnCount; i++) { 
        columnData.add(rsmd.getColumnName(i)); 
       } 
       // sql result data 
       List<List<Object>> rowData = new ArrayList<List<Object>>(); 
       while (rs.next()) { 
        List<Object> row = new ArrayList<Object>(columnCount); 
        for (int i = 0; i < columnCount; i++) { 
         row.add(rs.getObject(i + 1)); 
        } 
        rowData.add(row); 
       }     
       table_ResQues.setModel(new ListTableModel(rowData, columnData));      
      } catch (SQLException e1) { 
       JOptionPane.showMessageDialog(frame, e1.getMessage(), "SQL Exception", JOptionPane.ERROR_MESSAGE); 
       e1.printStackTrace(); 
      }finally{ 
       if(rs!=null){ 
        try { 
         rs.close(); 
        } catch (SQLException e1) {       
         e1.printStackTrace(); 
        } 
       } 
       if(st!=null){ 
        try { 
         st.close(); 
        } catch (SQLException e1) {       
         e1.printStackTrace(); 
        } 
       } 
       if(conn!=null){ 
        try { 
         conn.close(); 
        } catch (SQLException e1) {       
         e1.printStackTrace(); 
        } 
       } 
      } 
     } 

    }); 

} 

// this table model is created from two dimensional List rowData and single dimensional List columnData 
private static class ListTableModel extends AbstractTableModel{  
    private static final long serialVersionUID = 1L;   
    private List<List<Object>> rowData;  
    private List<String> columnData;   
    public ListTableModel(List<List<Object>> rowData, List<String> columnData) {    
     this.rowData = rowData; 
     this.columnData = columnData; 
    } 

    @Override 
    public int getRowCount() {   
     return rowData.size(); 
    } 

    @Override 
    public int getColumnCount() {   
     return columnData.size(); 
    } 

    @Override 
    public Object getValueAt(int rowIndex, int columnIndex) {  
     return rowData.get(rowIndex).get(columnIndex); 
    } 

    @Override 
    public String getColumnName(int column) {   
     return columnData.get(column); 
    } 

    @Override 
    public Class<?> getColumnClass(int columnIndex) { 
     Object obj=rowData.get(0).get(columnIndex); 
     return obj.getClass(); 
    }  
    } 

} 

В моей системе, я проверил его с MySQL базой данных. Но я прокомментировал эту часть. Вы можете попробовать это в своей системе без каких-либо изменений. Пожалуйста, скажите мне, хотите ли вы достичь этого решения или нет.

+0

@SebastianZeki Решил ли я вашу проблему? –

+0

@SebastianZeki Поскольку этот ответ не является решением вашей проблемы, я собираюсь удалить его. –