代码之家  ›  专栏  ›  技术社区  ›  Berk Kurkcuoglu

重新绘制()方法不能多次工作

  •  -2
  • Berk Kurkcuoglu  · 技术社区  · 11 年前

    我目前正在从事一个管理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 回复  |  直到 11 年前
        1
  •  0
  •   Andrew Thompson    11 年前

    我可以在代码中看到一些不一致之处:

    1. 这个 actor 变量未设置为操作侦听器中添加的组件。
    2. 第一次添加 new JScrollPane(createTables("actor")) 然后你只添加 createTables("actor") .

    (1)可能导致问题。

        2
  •  0
  •   Sertage    11 年前

    我认为问题出在演员身上:

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

    这里,变量actor在card1中没有更多引用。为了不丢失此引用,您应该在两个actionPerformed方法中执行以下操作:

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