java - 在 Swing 架上执行 Java 应用程序期间出现空白屏幕

标签 java

我有以下三个类(class):

import java.awt.Graphics2D;
import java.awt.event.KeyEvent;

 public class Racquet {
   int x = 0;
   int xa = 0;
   private Game game;


   public Racquet(Game game) {
    this.game= game;
}

   public void move() {
    if (x + xa > 0 && x + xa < game.getWidth()-60)
        x = x + xa;
}

   public void paint(Graphics2D g) {
    g.fillRect(x, 330, 60, 10);
}

   public void keyReleased(KeyEvent e) {
    xa = 0;
}

   public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_LEFT)
        xa = -1;
    if (e.getKeyCode() == KeyEvent.VK_RIGHT)
        xa = 1;
}

}

import java.awt.Graphics2D;

public class Ball {
   int x = 0;
   int y = 0;
   int xa = 1;
   int ya = 1;
   private Game game;

   public Ball(Game game) {
    this.game= game;
}

void move() {
    if (x + xa < 0)
        xa = 1;
    if (x + xa > game.getWidth() - 30)
        xa = -1;
    if (y + ya < 0)
        ya = 1;
    if (y + ya > game.getHeight() - 30)
        ya = -1;

    x = x + xa;
    y = y + ya;
}

   public void paint(Graphics2D g) {
    g.fillOval(x, y, 30, 30);
}

}

      import java.awt.*;
      import javax.swing.*;
      import java.awt.event.*;
       public class Game extends JPanel {

       Ball ball = new Ball(this);
       Racquet racquet = new Racquet(this);

        public Game() {
        addKeyListener(new KeyListener() {
        @Override
        public void keyTyped(KeyEvent e) {
        }

        @Override
        public void keyReleased(KeyEvent e) {
            racquet.keyReleased(e);
        }

        @Override
        public void keyPressed(KeyEvent e) {
            racquet.keyPressed(e);
        }
    });
    setFocusable(true);
}

    private void move() {
    ball.move();
    racquet.move();
}

@Override
public void paint(Graphics g) {
    super.paint(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
    ball.paint(g2d);
    racquet.paint(g2d);
}

    public static void main(String[] args) {
    JFrame frame = new JFrame("Mini Tennis");
    Game game = new Game();
    frame.add(game);
    frame.setSize(300, 400);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    while (true) {
        game.move();
        game.repaint();
        for(long i=0;i<=100000*100;i++)
        {
         }

    }
}

}

  import javax.swing.*;
  import java.awt.event.*;
  class T extends JFrame implements ActionListener
{
    public T()
    {
        setVisible(true);
        setSize(300,300);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(null);

        JButton b1=new JButton("Click me");
        b1.setBounds(150,150,50,50);
        b1.addActionListener(this);

        add(b1);
}
       public void actionPerformed(ActionEvent a)
{
        Game ob=new Game();
        ob.main(null);
}
      public static void main(String args[])
{
      T obj=new T();
}

}

当我执行类T时,我应该得到游戏,但我不知道为什么我得到的是空白屏幕而不是游戏。我是 Java 新手,有人可以帮助我吗?

最佳答案

T 类不起作用的原因是您的代码使用了错误的代码来运行游戏循环,这是一个 while (true) 循环,如果在 Swing 事件线程上调用(如 T确实),将完全阻止该线程,阻止其执行必要的功能,包括绘制 GUI。

解决方案是使用 Swing Timer驱动游戏循环,而不是 while (true) 循环。为了更好地理解 Swing 线程问题,请阅读:Lesson: Concurrency in Swing

关于java - 在 Swing 架上执行 Java 应用程序期间出现空白屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40944334/

相关文章:

java - ConcurrentHashMap 上的迭代器

java - resultSet.next() 返回 false,即使表已填充

Java:实例化一个没有默认构造函数的泛型类

java - org.springframework.beans.factory.BeanCreationException :

Java-Server 停止正常工作

java - 比较最终变量时如何摆脱警告?

java - 在 Android Activity 中记录未处理的异常

java - 界面 : setSize() method of second window does not work

java - 基于枚举的单例实现和单元测试,将状态保留为枚举的副作用

java - 如何在 Tomcat JMX Beans 中隐藏数据源密码