1

Swing ライブラリ インターフェイスに更新ボタンを含めようとしています。ボタンの目的は、JTable追加/削除/更新クエリが呼び出された後にコンテンツを更新することです。私はいくつかの調査を行い、クラスtableDataChanged()からそれを見ました。AbstractTableModel問題は、これがどこで呼び出されるべきかわからないことです。を使っているDefaultTableModelので、この方法も使えると思います。

/*This is where I create the query and add the JTable to a scrollPane, an ResultsPanel
 object is then added to a JFrame object*/




 public class SitePanel extends JPanel implements Constants  {
 ResultsPanel resultsPanel = new ResultsPanel();
   JTable table;
   DefaultTableModel model;
   JPanel sitePanel = new JPanel();
   JPanel results = new JPanel();

   public SitePanel(){
addComponents();
}

public void addComponents(){
    sitePanel.setLayout(new BorderLayout());
    sitePanel.add(buttonPanel, BorderLayout.NORTH);
    sitePanel.add(resultsPanel, BorderLayout.CENTER);
    sitePanel.setVisible(true);
    add(new JScrollPane(sitePanel));
}

 class ButtonPanel extends JPanel{
 JPanel buttons = new JPanel();

       public ButtonPanel(){
      buttons.setLayout(new FlowLayout());
      buttons.add(refreshButton);
      show();
      buttons.setVisible(true);
      add(buttons);

    }
  public void show(){

  refreshButton.addActionListener(new ActionListener(){
   @Override
            public void actionPerformed(ActionEvent arg0) {
                new ResultsPanel();
                table.setModel(model);
            }
        }
                );
 }
 public class ResultsPanel extends JPanel{


     public ResultsPanel(){

        execute();
        results.add(scrollPane);
        javax.swing.SwingUtilities.invokeLater(new Runnable(){
            public void run(){
                results.setBorder(greenB);
                results.setToolTipText("Results");
                results.setVisible(true);
                add(results);

            }
        });
    }

        public void execute() {
        Vector columnNames = new Vector();
        Vector data = new Vector();

        try{
            Connection conn = Connect.getConnection();
            String query = "Select Name from Location Order By Name";
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(query);
            ResultSetMetaData md = rs.getMetaData();
            int columns = md.getColumnCount();

            for (int i=1; i<=columns;i++){
                columnNames.addElement(md.getColumnName(i));
            }       
            while (rs.next()){
                Vector row = new Vector(columns);

                for(int i=1; i<=columns;i++){   
                    row.addElement(rs.getObject(i));
                }
                data.addElement(row);
            }
            rs.close();
            stmt.close();
            conn.close();
        }
        catch (Exception e){
            e.printStackTrace();
        }
        model = new DefaultTableModel(data, columnNames);

        model.addTableModelListener(table);
        table = new JTable(model){
            public boolean isCellEditable(int row, int col){
                return false;
            }

            public Class getColumnClass(int column){
                for (int row=0; row<getRowCount();row++){
                    Object o = getValueAt(row, column);

                    if(o!=null){
                        return o.getClass();
                    }
                }
                return Object.class;
            }
        };

        scrollPane = new JScrollPane(table);
        scrollPane.setBorder(border);
        scrollPane.getVerticalScrollBar().setBackground(Color.LIGHT_GRAY);
    }
}

           }

これは main メソッドを持つクラスです。

import java.net.URL;
import java.sql.*;
import javax.swing.*;



 public class Connect extends JFrame{

public static String user = null;
public static String password = null;
static Connection conn = null;

public static void loginGUI() throws Exception{
    JPasswordField passwordField = new JPasswordField();
    JTextField userField = new JTextField();
    passwordField.setEchoChar('*');
    Object[] obj = {"Username:\n", userField, "Password:\n", passwordField};
    Object stringArray[] = {"OK", "Cancel"};
    if(JOptionPane.showOptionDialog(null, obj, "Login", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, stringArray, obj)==JOptionPane.YES_OPTION);
    password = new String (passwordField.getPassword());
    user = userField.getText();
    Conn.formConnection();


}



public static void main (String[] args) throws Exception{
            javax.swing.SwingUtilities.invokeLater(new Runnable(){
        public void run(){
            try {
                                    Connect.loginGUI();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}
/**
 * Static connection class can only be created once at any given time.
 * @author Nosheen Mahate
 *
 */
public static class Conn{

    public static Connection formConnection() throws Exception{
        try{
            String driver = "net.sourceforge.jtds.jdbc.Driver";
            String url = "jdbc:jtds:sqlserver://BHX4DT-4FPQ35J:1433/Forecast;instance=SQLEXPRESS" +
                    ";user=" +user +";password="+ password +";ssl=request;Encrypt=true;TrustServerCertificate=true";
            Class.forName(driver);
            conn = DriverManager.getConnection(url, user, password);

            try{
                password = null;
                JFrame frame = new JFrame();
                                              frame.add(new SitePanel());
                                              frame.pack();
                                              frame.setVisible(true);
            }
            catch (Exception e){
                System.exit(1);
                JOptionPane.showMessageDialog(null, e, "Error", JOptionPane.ERROR_MESSAGE);


                e.printStackTrace();

            }
        }
        catch (Exception e){
            if(password != null || user !=null){
                JOptionPane.showMessageDialog(null, e, "Error",      JOptionPane.ERROR_MESSAGE);
            }
            else{
            System.exit(1);

            }
            System.out.println("No Connection");
        }

        return conn;

    }
    /**
     * Used to check that the connection is still established
     */
}
public static Connection getConnection(){
    return conn;
}

/**
 * Close the connection to the server
 * @throws SQLException
 */
public static void closeConnection() throws SQLException{
    conn.close();
    conn = null;
}
}

そこにはかなりのコードがあることは知っていますが、何が必要なのかよくわかりませんでした。再実行するために、JTableをクリックした後に を更新する方法と、必要に応じJButtonてメソッドを呼び出す場所を知りたかったのです。fireTableDataChanged()

4

1 に答える 1

2
  1. からご覧ください

  2. EventDispatchThreadで両方 (am) を更新しないようにするにXxxResultSetTableModelは、

  3. すべてJDBCおよびJTables の更新をWorkers Thread、 from Runnable#Thread、より良いのはSwingWorker から開始します。そうしないと、Swing GUI がフリーズJDBCし、JTables更新が終了するまで停止します。

  4. 両方のコードはコード例であり、すべてのXxx.close() を (add create a new)finallyブロック ( try- catch- finally)に移動する必要があることに注意してください。

于 2012-12-04T09:26:46.957 に答える