来自 Qt,我总是将 QGraphicsScene
与 QGraphicsItem
对象结合使用来绘制流程图、游戏板等内容。图形场景是小部件,它们是 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 是否有类似的面向对象的方法来绘制二维图形?
最佳答案
通常有两种方法可以实现:
使用单个 JComponent 作为基础并将所有“项目”直接绘制到它上面(在 paintComponent 方法中)。在这种情况下,您必须自己处理所有鼠标/键事件,方法是向该 JComponent 添加鼠标/键监听器并根据点击位置/按下的热键处理事件。
另一种方法是使用任何容器(或只是简单的 JPanel)作为基础,并使用布局将任何其他组件放置到其上(例如,使用“空”布局,您可以简单地将组件按绝对坐标放置在容器内,也称为界限)。在这种情况下,不同的事件将根据它们在容器内的位置直接传递给这些组件(基本上 - 每个组件都有一个矩形边界,如果没有任何东西位于其中,所有事件都会传递给该组件,但您可以更改“将“区域打成你喜欢的任何形状)。同样在这种情况下,您可以使用自定义绘制组件作为子组件或标准 Swing 组件(如 JButton、JCheckBox 等)。
在大多数情况下,第二种方式是最好的,尽管第一种方式有时可能有用(例如,在创建一些图像编辑器、类似绘画的应用程序或任何其他处理图形的应用程序时)。
关于java - 面向对象的二维图形方法 : delegating JPanel clicks to painted objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10362886/