Java 我如何阻止我的绘画方法重复两次?
下面是我正在处理的一个骰子游戏的代码,它将结果输出到一个窗口。绘制方法重复两次,这对我来说不好,因为我希望骰子滚动一次,然后移动到下一帧。请有人帮我解决这个问题。先谢谢你Java 我如何阻止我的绘画方法重复两次?,java,swing,paint,Java,Swing,Paint,下面是我正在处理的一个骰子游戏的代码,它将结果输出到一个窗口。绘制方法重复两次,这对我来说不好,因为我希望骰子滚动一次,然后移动到下一帧。请有人帮我解决这个问题。先谢谢你 import java.awt.*; import java.util.Random; import javax.swing.*; public class Dice extends JApplet { public static int pause(int n) { try { Thread.sl
import java.awt.*;
import java.util.Random;
import javax.swing.*;
public class Dice extends JApplet {
public static int pause(int n)
{
try {
Thread.sleep(n);
} catch(InterruptedException e) {
}
return n;
}
public void Dice() {
JApplet app = new Dice();
JFrame frame = new JFrame("Dice Game");
frame.setBounds(30, 50, 1300, 650);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.add(app);
}
public void paint(Graphics g) {
int width = getWidth();
int height = getHeight();
int num = 0;
for (int i = 0; i < 7; i++) {
Random generator= new Random();
int number = generator.nextInt(6)+1;
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height);
g.setColor(Color.BLACK);
g.drawRoundRect(550, 150, 200, 200, 50, 50);
System.out.println("Test");
if (number == 1) { //Roll one
num = 1;
g.setColor(new Color (0, 0, 0));
g.fillOval(640, 240, 20, 20);
pause(100);
} if (number == 2) { //Roll two
num = 2;
g.setColor(new Color (0, 0, 0));
g.fillOval(590, 290, 20, 20);
g.fillOval(690, 190, 20, 20);
pause(100);
} if (number == 3) { //Roll three
num = 3;
g.setColor(new Color (0, 0, 0));
g.fillOval(590, 290, 20, 20);
g.fillOval(640, 240, 20, 20);
g.fillOval(690, 190, 20, 20);
pause(100);
} if (number == 4) { //Roll four
num = 4;
g.setColor(new Color (0, 0, 0));
g.fillOval(590, 290, 20, 20);
g.fillOval(590, 190, 20, 20);
g.fillOval(690, 290, 20, 20);
g.fillOval(690, 190, 20, 20);
pause(100);
} if (number == 5) { //Roll five
num = 5;
g.setColor(new Color (0, 0, 0));
g.fillOval(590, 290, 20, 20);
g.fillOval(590, 190, 20, 20);
g.fillOval(640, 240, 20, 20);
g.fillOval(690, 290, 20, 20);
g.fillOval(690, 190, 20, 20);
pause(100);
} if (number == 6) { //Roll six
num = 6;
g.setColor(new Color (0, 0, 0));
g.fillOval(590, 190, 20, 20);
g.fillOval(590, 240, 20, 20);
g.fillOval(590, 290, 20, 20);
g.fillOval(690, 190, 20, 20);
g.fillOval(690, 240, 20, 20);
g.fillOval(690, 290, 20, 20);
pause(100);
}
}
g.setFont(new Font("TimesRoman", Font.PLAIN, 20));
g.drawString("You rolled a " + num, 590, 100);
pause(1000);
}
}
import java.awt.*;
导入java.util.Random;
导入javax.swing.*;
公共类骰子扩展JApplet{
公共静态整数暂停(整数n)
{
试一试{
睡眠(n);
}捕捉(中断异常e){
}
返回n;
}
公共无效骰子(){
JApplet app=新骰子();
JFrame=新JFrame(“骰子游戏”);
机架立根(30、50、1300、650);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.add(app);
}
公共空间涂料(图g){
int width=getWidth();
int height=getHeight();
int num=0;
对于(int i=0;i<7;i++){
随机生成器=新随机();
int编号=发电机。nextInt(6)+1;
g、 setColor(Color.WHITE);
g、 fillRect(0,0,宽度,高度);
g、 设置颜色(颜色为黑色);
g、 drawRoundRect(550、150、200、200、50、50);
系统输出打印(“测试”);
如果(数字==1){//滚动一次
num=1;
g、 setColor(新颜色(0,0,0));
g、 圆形(640240,20,20);
暂停(100);
}如果(数字==2){//滚动二次
num=2;
g、 setColor(新颜色(0,0,0));
g、 圆形(59029020);
g、 圆形(69019020);
暂停(100);
}如果(数字==3){//滚动三次
num=3;
g、 setColor(新颜色(0,0,0));
g、 圆形(59029020);
g、 圆形(640240,20,20);
g、 圆形(69019020);
暂停(100);
}如果(数字==4){//滚动四次
num=4;
g、 setColor(新颜色(0,0,0));
g、 圆形(59029020);
g、 圆角(590190,20,20);
g、 圆形(690,290,20,20);
g、 圆形(69019020);
暂停(100);
}如果(数字==5){//滚动五次
num=5;
g、 setColor(新颜色(0,0,0));
g、 圆形(59029020);
g、 圆角(590190,20,20);
g、 圆形(640240,20,20);
g、 圆形(690,290,20,20);
g、 圆形(69019020);
暂停(100);
}如果(数字==6){//滚动六次
num=6;
g、 setColor(新颜色(0,0,0));
g、 圆角(590190,20,20);
g、 圆角(590240,20,20);
g、 圆形(59029020);
g、 圆形(69019020);
g、 圆形(690,240,20,20);
g、 圆形(690,290,20,20);
暂停(100);
}
}
g、 setFont(新字体(“TimeRoman”,Font.PLAIN,20));
g、 抽绳(“你掷了一个”+num,590100);
暂停(1000);
}
}
- 简而言之,你不能。您无法控制何时进行绘制,而绘制是
重新绘制管理器的域
- 您也不应该在事件调度线程的上下文中调用
,尤其是在任何Thread.sleep
方法中paint
- 您应该避免覆盖
,而是使用paint
paintComponent
- 您应该避免从
扩展,而是使用类似JFrame
的东西,它实际上有一个JPanel
方法paintComponent
- 这种性质的动画最好通过使用Swing
定时器来实现,该定时器允许在EDT外部保持暂停,但在EDT内部再次触发暂停,从而更安全地执行绘制和更新
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class DiceRoller {
public static void main(String[] args) {
new DiceRoller();
}
public DiceRoller() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new Die());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class Die extends JPanel {
private int number = 1;
public Die() {
Timer timer = new Timer(500, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
number = (int) (Math.round((Math.random() * 5) + 1));
repaint();
}
});
timer.setRepeats(true);
timer.setInitialDelay(0);
timer.start();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(220, 220);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
int width = getWidth();
int height = getHeight();
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, width, height);
g2d.setColor(Color.BLACK);
g2d.drawRoundRect(10, 10, width - 20, height - 20, 50, 50);
List<Shape> dots = new ArrayList<>(6);
if (number == 1 || number == 3 || number == 5) {
int x = (width - 20) / 2;
int y = (height - 20) / 2;
dots.add(new Ellipse2D.Float(x, y, 20, 20));
}
if (number == 2 || number == 3 || number == 4 || number == 5 || number == 6) {
int x = ((width / 2) - 20) / 2;
int y = ((height / 2) - 20) / 2;
dots.add(new Ellipse2D.Float(x, y, 20, 20));
dots.add(new Ellipse2D.Float(x + (width / 2), y + (height / 2), 20, 20));
}
if (number == 4 || number == 5 || number == 6) {
int x = (width / 2) + (((width / 2) - 20) / 2);
int y = ((height / 2) - 20) / 2;
dots.add(new Ellipse2D.Float(x, y, 20, 20));
dots.add(new Ellipse2D.Float(x - (width / 2), y + (height / 2), 20, 20));
}
if (number == 6) {
int x = (((width / 2) - 20) / 2);
int y = (height - 20) / 2;
dots.add(new Ellipse2D.Float(x, y, 20, 20));
dots.add(new Ellipse2D.Float(x + (width / 2), y, 20, 20));
}
for (Shape dot : dots) {
g2d.fill(dot);
}
g2d.dispose();
}
}
}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Shape;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.geom.Ellipse2D;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.Timer;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公营掷骰机{
公共静态void main(字符串[]args){
新滚筒();
}
公众掷骰子(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
添加(新模具());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类扩展JPanel{
私有整数=1;
公众死亡(){
计时器计时器=新计时器(500,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
number=(int)(Math.round((Math.random