Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTable动态更新_Java_Swing_Jtable_Jframe - Fatal编程技术网

Java JTable动态更新

Java JTable动态更新,java,swing,jtable,jframe,Java,Swing,Jtable,Jframe,我有一个项目,我正在工作,它允许我创建一个模板和输入数据。不起作用的一件事是表没有动态更新。它只会在我关闭应用程序并再次运行后刷新。有没有类似于UpdateUI的方法,它可以在你面前更新,而不必退出应用程序并重新打开它来查看更改?我有下面的代码,有人能指出什么代码和我将把它放在课堂上的什么地方吗?多谢各位 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.

我有一个项目,我正在工作,它允许我创建一个模板和输入数据。不起作用的一件事是表没有动态更新。它只会在我关闭应用程序并再次运行后刷新。有没有类似于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]);
    }

}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Font;
导入java.awt.Insets;
导入java.awt.Toolkit;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.sql.Connection;
导入java.sql.DriverManager;
导入java.sql.ResultSet;
导入java.sql.Statement;
导入java.util.ArrayList;
导入java.util.Collections;
导入javax.swing.JButton;
导入javax.swing.JDialog;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JOptionPane;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.SwingConstants;
导入javax.swing.border.EmptyBorder;
导入javax.swing.border.LineBorder;
导入javax.swing.event.CellEditorListener;
导入javax.swing.event.ChangeEvent;
公共类ViewTable扩展了JFrame{
私有静态最终长serialVersionUID=1L;
私有静态最终字符串首选\u LOOK\u和\u FEEL=null;
私有静态字符串表名;
私有字符串[]列名称;
私有字符串[][]数据;
私人JPanel主面板;
专用JTable表格窗格;
私有int-dataX;
私有int数据;
公共视图表(字符串表名){
this.tableName=tableName;
初始化组件();
loadDB();
displayTable();
/*setDefaultCloseOperation(CreateTemplate.DISPOSE_ON_CLOSE);
设置大小(700700);
setTitle(“视图表”);
setVisible(真)*/
维度dim=Toolkit.getDefaultToolkit().getScreenSize();
此设置尺寸(尺寸宽度、尺寸高度);
此.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
此.setVisible(true);
}
私有组件(){
mainPanel=newjpanel(newborderlayout());
添加(主面板);
主面板。立根背景(颜色。灰色);
JPanel-topPanel=newjpanel(newborderlayout());
托帕内尔。挫折背景(颜色。深灰色);
主面板。添加(topPanel,BorderLayout.NORTH);
JLabel titleLabel=新的JLabel(this.tableName);
标题标签.设置顺序(新的线边框(颜色.黑色));
titleLabel.setFont(新字体(“Helvetica”,Font.BOLD,24));
标题标签。设置前景(颜色。白色);
标题标签设置水平对齐(SwingConstants.CENTER);
添加(标题标签、边框布局、中心);
JPanel buttonPanel=newjpanel(newborderlayout());
JButton exitButton=新JButton(“完成”);
exitButton.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件){
关闭_窗口();
}
});
exitButton.setBorder(新的EmptyBorder(新的插图(20,20,20,20));
buttonPanel.add(exitButton,BorderLayout.EAST);
JButton deleteButton=新JButton(“删除条目”);
deleteButton.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件){
Object[]行=新对象[dataX-1];
for(int r=0;r!=rows.length;r++){
行[r]=数据[r][0];
}
//JOptionPane delAsk=new JOptionPane(“删除条目:”,JOptionPane.PLAIN_消息,JOptionPane.DEFAULT_选项,null,rows,rows[0]);
//德拉斯。
//delAsk.set.InputDialogue(null,“删除条目:”,“删除”,JOptionPane.PLAIN_消息,null,行,行[0]);
//JDialog dialog=delAsk.createDialog(null,“删除”);
//dialog.show();
//String del=(String)delAsk.getInputValue();
//系统输出打印项次(del);
对象删除行
=JOptionPane.showInputDialog(null,“您希望删除哪个条目”,
“删除条目”,JOptionPane.INFORMATION\u消息,null,
行,行[0]);
int指数=-1;
for(int i=0;i!=rows.length;i++){
if(rows[i].equals(deleteRow.toString()){index=i;}
}
SQLCommands.SQLCommand(“从“+tableName+”中删除,其中recID=”“+index+””);
初始化组件();
loadDB();
displayTable();
tablePane.updateUI();
}
});
deleteButton.setOrder(新的EmptyOrder(新的插图(20,20,20,20));
buttonPanel.add(deleteButton,BorderLayout.WEST);
添加(按钮面板,边框布局。东);
}
private void close_window(){this.dispose();}
私有void loadDB(){
//获取列名
columnNames=getColumnNames();
对于(字符串S:columnNames){System.out.println(S);}//JOptionPane.showInputDialog(“输入模板名”);}
//临时添加新的虚拟数据
//SQLCommands.SQLCommand(“插入“+tableName+”值(1,'av','bv','cv','dv','ev')”;
//使用列名填充数据
String[]col=SQLCommands.returnSQLCommand(“从“+tableName+”中选择“+columnNames[0]+”);
dataX=列长度+1;
dataY=columnNames.length;
System.out.println(dataX+“”+dataY);
数据=新字符串[dataX][dataY];
打印表(数据);
System.out.println();
//e、 g.数据[4][0]=>“从表名中选择名称”[4]
for(int j=0;j!=columnNames.length;j++){
字符串n=列名称[j];
col=SQLCommands.returnSQLCommand(“从“+tableName+”中选择“+n+”);
对于(int i=0