如何在Java中创建一个非Swing按钮?

4

我正在创建一个游戏,其中有一个菜单,包含多个视图,用于选择游戏类型、选项等,使用游戏状态转换。每个菜单都将在JFrame上主动渲染,使用Canvas对象。由于我正在通过向Canvas绘制BufferedImage来进行每个游戏状态的主动渲染,因此无法使用JButton或任何其他JComponentComponent(awt),因为Graphics2D对象无法像这样绘制它们:

Graphics2D g = bufferStrategy.getDrawGraphics();
g.draw(new JButton("Click me"));

我该如何实现一个自定义按钮,它可以接收鼠标输入并使用Graphics2D对象绘制?


你是通过绘制整个菜单的图片来实现菜单的吗?这听起来对我来说不太合理。 - Qwerky
JButton提供了一个paintAll(Graphics g)方法。因此,您可以设置按钮的位置和大小,然后调用mybutton.paintAll(g)。这个方法存在于所有组件中。 - josefx
对你来说听起来合理吗?我想要菜单屏幕也有动画效果。因此,我需要在每一帧渲染整个菜单。 - Wagan8r
2个回答

1

给你正在绘制的组件添加鼠标监听器,并确定鼠标单击是否在你要设置为按钮的区域。


“MouseListeners”只能添加到“Component”对象上。 “Component”对象不能使用“Graphics2D”对象进行绘制。 这就是我在问题中所述的难题。 - Wagan8r
1
Canvas是一个组件。将鼠标监听器添加到Canvas中。 - jzd

0
为什么在已经使用Swing的应用程序中(JFrame是Swing),您会使用Canvas?
BufferedImage image = new BufferedImage(blah....)
Graphics2D gfx = image.createGraphics();
JButton but = new JButton("Click me");
but.update(gfx);

但那真的真的非常丑!

为什么不使用JPanel?据我所知,您可以重写绘制方法来仅调用更新方法,以便面板不被清除(但是我已经有一段时间没有使用Java了)。然后,您可以在更新方法中使用作为参数得到的Graphics2D来绘制东西,并且它甚至允许您添加自己的按钮和其他东西...


这是一个可能的解决方案,但这意味着要通过paint()方法使用被动渲染,而我选择不这样做,因为我想要进行主动渲染。 - Wagan8r

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接