gpt4 book ai didi

java - JPanel 上出现的视觉伪像

转载 作者:行者123 更新时间:2023-12-04 14:13:08 26 4
gpt4 key购买 nike

我正在尝试使用 BorderLayout 创建一个包含 2 个 JPanel 的程序。中心面板用于随机绘制矩形,而南面板用于按钮。

每当我将鼠标光标悬停在北按钮或南按钮上时,JFrame 左上角的按钮就会出现奇怪的图像。我做了一些研究,发现这可能是透明背景的原因。我尝试对面板使用 super.paintComponent(g),但之前绘制的其余矩形消失了。我需要将矩形保留在 JPanel 中,而不是左上角的奇怪图像。

我不知道我做错了什么,希望有人能帮助或提供一些关于如何解决这个问题的线索。

    public class TwoBRandomRec extends JFrame{

private static final long serialVersionUID = 1L;

public static void main(String[] args) {
TwoBRandomRec rec = new TwoBRandomRec();

rec.setSize(500,500);
rec.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
rec.setVisible(true);
}

public TwoBRandomRec() {
//Create the buttons
JButton north = new JButton("North");
JButton south = new JButton("South");
DrawPanel drawPanel = new DrawPanel(500,500);

JPanel southP = new JPanel();
southP.add(south);
southP.add(north);

this.add(drawPanel, BorderLayout.CENTER);
this.add(southP, BorderLayout.SOUTH);

this.setTitle("TwoButtonRandomRec");
this.pack();
}

public class DrawPanel extends JPanel {

private static final long serialVersionUID = 1L;

private Random rand = new Random();
private int x,y,xSize,ySize;
private int height,width;

public DrawPanel(int w,int h) {
width = w;
height = h;
}
public void RandomX(){
x=rand.nextInt(width-1);
xSize=rand.nextInt(width-x);
}

public void RandomY(){
y=rand.nextInt(height-1);
ySize=rand.nextInt(height-y);
}

public Color RandomColour(){
rand.nextInt(height);
return new Color(rand.nextInt(255),rand.nextInt(255),rand.nextInt(255));
}

@Override
protected void paintComponent(Graphics g) {
RandomX();
RandomY();

g.setColor(RandomColour());
g.fillRect(x, y, xSize, ySize);
try {
Thread.sleep(50);

} catch (InterruptedException e) {
}

repaint();
}
}
}

最佳答案

你没有调用 super.paintComponent

protected void paintComponent(Graphics g) {
super.paintComponent(g); // <-- Insert me here and watch problem go away
RandomX();
RandomY();

g.setColor(RandomColour());
g.fillRect(x, y, xSize, ySize);
try {
Thread.sleep(50); // <-- This is an INCREDIBLY bad idea, NEVER, EVER do this

} catch (InterruptedException e) {
}

repaint(); // <-- This is a bad idea, watch CPU max out...
}

您有义务调用 super.paintComponent 以确保绘制链得到正确维护,并进行不透明度和图形上下文清理等操作。

Graphics 对象通过单个重绘 channel 在组件之间共享,未能遵循正确的绘制链将导致像您这样的问题

永远不要通过任何 paint 方法更新 UI(这包括调用 repaint),这只会导致您的 paint 方法一遍又一遍地记忆……直到 CPU 达到 100%,程序挂起。

永远不要在 paint 方法(或一般的 UI)中做任何耗时或阻塞的操作,这会使程序看起来像挂起并让用户不高兴(你认为僵尸成群结队的人很糟糕 :P)。以这种方式阻塞会阻止 EDT 响应绘制请求...

我建议通读一下:

关于java - JPanel 上出现的视觉伪像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13281092/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com