在 Java 的 Swing 编程中,如果你想要刷新 JPanel 上的内容,有几种不同的实现方式。下面将介绍这些方式,并提供相应的步骤流程和示例代码。
假设你有一个 JPanel 对象名为 panel,以下是刷新该 JPanel 的几种方式:
这是最基本的刷新方式,调用 repaint() 方法会触发 Swing 组件的重绘操作,即调用组件的 paintComponent() 方法重新绘制组件。
步骤流程:
JPanel 对象。repaint() 方法刷新面板。示例代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class RepaintExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("JPanel Repaint Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.setColor(Color.RED);
                g.fillRect(50, 50, 100, 100);
            }
        };
        JButton repaintButton = new JButton("Repaint");
        repaintButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                panel.repaint();
            }
        });
        frame.add(panel, BorderLayout.CENTER);
        frame.add(repaintButton, BorderLayout.SOUTH);
        frame.pack();
        frame.setVisible(true);
    }
}
如果你对 JPanel 的布局进行了修改(例如添加、移除了组件),则需要先调用 revalidate() 方法来重新计算布局,然后再调用 repaint() 方法刷新。
步骤流程:
JPanel 对象。revalidate() 方法重新计算布局。repaint() 方法刷新面板。示例代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class RevalidateRepaintExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("JPanel Revalidate and Repaint Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        JButton addButton = new JButton("Add Component");
        addButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JButton newButton = new JButton("New Button");
                panel.add(newButton);
                panel.revalidate(); // Revalidate layout
                panel.repaint();    // Repaint panel
            }
        });
        frame.add(panel, BorderLayout.CENTER);
        frame.add(addButton, BorderLayout.SOUTH);
        frame.pack();
        frame.setVisible(true);
    }
}
有时候,使用第三方库可以更方便地实现更复杂的刷新和动画效果。在这里,我们使用一个叫做 AnimatePanel 的第三方库来实现刷新效果。
步骤流程:
示例代码: 首先,你需要添加 AnimatePanel 的依赖:
Maven:
<dependency>
    <groupId>org.jdesktop</groupId>
    <artifactId>swingx</artifactId>
    <version>1.6.5</version>
</dependency>
Gradle:
implementation 'org.jdesktop:swingx:1.6.5'
接下来,可以使用 AnimatePanel 来创建一个带有动画效果的面板:
import org.jdesktop.swingx.JXPanel;
import org.jdesktop.swingx.painter.BusyPainter;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class AnimatePanelExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("AnimatePanel Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JXPanel panel = new JXPanel();
        panel.setLayout(new BorderLayout());
        BusyPainter painter = new BusyPainter(new Dimension(50, 50));
        painter.setTrailLength(6);
        painter.setPoints(8);
        painter.setFrame(8);
        painter.setBaseColor(Color.RED);
        panel.setBackgroundPainter(painter);
        JButton startButton = new JButton("Start Animation");
        startButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                painter.resume();
            }
        });
        JButton stopButton = new JButton("Stop Animation");
        stopButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                painter.suspend();
            }
        });
        panel.add(startButton, BorderLayout.NORTH);
        panel.add(stopButton, BorderLayout.SOUTH);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }
}
在这个示例中,我们使用了 AnimatePanel 来创建一个带有旋转动画的面板,并通过按钮控制动画的启动和停止。