【问题标题】:paintComponent not Running [closed]油漆组件未运行[关闭]
【发布时间】:2013-12-20 01:50:44
【问题描述】:

基本上,我正在尝试对我的 GUI 进行测试,以确保它能够绘制。 这是我的课程: 游戏

public class Game {
    private static GUI gui = new GUI();

    private static int[][] pixels = new int[10][10];
    public static void main(String[] args) {

    }
    public void startGame() {
        System.out.print("start");
        gui.setGameFrame();
    }
    public static GUI getGUI() {
        return gui;
    }
    public static int[][] getGraphics() {
        return pixels;
    }
}

图形界面

import javax.swing.*;

import java.awt.*;
import java.awt.event.*;

class GUI extends JPanel {
private static Game game = new Game();
private static JPanel panel = new JPanel();
private static JFrame frame = new JFrame();
final private static int FRAME_HEIGHT = 500;
final private static int FRAME_WIDTH = 500;
//Board size 25x25px
final private static int PIXEL_SIZE = 20;

public GUI () {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            setAttributes();
            makeMenu();
        }
    });
}
public static void setAttributes() {
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setTitle("");
    frame.setBackground(Color.black);
    frame.setVisible(true);
}

private static void makeMenu() {
    JButton start = new JButton("Start");
    start.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            game.startGame();
        }
    });
    panel.add(start);
    frame.add(panel);
    frame.pack();
}
public void setGameFrame() {
    panel.removeAll();
    frame.getContentPane().add(Game.getGUI());
    frame.setTitle("Snake v0.1");
    frame.setSize(getPreferredSize());
}
@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setColor(Color.white);
    g.fillRect(5, 5, 10, 10);
}
@Override
public Dimension getPreferredSize() {
    return new Dimension(FRAME_WIDTH, FRAME_HEIGHT);
 }
public void paintGraphics() {
    int[][] pixels = Game.getGraphics();
}
}

我已尝试对其进行调试,但无法追踪其无法正常工作的原因。 我相信这与以下内容有关: frame.getContentPane().add(Game.getGUI()); 但我不确定。

【问题讨论】:

  • -1,退出多发。你已经有了一个关于这个的话题并且你得到了很好的建议 (stackoverflow.com/q/20693744/131872)。将对话保留在一个帖子中,以便每个人都知道建议的内容。你看教程了吗?还有一个关于Custom Painting 的部分将向您展示如何更好地构建您的程序。从一个工作示例开始,然后自定义绘画。
  • 您的main 方法为空
  • Game 类的目的是什么?为什么不直接运行 Gui 类中的所有内容?
  • @peeskillet 因为进一步的代码将涉及逻辑和事件处理,并将这些事件发送到 GUI 类进行更新。

标签: java swing graphics paintcomponent


【解决方案1】:

我:“Game 类的目的是什么?为什么不直接运行 Gui 类中的所有内容?”

你:“因为进一步的代码将涉及逻辑和事件处理,并将这些事件发送到 GUI 类进行更新。”

Game 视为您的数据模型。将Game 类仅用于数据和数据操作,并将所有GUI 过程保留在GUI 类中。只需在 GUI 类中创建 Game 类的实例。从您的 GUI 类运行程序,即在您的 GUI 类中有 main 方法。并从main 方法运行invokeLater

【讨论】:

  • 检查了一个相关的例子here
【解决方案2】:

我将您的代码直接复制并粘贴到 Netbeans 中,它似乎可以正常工作。

在我的身上,似乎有一些图形对象覆盖了白色矩形的左上角,这就是它最初没有出现的原因。

尝试更改您的 fillRect() 函数以填充更大的区域。 这对我有用:

g.fillRect(5, 5, 100, 100);

【讨论】:

  • 问题是我需要让每个像素都可绘制,所以我需要移除阻挡对象。
  • 发生的事情是您的 White 矩形被绘制到从 GUI 类 扩展的 JPanel 上,但是JButton 已添加到在 GUI 类中声明的 JPanel 中,名为 panel。所以你正在使用两个 JPanel。 JButton 被添加到panel 对象中,并且您正确调用了panel.removeAll(); 来移除按钮,但是您还需要使用frame.remove(panel);frame 对象中移除面板。现在那个小灰色框不会显示,White 框将绘制到从 GUI 类扩展的 JPanel 上。
  • 啊,谢谢!我发现我只需要删除面板,因为这也会删除按钮。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 2016-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多