java - 面向对象的二维图形方法 : delegating JPanel clicks to painted objects

标签 java swing jpanel graphics2d paintcomponent

来自 Qt,我总是将 QGraphicsSceneQGraphicsItem 对象结合使用来绘制流程图、游戏板等内容。图形场景是小部件,它们是 Swing 组件的 Qt 等价物。这些 QGraphicsItem 对象有自己的点击处理程序,因此对图形场景某些部分的点击会自动委托(delegate)给正确的图形项。

我希望在 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 是否有类似的面向对象的方法来绘制二维图形?

最佳答案

通常有两种方法可以实现:

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

  2. 另一种方法是使用任何容器(或​​只是简单的 JPanel)作为基础,并使用布局将任何其他组件放置到其上(例如,使用“空”布局,您可以简单地将组件按绝对坐标放置在容器内,也称为界限)。在这种情况下,不同的事件将根据它们在容器内的位置直接传递给这些组件(基本上 - 每个组件都有一个矩形边界,如果没有任何东西位于其中,所有事件都会传递给该组件,但您可以更改“将“区域打成你喜欢的任何形状)。同样在这种情况下,您可以使用自定义绘制组件作为子组件或标准 Swing 组件(如 JButton、JCheckBox 等)。

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

关于java - 面向对象的二维图形方法 : delegating JPanel clicks to painted objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10362886/

相关文章:

java - 在 Android 上使用正则表达式实现部分匹配时遇到问题

java - 如何将 Jena 与 Maven 结合使用

java - 一个项目在eclipse中运行需要多长时间? **固定的**

java - 展开 JFrame 后如何固定 JPanel 的位置

java - Flex JSON 无法正确序列化/反序列化 LinkedHashMap

java - 如何改变JTable中单元格的颜色以提供动画效果?

java - 禁用 JToggleButton 上的启用效果

java - SQL : WHERE not working with JTable

java - Java 中鼠标单击框架中的图像不新鲜

java - 无法创建节点数组