【问题标题】:How to repaint my JTable如何重绘我的 JTable
【发布时间】:2014-04-09 05:51:55
【问题描述】:

所以我有一个包含 JTable 的应用程序。 JTable 位于 JScrollPane 内部,而 JScrollPane 绘制在 JFrame 上。

现在在我的应用程序中,我打开一个新窗口以向该表添加新行,然后单击按钮保存更改后,新窗口将关闭。

现在我尝试在新窗口关闭后添加这些行:

askTableInfo(); //a method to save the info in database to table and then save the table to variable 'table'
table.repaint();
scrollPane.repaint(); 

当然还有 repaint();通过它自己。但它似乎仍然没有更新我在 JFrame 中的表。

这可能是什么问题?

public class AppWindow extends JFrame implements ActionListener {
    String user = "";
    JLabel greetText = new JLabel();
    JPanel panel = new JPanel();
    JPanel panel2 = new JPanel(new GridLayout(1, 3));
    JScrollPane scrollPane;
    JTable tabel;
    JButton newBook = new JButton("Add a book");
    JButton deleteBook = new JButton("Remove a book");
    JButton changeBook = new JButton("Change a book");
    int ID;

    public AppWindow(String user, int ID) {
        this.ID = ID;
        this.user = user;
        setSize(500, 500);
        setTitle("Books");

        setLayout(new BorderLayout());
        greetText.setText("Hi "+user+" here are your books:");
        add(greetText, BorderLayout.NORTH); 

        askData();  
        panel.add(scrollPane);
        add(panel, BorderLayout.CENTER);

        panel2.add(newBook);
        panel2.add(deleteBook);
        panel2.add(changeBook);
        add(paneel2, BorderLayout.SOUTH);

        newBook.addActionListener(this);

        setVisible(true);
    }

    private void askData() {
        DataAsker asker = null;
        try {
            asker = new AndmeKysija(ID);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        table = asker.giveTable();
        scrollPane = new JScrollPane(tabel);
    }

    public static void main(String[] args){
        AppWindow window = new AppWindow("Name", 2);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == newBook){
                new BookAdded(ID);
                panel.revalidate();
                panel.add(scrollPane);
                panel.repaint();
                repaint();
        }   
    }
}

【问题讨论】:

  • 听起来您要更新的表格和屏幕上的表格不一样和/或表格模型的情况相同...
  • 在我的“askTableInfo()”方法中,我确实有一个“scrollPane = new JScrollPane(table);”。这可能是问题所在?在这种情况下,如何使用新信息更新已经绘制好的 Scrollpane?
  • 更新表模型
  • 我编辑了我的原始帖子。您可以在那里看到它创建了一个新的 DataAsker,它从数据库中获取数据,然后使用数据创建表。之后,信息被保存到变量中。我认为这应该足以更新表模型?
  • 我的意思是,不要。将原始表格和滚动窗格留在原处。只需创建一个新的TableModel 并将其应用于现有表或更新现有的TableModel...

标签: java swing jtable repaint


【解决方案1】:

不是最好的方法,但它会让你越界...

public AppWindow(String user, int ID) {
    this.ID = ID;
    this.user = user;
    setSize(500, 500);
    setTitle("Books");

    setLayout(new BorderLayout());
    greetText.setText("Hi "+user+" here are your books:");
    add(greetText, BorderLayout.NORTH); 

    JTable table = askData();  
    scrollPane.setViewportView(table);
    panel.add(scrollPane);
    add(panel, BorderLayout.CENTER);

    panel2.add(newBook);
    panel2.add(deleteBook);
    panel2.add(changeBook);
    add(paneel2, BorderLayout.SOUTH);

    newBook.addActionListener(this);

    setVisible(true);
}

private JTable askData() {
    DataAsker asker = null;
    try {
        asker = new AndmeKysija(ID);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return asker.giveTable();
}

public static void main(String[] args){
    AppWindow window = new AppWindow("Name", 2);
}

@Override
public void actionPerformed(ActionEvent e) {
    if(e.getSource() == newBook){
        new BookAdded(ID);
        JTable table = askData();  
        scrollPane.setViewportView(table);
    }   
}

您应该做的是根据AndmeKysija 的结果创建一个新的TableModelAndmeKysija 应该有 UI 的想法或概念。然后您只需使用JTable#setModel 来更新视图...

Swing 使用Model-View-Controller 范式的变体

【讨论】:

  • 当 JTable 被声明时,它给了我 NullPointerExeption。有点奇怪。我的意思是我之前也声明过,它就在那里......
  • 不是最好的方法 完整的 ACK ;-) 那你为什么要展示它......它太糟糕了,它几乎无用(你知道:-) @ Veske - 一定要阅读关于 JTable 的优秀教程并了解表/模型的交互,正如 mad 最后建议的那样。
  • 嗯,我不知道没有什么能解决问题。您显示的代码创建了一些指针异常。想也许我应该让它关闭窗口并重新打开它,这样它至少会显示变化。
  • @kleopatra 现在是下午 630 点,我遇到了构建问题,并且对话已经进行了足够长的时间 - 我还需要 AndmeKysija 的代码才能取得进展...
  • @Veske 鉴于我们只有有限的代码快照,因此不可能重新格式化整个内容...
猜你喜欢
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多