repaint()方法不能多次使用

时间:2015-08-18 11:43:19

标签: java swing repaint

我目前正在开发一个管理sql数据库的gui项目。我目前正在添加,删除日志并显示mysql中存在的表。问题是我的面板上的添加和删除按钮应该在添加或删除记录时重新绘制/刷新该面板上的表但是在测试时我发现重绘方法在第一次使用按钮后不刷新表。什么可能导致这个问题?提前谢谢..

public JTabbedPane addComponentToPane() {
        //Container pane = new Container();
        JTabbedPane tabbedPane = new JTabbedPane();

        JPanel card1 = new JPanel();
        JPanel card2 = new JPanel();
        JPanel card3 = new JPanel();
        JPanel card4 = new JPanel();
        JPanel card5 = new JPanel();
        JPanel card6 = new JPanel();
        JPanel card7 = new JPanel();
        JPanel card8 = new JPanel();

        card1.setLayout(new BorderLayout());
        card2.setLayout(new BorderLayout());
        card3.setLayout(new BorderLayout());
        card4.setLayout(new BorderLayout());
        card5.setLayout(new BorderLayout());
        card6.setLayout(new BorderLayout());
        card7.setLayout(new BorderLayout());
        card8.setLayout(new BorderLayout());

        JScrollPane actor = new JScrollPane(createTables("actor"));

        card1.add(actor, BorderLayout.CENTER);
        card3.add(createTables("address"), BorderLayout.CENTER);
        card4.add(createTables("category"), BorderLayout.CENTER);
        card5.add(createTables("city"), BorderLayout.CENTER);
        card6.add(createTables("country"), BorderLayout.CENTER);
        card7.add(createTables("customer"), BorderLayout.CENTER);
        card8.add(createTables("film"), BorderLayout.CENTER);

        JButton button = new JButton("Yeni Kayıt");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                addRecord("actor");                
                card1.remove(actor);
                card1.add(createTables("actor"), BorderLayout.CENTER);
                card1.validate();
                card1.repaint();                
            }
        });
        JButton delButton = new JButton("Kayıt sil");
        delButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                delRecord("actor");
                card1.remove(actor);
                card1.add(createTables("actor"), BorderLayout.CENTER);
                card1.validate();
                card1.repaint();
            }
        });``

        card1.add(button, BorderLayout.SOUTH);
        card1.add(delButton, BorderLayout.EAST);

        tabbedPane.addTab("Şirketler", null, card1, "şirket tanımları");
        tabbedPane.addTab("Sorumlular", card2);
        tabbedPane.addTab("Varlık Grupları", card3);
        tabbedPane.addTab("Bilgi Varlıkları", card4);
        tabbedPane.addTab("Varlık Değerleri", card5);
        tabbedPane.addTab("Açıklıklar", card6);
        tabbedPane.addTab("Tehditler", card7);
        tabbedPane.addTab("Ek-A", card8);

        //pane.add(tabbedPane, BorderLayout.CENTER);
        return tabbedPane;
    }

创建从sql表创建Jtable的表方法。

private JScrollPane createTables(String tablename) {
        Connection con = null;
        Statement statement = null;
        ResultSet result = null;
        String query;
        JScrollPane jsp = null;

        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "root", "root");
            statement = con.createStatement();
            query = "select * from " + tablename;
            result = statement.executeQuery(query);
            ResultSetMetaData rsmt = result.getMetaData();
            int columnCount = rsmt.getColumnCount();
            Vector column = new Vector(columnCount);
            for (int i = 1; i <= columnCount; i++) {
                column.add(rsmt.getColumnName(i));
            }
            Vector data = new Vector();
            Vector row = new Vector();
            while (result.next()) {
                row = new Vector(columnCount);
                for (int i = 1; i <= columnCount; i++) {
                    row.add(result.getString(i));
                }
                data.add(row);
            }
            defTableModel = new DefaultTableModel(data, column);
            table = new JTable(defTableModel) {
                @Override
                public boolean isCellEditable(int row, int column) {
                    return false;
                }
            ;
            };
            //table.setAutoCreateRowSorter(true);
            TableRowFilterSupport.forTable(table).searchable(true).apply();
            table.setRowSelectionAllowed(true);

            jsp = new JScrollPane(table);

        }
        catch (Exception e) {
            e.printStackTrace();
            // JOptionPane.showMessageDialog(null, "ERROR");
        }
        finally {
            try {
                statement.close();
                result.close();
                con.close();
            }
            catch (Exception e) {
                //JOptionPane.showMessageDialog(null, "ERROR CLOSE");
            }
        }

        return jsp;
    }

2 个答案:

答案 0 :(得分:0)

我可以在代码中看到几个不一致的地方:

  1. actor变量未设置为动作侦听器中添加的组件。
  2. 首次添加new JScrollPane(createTables("actor"))然后再添加createTables("actor")
  3. (1)可能导致问题。

答案 1 :(得分:0)

我认为问题是对演员的引用:

card1.remove(actor);
card1.add(createTables("actor"), BorderLayout.CENTER);

这里,card1中不再引用变量actor。为了不丢失此引用,您应该在两个actionPerformed方法中执行类似的操作:

card1.remove(actor);
actor = new JScrollPane(createTables("actor"));
card1.add(actor, BorderLayout.CENTER);