CubicCurve2D连接两个JInternalFrame实例

我一直试图找到一种方法(在Swing中)将两个JInternalFrame连接到CubicCurve2D (也称为三次贝塞尔曲线)。 我试图实现的整体效果是类似于Yahoo!的界面。 管道 (曲线应从一个内部框架的底部到另一个内部框架的顶部)。

这里有人这么做过吗? 我遇到的问题是我无法想象如何以用户可见的方式绘制更新曲线。 绘制并重新绘制JDesktopPane.getGraphics似乎没有做任何事情。

如果可能的话,我想使用屏幕外缓冲区。

是。 下面是使用drawLine(int x1, int y1, int x2, int y2)的示例,但在曲线上调用draw(Shape s)是一个简单的扩展。 您可能还必须扩展ComponentAdapter以处理resize事件。

替代文字

 import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Stroke; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import javax.swing.JDesktopPane; import javax.swing.JFrame; import javax.swing.JInternalFrame; /** @see http://stackoverflow.com/questions/3951383 */ public class JDPTest extends JDesktopPane { private static final Stroke s = new BasicStroke(4.0f); private MyFrame one = new MyFrame("One", 100, 100); private MyFrame two = new MyFrame("Two", 400, 240); public JDPTest() { this.setPreferredSize(new Dimension(640, 480)); this.add(one); this.add(two); } @Override protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setColor(Color.lightGray); g2d.fillRect(0, 0, getWidth(), getHeight()); g2d.setColor(Color.blue); g2d.setStroke(s); int x1 = one.getX() + one.getWidth() / 2; int y1 = one.getY() + one.getHeight() / 2; int x2 = two.getX() + two.getWidth() / 2; int y2 = two.getY() + two.getHeight() / 2; g2d.drawLine(x1, y1, x2, y2); } private final class MyFrame extends JInternalFrame { MyFrame(String name, int x, int y) { super(name); this.setSize(160, 100); this.setLocation(x, y); this.setVisible(true); this.addComponentListener(new ComponentAdapter() { @Override public void componentMoved(ComponentEvent e) { JDPTest.this.repaint(); } }); } } private void display() { JFrame f = new JFrame("JDPTest"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(this); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new JDPTest().display(); } }); } } 

尝试这个。 我刚刚修改了上面给出的代码。

在此处输入图像描述

 import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.Stroke; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.geom.CubicCurve2D; import javax.swing.JDesktopPane; import javax.swing.JFrame; import javax.swing.JInternalFrame; /** @see http://stackoverflow.com/questions/3951383 */ public class JDPTest extends JDesktopPane { private static final Stroke s = new BasicStroke(4.0f); private MyFrame one = new MyFrame("One", 100, 100); private MyFrame two = new MyFrame("Two", 400, 240); CubicCurve2D cubcurve; public JDPTest() { this.setPreferredSize(new Dimension(640, 480)); this.add(one); this.add(two); } @Override protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setColor(Color.lightGray); g2d.fillRect(0, 0, getWidth(), getHeight()); g2d.setColor(Color.blue); g2d.setStroke(s); int x1 = one.getX() + one.getWidth() / 2; int y1 = one.getY() + one.getHeight() / 2; int x2 = two.getX() + two.getWidth() / 2; int y2 = two.getY() + two.getHeight() / 2; cubcurve = new CubicCurve2D.Float(x1,y1,x1+200,y1-115,x2-200,y2+115,x2,y2); g2d.draw(cubcurve); // g2d.drawLine(x1, y1, x2, y2); } private final class MyFrame extends JInternalFrame { MyFrame(String name, int x, int y) { super(name); this.setSize(160, 100); this.setLocation(x, y); this.setVisible(true); this.addComponentListener(new ComponentAdapter() { @Override public void componentMoved(ComponentEvent e) { JDPTest.this.repaint(); } }); } } private void display() { JFrame f = new JFrame("JDPTest"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(this); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { new JDPTest().display(); } }); } }