4

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

我希望在 Java Swing 中复制这个工作流程。到目前为止,我只找到了一种手动绘制所有内容的方法,这也意味着我必须手动编写点击逻辑。它涉及继承 aJPanel并覆盖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 图形?

4

2 回答 2

3

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

于 2012-04-28T12:15:38.937 回答
3

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

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

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

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

于 2012-04-28T12:30:33.800 回答