当前位置: 首页 > 知识库问答 >
问题:

如何重新绘制我的JTable

薛烨霖
2023-03-14

所以我有一个包含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(); 

这里有什么问题?

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

共有1个答案

陶树
2023-03-14

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

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

您应该做的是根据和mekysija的结果创建一个新的tablemodel和mekysija应该有UI的想法或概念。然后只需使用jtable#setmodel更新视图...

Swing使用了Model-View-Controller范例的变体

 类似资料:
  • 问题内容: 我在程序开始时,根据数据库中的某些内容,以编程方式在JScrollPane中添加了许多组件(JPanels,JLabels等)。 似乎对于GUI(?)而言,此过程太快了,因此JScrollPane并不总是正确更新,即,即使内部JPanel大于可见区域,滚动条也不可见。 调整窗口大小(JFrame)可以解决此问题,因为我认为Java在调整组件大小时会重新打印它们。 作为测试,我添加了一个

  • 我创建了一个程序,只需在屏幕上移动一个球。我以前把它都放在一节课上,但我觉得它看起来太乱了,所以我把它分成了三个不同的课:主课。。。初始化一切,游戏。。。它描绘一切,是一个JPanel,AL是一个KeyListener(这也是问题所在)。问题是,我无法让程序从我的AL类重新绘制,无论我试图传递什么。有人能帮忙吗?以下是我的三门课: - -

  • 我编写了这段代码,可以在JavaFX画布上绘制。它可以很好地工作,但我不知道如何重新绘制画布(比如在Swing中),以便在新画布上重新开始绘制。这是我的代码,非常感谢你的帮助!马里奥

  • 基本上,从接收一个单击事件,然后我需要多次更改HTML元素,问题是WebView只显示最后一次更改,这意味着渲染不是立即进行的。 问题:如何制作

  • 由于响应于单击Set Default按钮所做的更改是更改ListView的UserData(),而不更改支持的ObservableList,因此列表不能正确地指示新的默认值。 是否有方法强制ListView重新呈现其ListCells?Android用户在这个问题上提出了成千上万个问题,但JavaFX似乎并不快乐。我可能不得不对支持数组进行“无意义的更改”来强制重绘。 我看到这是为JavaFX2.

  • 如果答案是肯定的,该怎么做?最初,我使用repaint()调用paintComponent(图形);但是,最近我意识到repaint()实际上是repaint(0,0,width,height),它每次都重新绘制所有内容。如果我使用带有参数的repaint()来指定脏区域,它将以何种方式将这样的数据传递给paintComponent(图形)?