【问题标题】:Grey screen in NetbeansNetbeans 中的灰屏
【发布时间】:2013-06-05 02:49:31
【问题描述】:

所以我使用 netbeans,并且我开始进入编码游戏......到目前为止我已经完成了这个没有错误,但是当我运行它时只是一个带有我的标题的灰色框“zachs 游戏出现并且就是这样....如果您知道问题1,请提供帮助-谢谢

package swing9;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;

public class JavaApplication2 extends JFrame implements Runnable {

    int x, y, xDirection, yDirection;
    Font font = new Font("Arial", Font.BOLD | Font.ITALIC, 30);

    public void run() {
        try {
            while (true) {

                move();

                Thread.sleep(5);
            }
        } catch (Exception e) {

            System.out.println("Error");
        }
    }

    public void move() {

        x += xDirection;
        y += yDirection;

        if (x <= 0)
            x = 0;

        if (x >= 300)
            x = 300;

        if (y <= 50)
            y = 50;

        if (y <= 300)
            y = 300;

    }

    public void seyXDir(int xdir) {

        xDirection = xdir;
    }

    public void setYDirection(int ydir) {

        yDirection = ydir;
    }

    public class AL extends KeyAdapter {

        public void keyPressed(KeyEvent e) {

            int keyCode = e.getKeyCode();

            if (keyCode == e.VK_LEFT) {

                int setXDirection = -1;

            }

            if (keyCode == e.VK_RIGHT) {
                int setXDirection = +1;

            }

            if (keyCode == e.VK_UP) {
                int setYDirection = -1;
            }

            if (keyCode == e.VK_DOWN) {
                int setYDirection = +1;

            }

        }

    }

    public void keyReleased(KeyEvent e) {

        int keyCode = e.getKeyCode();

        if (keyCode == e.VK_LEFT) {
            int setXDirection = 0;
        }

        if (keyCode == e.VK_RIGHT) {
            int setXDirecetion = 0;
        }

        if (keyCode == e.VK_UP) {
           int setYDirectiom = 0;
        }

        if (keyCode == e.VK_DOWN) {
            int setYDirecction = 0;
        }

    }

    public JavaApplication2() {

        addKeyListener((KeyListener) new JavaApplication2.AL());

        setTitle("Zachs Game");
        setSize(300, 300);

        setResizable(false);

        setVisible(true);
        setBackground(Color.blue);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        x = 150;
        y = 150;

    }

    public void paintComponent(Graphics g) {

        g.setColor(Color.red);
        g.drawString("Play", 40, 40);
        g.setFont(font);
        g.setColor(Color.red);
        g.fillOval(x, y, 15, 15);

        repaint();
    }

    public static void main(String[] args) {

        new JavaApplication2();

        // threads

        Thread t1 = new Thread();
        t1.start();
    }
}

【问题讨论】:

  • keyReleased() 应该是AL 类的一部分吗?我经常发现@Override 标记对于查找此类小错误非常方便。
  • Thread.sleep(5)Thread.sleep(0) 足够接近,因为没有区别。 60fps 大概是Thread.sleep(15),25fps 大概是Thread.sleep(40)。大多数人在大多数显示器上看不到超过 30fps 的差异......
  • 您的KeyListener 不太可能触发,因为JFrame 本身无法接收焦点,因为它上面还有其他组件,请考虑改用key bindings

标签: java swing jframe keylistener paintcomponent


【解决方案1】:

JFrame 或其任何超类不实现paintComponent 方法,因此永远不会被调用。通过添加 @Override 注释自行检查。

将此方法移至扩展JComponent 的新类并调用super.paintComponent(g) 作为第一条语句。

不要在paintComponent 内调用repaint,这会造成无限循环并降低性能。 Swing Timers 旨在更轻松地与摆动组件交互。使用这些而不是原始线程进行定期更新。

除此之外:JFrame 默认情况下是不可聚焦的,因此需要聚焦的 KeyEvents 在不使窗口可聚焦的情况下不会被触发。请改用Key Bindings

【讨论】:

  • (并且不要在任何 paint 方法中调用 repaint 并且当模型发生更改时实际上没有任何请求重绘...)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-20
相关资源
最近更新 更多