来自Qt,我总是使用QGraphicsScene
与QGraphicsItem
个对象相关联来绘制流程图,游戏板等等。图形场景是小部件,它们是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图形?
答案 0 :(得分:3)
使用Shape
。有椭圆形,线条,多边形等形状。您可以使用现有的类或使用Area
类创建自己的类并组合Shapes
。
答案 1 :(得分:3)
通常有两种方法可以实现:
使用单个JComponent作为基础并直接在其上绘制所有“项目”(在paintComponent方法中)。在这种情况下,您必须自己处理所有鼠标/键事件,方法是向该JComponent添加鼠标/键侦听器,并根据单击的位置/热键来处理事件。
另一种方法是使用任何Container(或简单的JPanel)作为基础并使用布局将任何其他Component放置到它上(例如,使用“null”布局,您可以简单地将组件放在容器内的绝对坐标上,也是叫做边界)。在这种情况下,不同的事件将直接传递给那些组件,具体取决于它们在容器内的位置(基本上 - 每个组件都有一个矩形边界,如果没有任何东西位于其上,所有事件都将传递给该组件,但您可以更改它“点击“你想要的任何形状的区域”。同样在这种情况下,您可以使用自定义绘制的组件作为子项或标准Swing组件(如JButton,JCheckBox等)。
在大多数情况下,第二种方式是最好的,虽然第一种方式可能有用(例如,在创建一些图像编辑器,类似绘画的应用程序或任何其他适用于图形的应用程序时)。