如何使用 repaint() 更新面板?

how to update panel with repaint()?

我有一个面板-class:

public class MyPanel extends JPanel {
    Color myColor = Color.BLUE;
    String string = "Hello";
    
    public void update(String newString) {
        myColor = Color.GREEN;
        string = newString;
        repaint();
        
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setPaint(myColor);
        g2.drawString(string, 200, 100);        
    }
}

我希望在调用 update() 方法后重新绘制面板。但是 update() 中的所有内容都可以正常工作,但应该重新绘制面板的 repaint() 方法却不行。该面板始终与旧值相同。如何更新值并在面板中显示它们? 在我的 frame-class 中,我正在调用 update() 方法。我检查了我是否使用了该方法并且它有效。值得一提的是:update() 方法的调用不是问题所在。 我也尝试过一段时间后执行 update(),但是 repaint() 从来没有用过。

public class MyFrame extends JFrame {
    
    public MyFrame() {
        setTitle("Task");
        setLayout(new BorderLayout());
        add(new MyPanel(), BorderLayout.CENTER);
    }
    
    public static void main(String [] args) {
        
        MyFrame frame = new MyFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(800, 600);
        frame.setVisible(true);
        
        MyPanel myPanel = new MyPanel();
        myPanel.update("new Hello");
        
        
    }
}

您的代码没问题。这是一个根据我的建议工作的例子。不要像我一样在实际代码中使用通配符导入 ;)

import java.awt.*;
import java.awt.event.*;

import java.io.*;

import javax.swing.*;

public class F extends JFrame {
    class MyPanel extends JPanel implements ActionListener {
        Color myColor = Color.BLUE;
        String string = "Hello";

        public MyPanel() {
            super();
            Timer t = new Timer(2000, this);
            t.start();
        }

        public void update(String newString) {
            // myColor = Color.GREEN;
            // Jazz it up
            // myColor = Color.GREEN;
            myColor = new Color((int) (Math.random() * Integer.MAX_VALUE));
            string = newString;
            repaint();

        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            g2.setPaint(myColor);
            g2.drawString(string, 200, 100);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            String s = "" + (long) (Math.random() * Long.MAX_VALUE);
            update(s);
        }
    }

    private void setGui() {
        try {
            setLocation(0, 100);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            Container cp = getContentPane();
            cp.add(new MyPanel());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        try {
            SwingUtilities.invokeAndWait(new Runnable() {
                public void run() {
                    F f = new F();
                    f.setGui();
                    f.setSize(400, 200);
                    f.setVisible(true);
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}