0

我有一个正在处理的项目,它允许我创建模板和输入数据。不工作的一件事是表没有动态更新。它只会在我关闭应用程序并再次运行后刷新。是否有与 UpdateUI 类似的方法,它可以在您面前更新,而无需退出应用程序并再次重新打开以查看更改?我有下面的代码,有人能指出什么代码以及我会把它放在课堂上的什么地方吗?谢谢你。

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]);
    }

}
4

1 回答 1

5

你应该使用TableModel. 查看如何使用表格。然后fireTableDataChanged()(或其他适当的 fire* 方法)将通知您的表有关更改。

也许使用带有 GUI API 的 JDBC会有所帮助。它演示了 JDBC 和 JTable 的非常基本的集成。

于 2012-04-19T01:32:15.127 回答