【问题标题】:Java JPanel repaint() issue?Java JPanel repaint() 问题?
【发布时间】:2014-08-14 07:40:15
【问题描述】:

我对 GUI 有点陌生。我创建了这个简单的应用程序,每次按下按钮时都会用不同的颜色绘制一个椭圆形。但是,当我调用JPanelrepaint() 时,它不仅仅是重新绘制面板的框架部分(椭圆形)。相反,它会重新绘制整个框架,并且还会绘制我在框架顶部(北部边界)单击的按钮。我知道我可以简单地调用JFramerepaint() 来解决这个问题,但我只是想知道为什么会这样。我认为repaint() 所做的只是简单地调用对象的paintComponent()。 有人可以解释为什么它会这样吗? 谢谢!!

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Jbutton extends JFrame implements ActionListener {
    JFrame frame;
    JButton b;
    panel p;

    public void go() {
        frame = new JFrame();
        b = new JButton("click me");
        p = new panel();
        b.addActionListener(this);
        frame.add(BorderLayout.CENTER, p);
        frame.add(BorderLayout.SOUTH, b);
        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
        frame.setSize(250, 250);
        frame.setVisible(true);

    }

    class panel extends JPanel {
        public void paintComponent(Graphics g) {
            int red = (int) (Math.random() * 255);
            int green = (int) (Math.random() * 255);
            int blue = (int) (Math.random() * 255);
            g.setColor(new Color(red, blue, green));
            g.fillOval(20, 30, 50, 50);
        }

}

@Override
public void actionPerformed(ActionEvent arg0) {
    p.repaint();

}
}

【问题讨论】:

    标签: java swing user-interface jpanel components


    【解决方案1】:

    确保您正在调用 super.paintComponent 以准备 Graphics 绘制上下文

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g)
        int red = (int) (Math.random() * 255);
        int green = (int) (Math.random() * 255);
        int blue = (int) (Math.random() * 255);
        g.setColor(new Color(red, blue, green));
        g.fillOval(20, 30, 50, 50);
     }
    

    总而言之,Graphics 上下文是共享资源。在绘制周期中绘制的每个组件都将共享相同的Graphics 上下文,这意味着之前绘制的内容仍然存在。每次调用 paintComponent 时,您都需要清除/准备 Graphics 上下文。

    这基本上就是paintComponent 所做的......

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 2010-09-27
      • 2011-09-18
      • 1970-01-01
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多