【问题标题】:How can I make a non-Swing button in Java?如何在 Java 中制作非 Swing 按钮?
【发布时间】:2011-01-05 15:13:31
【问题描述】:

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

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

如何实现可以接收鼠标输入并使用 Graphics2D 对象绘制的自定义按钮?

【问题讨论】:

  • 您是通过绘制整个菜单的图片来实现菜单的吗?对我来说听起来不明智。
  • JButton 提供了一个paintAll(Graphics g) 方法。所以你可以设置按钮的位置和大小,然后调用 mybutton.paintAll(g)。该方法存在于所有组件上
  • 你觉得什么是明智的?我也想让菜单屏幕动画化。因此,我需要在每一帧都渲染整个菜单。

标签: java swing button graphics2d


【解决方案1】:

向您正在绘制的组件添加鼠标侦听器,并让它确定鼠标点击是否在您想要成为按钮的区域中。

【讨论】:

  • MouseListners 只能添加到 Component 对象。 Component 对象不能用 Graphics2D 对象绘制。正如问题中所述,这是我的难题。
  • Canvas 是一个组件。将鼠标侦听器添加到 Canvas。
【解决方案2】:

为什么要在已经使用 Swing(JFrame 是 Swing)的应用程序中使用 Canvas?

BufferedImage image = new BufferedImage(blah....)
Graphics2D gfx = image.createGraphics();
JButton but = new JButton("Click me");
but.update(gfx);

但这真的真的很丑!

你为什么不带一个JPanel? Afaik 你可以覆盖paint 方法来调用update 方法,这样面板就不会被清除(但我已经有一段时间在玩Java了)。然后你可以使用你在更新方法中作为参数得到的 Graphics2D 来绘制东西,它甚至允许你添加你自己的按钮和其他东西......

【讨论】:

  • 这是一个可能的解决方案,但是这意味着通过我选择不做的paint()方法使用被动渲染,因为我想做主动渲染。
猜你喜欢
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
相关资源
最近更新 更多