gpt4 book ai didi

java - 尝试从运行中重新绘制 Gui

转载 作者:行者123 更新时间:2023-12-02 06:46:49 24 4
gpt4 key购买 nike

我正在尝试从代码中的 run() 调用重绘方法。如果我从 MouseDragged 或 MouseMoved 重新绘制()它工作正常。但我需要从 run() 中执行此操作。以下代码不会从 run() 中调用 repaint 方法。

我是 JAVA 新手。任何人都可以修复代码并粘贴代码吗?请原谅任何愚蠢的错误。 :)。顺便说一句,我看到 SwingUtilities.invokelater 可能会解决这个问题。但我不知道该怎么做。请修复代码。

提前致谢。

import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;

public class Tester {

public static int x,y;
public static void main(String[] args) {
x = 10; y= 10;
Draw d = new Draw();
new Thread(d).start();
}


public static class Draw extends JFrame implements Runnable,MouseMotionListener
{

public Draw()
{
super("Title");
setSize(500,500);
addMouseMotionListener(this);
setVisible(true);
}


@Override
public void run() {
for(int i = 0 ; i < 10 ; i++)
{
System.out.println("Multithreaded");
repaint();
}

}

@Override
public void mouseDragged(MouseEvent e) {

}

@Override
public void mouseMoved(MouseEvent e) {


}

public void paint(Graphics g)
{
System.out.println("repaint called");
}

}


}

最佳答案

Swing 使用被动重绘引擎。也就是说,它只会在需要时更新。 RepaintManager 还经过优化,可以将多个重绘合并为它认为需要的尽可能少的重绘事件。

这意味着您可以请求重新绘制,但无法保证何时或是否会发生重新绘制。

这样做主要是为了性能优化。

查看Painting in AWT and Swing了解更多详情。

由于其本质,repaint 是线程安全的。 repaint 请求 RepaintManager 将绘制事件发布到事件队列中。该队列由事件调度线程处理,这意味着您不必自己将 repaint 与 EDT 同步。

下面的例子演示了这个想法。它提供了一个简单的 slider ,可以重置绘画计数器并设置repaint请求之间的延迟。

线程延迟0毫秒...

enter image description here

线程延迟2秒

enter image description here

正如你所看到的。在 0 毫秒时(这实际上是您在循环中所做的事情),实际绘制的数量与重绘请求的数量匹配,但在延迟 2 秒时,实际绘制和绘制请求几乎相等(我认为额外的一个来自 slider 重新绘制的部分)。

事实上,在我的测试中,在大约 100 毫秒的时间里,我能够使其几乎相等。我什至尝试了 5 毫秒并使其达到平衡。

实际的油漆正在做什么以及 EDT 上的负载也会影响这些结果......

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class RepaintTest {

public static void main(String[] args) {
new RepaintTest();
}

public RepaintTest() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class TestPane extends JPanel {

private int paintRequests;
private int paints;
private int delay = 0;

public TestPane() {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
paintRequests++;
try {
Thread.sleep(delay);
} catch (InterruptedException exp) {
}
System.out.println("tick");
repaint();
}
}
});
t.setDaemon(true);
setLayout(new BorderLayout());
final JSlider slider = new JSlider();
slider.setMinimum(0);
slider.setMaximum(2000);
slider.setPaintTicks(true);
slider.setMajorTickSpacing(100);
slider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
delay = slider.getValue();
paintRequests = 0;
paints = 0;
}
});
slider.setValue(0);
add(slider, BorderLayout.SOUTH);
t.start();
}

@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
paints++;
String text = "Paints = " + paints + "; Paint Requests = " + paintRequests;
Graphics2D g2d = (Graphics2D) g.create();
FontMetrics fm = g2d.getFontMetrics();
int x = (getWidth() - fm.stringWidth(text)) / 2;
int y = ((getHeight() - fm.getHeight()) / 2) + fm.getAscent();
g2d.drawString(text, x, y);
g2d.dispose();
}

}
}

关于java - 尝试从运行中重新绘制 Gui,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18550596/

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