面向对象的2D图形方法:将JPanel点击委托给绘制的对象

时间:2012-04-28 11:00:23

标签: java swing jpanel graphics2d paintcomponent

来自Qt,我总是使用QGraphicsSceneQGraphicsItem个对象相关联来绘制流程图,游戏板等等。图形场景是小部件,它们是Swt组件的Qt等价物。这些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图形?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

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

  2. 另一种方法是使用任何Container(或简单的JPanel)作为基础并使用布局将任何其他Component放置到它上(例如,使用“null”布局,您可以简单地将组件放在容器内的绝对坐标上,也是叫做边界)。在这种情况下,不同的事件将直接传递给那些组件,具体取决于它们在容器内的位置(基本上 - 每个组件都有一个矩形边界,如果没有任何东西位于其上,所有事件都将传递给该组件,但您可以更改它“点击“你想要的任何形状的区域”。同样在这种情况下,您可以使用自定义绘制的组件作为子项或标准Swing组件(如JButton,JCheckBox等)。

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