【问题标题】:Object-oriented approach to 2D graphics: delegating JPanel clicks to painted objects面向对象的 2D 图形方法:将 JPanel 点击委托给绘制的对象
【发布时间】:2012-05-08 22:12:06
【问题描述】:

来自 Qt,我总是使用 QGraphicsSceneQGraphicsItem 对象关联来绘制流程图、游戏板等内容。图形场景是小部件,相当于 Qt 的 Swing 组件。这些QGraphicsItem 对象有自己的点击处理程序,因此对图形场景某些部分的点击会自动委托给正确的图形项。

我希望在 Java Swing 中复制这个工作流程。到目前为止,我只找到了一种手动绘制所有内容的方法,这也意味着我必须手动编写点击逻辑。它涉及继承 JPanel 并覆盖 paintComponent 函数,如下所示:

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D)g;

    for (int row = 0; row < _numRows; ++row) {
        for (int col = 0; col < _numCols; ++col) {
            g2.drawRect(2 + _squareSize*col, 2 + _squareSize*row, _squareSize, _squareSize);
        }
    }
}

Java Swing 是否有类似的面向对象的方式来绘制 2D 图形?

【问题讨论】:

  • 我相信您可能正在查看游戏 API,或 ..JOGL 或类似的 API 以获得此类功能。

标签: java swing jpanel graphics2d paintcomponent


【解决方案1】:

一般有两种方法可以实现:

  1. 使用单个 JComponent 作为基础并将所有“项目”直接绘制到它上面(在 paintComponent 方法中)。在这种情况下,您必须自己处理所有鼠标/键事件,方法是向该 JComponent 添加鼠标/键侦听器并根据单击位置/按下的热键处理事件。

  2. 1234563称为边界)。在这种情况下,不同的事件将根据它们在容器内的位置直接传递给这些组件(基本上 - 每个组件都有一个矩形边界,如果上面没有任何东西,所有事件都将传递给该组件,但您可以更改它“击”区域到您喜欢的任何形状)。同样在这种情况下,您可以使用自定义绘制组件作为子组件或标准 Swing 组件(如 JButton、JCheckBox 等)。

在大多数情况下,第 2 种方式是最好的,尽管第一种方式有时可能很有用(例如,在创建一些图像编辑器、类似绘画的应用程序或任何其他处理图形的应用程序时)。

【讨论】:

    【解决方案2】:

    使用Shape。有椭圆形、线形、多边形等形状。您可以使用现有的或使用Area 类并结合Shapes 创建自己的。

    【讨论】:

    • 如果我错了,请纠正我,但根据documentation Shape 没有任何我可以联系的听众。那我怎么知道他们什么时候被点击了呢?
    • 您可以在面板中添加一个监听器并检查Shape是否包含点击的Point。
    • 所以我会监控面板上的点击,对每个形状执行交叉计算,然后将点击委托给正确的形状?这似乎有点麻烦。该系统的另一个限制是,如果我有两个部分重叠的形状,它将无法工作。
    猜你喜欢
    • 1970-01-01
    • 2013-12-03
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多