gpt4 book ai didi

java - 在 JPanel 之间绘图

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:01:13 27 4
gpt4 key购买 nike

我有以下情况:

JPanel 用作“绘图板”,用户可以在其中添加具有特定连接点的 block ,这些连接点可用于互连到其他 block (想想 Simulink 或 labView)。

block 本身是带有按钮的 JPanel 对象,在设置空布局后通过 add() 方法添加到绘图板。 JPanels 可以在 MouseMotionListener 的帮助下四处拖动。

为了绘制连接,我覆盖了绘图板的 paintComponent() 方法并调用了 g.drawLine()(在调用 super.paintComponent 之后)。这行得通,但是一旦你移动一个 block ,线条就会相互重叠,变得一团糟。因此,我在用户移动 block 期间调用了 drawingBoard.repaint()。这会导致线条在拖动过程中闪烁可见,然后立即消失。

很明显,JPanel 中的JPanel 的绘制相互干扰。

我该如何解决这个问题?

编辑:部分代码片段:

绘图板:

public void paintComponent(Graphics g){
g.clearRect(0, 0, getWidth(), getHeight());
super.paintComponent(g);
drawConnections(g);//Contains g.drawLine calls
}

使用 JPanel.add() 方法将 block 添加到绘图板。下面是这样一个“ block ”JPanel 的 MouseMotionListener。

public void mouseDragged(MouseEvent e)
{
pt = SwingUtilities.convertPoint(movingPanel, e.getX(), e.getY(), movingPanel.getParent());
movingPanel.setBounds(pt.x - clickX, pt.y - clickY, movingPanel.getWidth(), movingPanel.getHeight());
e.consume();

movingPanel.getParent().repaint();
}

block JPanel 不会覆盖 paintComponent 因为它不需要特殊的绘图。它只包含一些 JLabel 和 JButton。这些按钮用于创建 block 之间的连接。然后在上面提到的 drawConnections 中使用连接列表。

真的没有比这更多的了。

已解决:

好的,正如预期的那样,这是一个非常小的细节。

在我使用的画线代码中

Graphics2D g2 = (Graphics2D) this.getGraphics();

代替

Graphics2D g2 = (Graphics2D) g;

我刚刚注意到引用文献不一样。哦

最佳答案

一种方法可能是使线条成为已添加到面板的 JComponents,并让它们自行重新绘制。这也可能具有很好的效果,可以将线逻辑和绘制计算隔​​离在线类中,而不是放在绘图板上。

关于java - 在 JPanel 之间绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6518594/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com