【问题标题】:Graphics not showing up on macmac 上不显示图形
【发布时间】:2018-01-16 17:04:56
【问题描述】:

我正在开发一个独立游戏项目,当我将项目从我的 Windows 计算机移动到我的 macbook 时,我遇到了图形不显示的问题。我已经更新了我的 Java 版本和我的 Eclipse,但仍然有这个问题。以下是处理 JFrame 和 Panel 的两个主要文件:

主游戏循环

package hara;

import javax.swing.JFrame;

public class MainGameLoop {

public static final String gameName = "HARA v0.0";

public static void main(String[] args) {
    JFrame f = new JFrame(gameName);
    f.setContentPane(new MainWindow());
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setResizable(false);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setVisible(true);
}
}

和主窗口

package hara;

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

import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;

import hara.gamestate.GameStateManager;

public class MainWindow extends JPanel implements Runnable, KeyListener{
public static final int WIDTH = 320;
public static final int HEIGHT = 240;
public static double wSCALE = 4;
public static double hSCALE = 4;

private Thread thread;
private boolean running;
private int FPS = 60;
private long targetTime = 1000/FPS;

private BufferedImage image;
private Graphics2D g;

private GameStateManager gsm;

public MainWindow(){
    super();
    setPreferredSize(new Dimension((int)(WIDTH * wSCALE), (int)(HEIGHT * hSCALE)));
    setFocusable(true);
    requestFocus();
}

public void addNotify(){
    super.addNotify();
    if(thread == null){
        thread = new Thread(this);
        addKeyListener(this);
        thread.start();
    }
}

public void init(){
    image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB);

    g = (Graphics2D) image.getGraphics();

    running = true;

    gsm = new GameStateManager();
    gsm.setState(gsm.MENUSTATE);
}

public void run(){

    init();

    long start;
    long elapsed;
    long wait;

    while(running){
        start = System.nanoTime();

        update();
        draw();
        drawToScreen();

        elapsed = System.nanoTime() - start;

        wait = targetTime - elapsed / 1000000;
        if(wait < 0){
            wait = 5;
        }

        try {
            Thread.sleep(wait);
        }catch(Exception e){
            e.printStackTrace();
        }

    }

}

private void update(){
    gsm.update();
}

private void draw(){
    gsm.draw(g);
}

private void drawToScreen(){
    Graphics g2 = getGraphics();
    g2.drawImage(image, 0, 0, (int) (WIDTH * wSCALE), (int) (HEIGHT * hSCALE), null);
    g2.dispose();
}

public void keyTyped(KeyEvent e) {}

public void keyPressed(KeyEvent key) {
    gsm.keyPressed(key.getKeyCode());
}

public void keyReleased(KeyEvent key) {
    gsm.keyReleased(key.getKeyCode());
}
}

它在我的 PC 上完美运行,绘图没有问题,但是一旦我将文件移动到我的 Macbook,它只会打开一个空白的 JFrame,什么也不做。我测试了这些方法是否被正确调用并且它们是正确的。绘制方法被调用,键盘输入有效,但没有任何显示。如果我将窗口设置为可调整大小,并调整它的大小,我可以非常简要地看到图形工作。我尝试了很多解决方案,但都没有奏效。我在这个网站上查看了很多问题,但似乎没有什么对我有用。会喜欢任何想法。谢谢!

【问题讨论】:

  • 我看不到您的大部分代码是从哪里调用的?看起来MainWindow 应该作为线程启动
  • 你有多个线程,没有任何同步,所以没有任何理由必须工作。例如,gsm.keyPressed(...) 可以合法地抛出 NullPointerException,因为它是在没有同步/易失性的不同线程上分配的。您需要阅读concurrency tutorialsjust use a timer,因为可能没有特别的理由使用多线程。
  • @Radiodef 我不确定我看到哪里有多个线程,即便如此,当我在 Windows 桌面上运行程序时似乎没有引起任何问题
  • 一个线程是 Swing 线程(event dispatch thread),另一个是您在 addNotify() 中启动的线程。 (还有一个 3rd 是主线程。)它是否似乎在某些特定系统上工作并不重要,因为它没有必须而且你问为什么你的代码没有工作。实际上会发生的情况是您偶尔会遇到 NPE,或者您的控制会显得迟钝。 HotSpot 也可能将您的while(running) 循环转换为while(true) 循环。类似的东西。

标签: java macos swing awt


【解决方案1】:

不要使用 getGraphics() 进行绘画。

相反,自定义绘制是通过覆盖JPanelpaintComponent() 方法来完成的。阅读 Custom Painting 上的 Swing 教程部分,了解更多信息和工作示例。

当您因为面板的属性更改而想要重新绘制组件时,您可以在面板上调用 repaint()。所以摆脱你的 update() 方法,只需调用 repaint() 来绘制面板。

【讨论】:

  • 您能解释一下为什么这会在 mac 上导致不同的行为吗?
  • @ChiefTwoPencils,不,因为我从未使用过 Mac。不要被windows工作误导。这只是幸运,如果您将来唤醒更改,可能会很容易损坏。我所知道的是进行自定义绘画的正确方法,以便它可以在所有平台上工作,而您目前没有这样做。
  • 我不是问这个问题的人,只是好奇是否有更详细/技术信息。
  • @camickr 我尝试更改代码以使用 paintComponent() 和 repaint() 但它没有解决问题。
猜你喜欢
  • 1970-01-01
  • 2011-05-01
  • 2015-09-03
  • 1970-01-01
  • 2022-07-22
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-28
相关资源
最近更新 更多