gpt4 book ai didi

java - 重新绘制 javax 不起作用

转载 作者:行者123 更新时间:2023-11-30 06:42:24 25 4
gpt4 key购买 nike

这是我的代码:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

public class Main {
// code main
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setSize(460, 500);
frame.setTitle("Circles generator");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


SwingUtilities.invokeLater(new Runnable() {
public void run() {
frame.setVisible(true);

}

});

String input = JOptionPane.showInputDialog("Enter n:");
CustomComponents0 component = new CustomComponents0();
frame.add(component);
frame.getContentPane().validate();
System.out.println("work before");
frame.getContentPane().repaint();
System.out.println("work");

frame.getContentPane().repaint();
System.out.println("work after");

}

// why is not JComponent
static class CustomComponents0 extends JLabel {

private static final long serialVersionUID = 1L;

@Override
public Dimension getMinimumSize() {
return new Dimension(200, 100);

}

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

}

@Override
public void paintComponent(Graphics g) {
System.out.println("paint");
int margin = 10;
Dimension dim = getSize();
super.paintComponent(g);
g.setColor(Color.red);
g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);

}

}

这是代码,我想在工作前运行重绘并在工作后运行重绘。当我运行它时,它应该打印

work before
paint
work
paint
work after

但是只有一幅画,而且是下类后的,为什么会发生这种情况?我该如何解决这个问题?

谢谢。

最佳答案

must event dispatch thread 上构造和操作 Swing GUI 对象。由于您的程序同步不正确,因此任何结果都有可能。这部分取决于 initial thread 的距离有多远。在开始 EventQueue 之前获取。此外,println()本身may be synchronized ,并且“可以合并发布到 EventQueue 的事件。”

下面的变体可靠地显示了以下输出,因为事件是“按照它们排队的顺序”分派(dispatch)的。特别注意对 repaint() 的调用是如何合并的。虽然这种方法是说明性的,但对于您可能的目标来说,它是不必要的麻烦。相反,使用 javax.swing.Timer调整动画速度,如图 here .

控制台:

paint
work before
work
work after
paint

代码:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JLabel;

/** @see https://stackoverflow.com/a/44212328/230513 */
public class Main {

public static void main(String[] args) {
EventQueue.invokeLater(() -> {
JFrame frame = new JFrame();
frame.setTitle("Circles generator");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
CustomComponent component = new CustomComponent();
frame.add(component);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
EventQueue.invokeLater(() -> { System.out.println("work before"); });
EventQueue.invokeLater(() -> { frame.repaint(); });
EventQueue.invokeLater(() -> { System.out.println("work"); });
EventQueue.invokeLater(() -> { frame.repaint(); });
EventQueue.invokeLater(() -> { System.out.println("work after"); });
});
}

static class CustomComponent extends JLabel {

private static final int N = 10;

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

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println("paint");
g.setColor(Color.red);
g.fillRect(N, N, getWidth() - N * 2, getHeight() - N * 2);
}
}
}

关于java - 重新绘制 javax 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44209775/

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