gpt4 book ai didi

java - 使用 java swing Graphics g 在 JPanel 中绘图

转载 作者:行者123 更新时间:2023-12-02 01:47:34 24 4
gpt4 key购买 nike

这是我的第一个 java 项目,我试图在 JFrame 内的 JPanel 上绘制一个简单的矩形。一直试图在 stackoverflow 上相同主题的帮助下解决这个问题,但仍然没有成功。运行程序时出现的异常是java.lang.NullPointerException。根据我的理解,我不能利用 JPanel 本身吗?它是在 mainWindow 中创建的。

主要:

public class Main {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
GameBoard game = new GameBoard();
mainWindow view = new mainWindow(game);
mainModel model = new mainModel();
mainController cont = new mainController(model, view, game);

cont.controllerInit();

} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}

查看:

public class mainWindow{
public JFrame frame;
public JPanel panel;

GameBoard game = new GameBoard();
frame = new JFrame();
frame.getContentPane().setBackground(SystemColor.control);
frame.setBounds(100, 100, 728, 435);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(game);
frame.getContentPane().setLayout(null);

panel = new JPanel();
FlowLayout flowLayout = (FlowLayout) panel.getLayout();
panel.setBounds(166, 44, 550, 349);
frame.getContentPane().add(panel);

frame.setVisible(true);
}

游戏:

public class GameBoard extends JPanel{

@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.BLUE);
g.drawRect(200, 200, 200, 200);
}

}

最佳答案

永远不要直接调用paintComponent,外部源没有任何理由这样做。另外,如果你传递它null,你认为会发生什么?

您应该首先查看 Performing Custom PaintingPainting in AWT and Swing更好地了解 Swing 中的绘制工作原理。

Swing API 基本上使用委托(delegate)模型,其中系统将每个组件的绘制责任委托(delegate)给该组件。这是通过系统调用组件 paint 方法来实现的,该方法又调用(以及其他一些)paintComponent

Swing 还使用被动渲染方法,这意味着绘制由绘制系统自行决定。当调用组件的绘制方法时,您的组件会收到需要通知。这可能随时发生。

为了绘制组件,必须首先将其添加到在屏幕上实现的容器(具有 native 对等体),在大多数情况下,这意味着组件层次结构需要解析为某种窗口基于类,例如 JFrame

所以,你的问题的答案是:

  • 阅读上述文档(并更好地了解 API 的工作原理)
  • 将您的 GameBoard 添加到可以解析为基于窗口的类的容器
  • 切勿直接调用 paintpaintComponent

反射(reflection)......

private mainWindow view;
private mainModel model;
public GameBoard(mainModel m, mainWindow v)
{
view = v;
model = m;
}

对我来说,这毫无意义。没有合理的理由为什么 GameBoard 需要对 mainWindow 的引用。 GameBoard 本身就是一个“ View ”。如果有的话,您“应该”传递给 GameBoard 的唯一东西(假设您正在尝试使用 MVC)是 Controller

关于java - 使用 java swing Graphics g 在 JPanel 中绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53547194/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com