Java 自己的组件通过拖放进行可视化连接
Posted
技术标签:
【中文标题】Java 自己的组件通过拖放进行可视化连接【英文标题】:Java own components visually connecting per drag and drop 【发布时间】:2012-12-26 03:17:42 【问题描述】:我正在为小型工作流编辑器开发软件解决方案。为此,我创建了一个自己的JPanel
,具有一些功能,例如删除自身或编辑主要信息。
看起来是这样的:
关键是,我需要一个动态连接器,如箭头或类似的东西。 我用drawline试过了,但它不是动态的,看起来不太好。我的意思是如果我移动其中一个框,那么绘制的线也必须改变它的位置。
JPanel
中的大框可移动并可调整大小。左右连接点为JButton
s。其结构是任何传出连接都从右侧开始,从左侧进入JButton
。
任何想法如何设置它?
我不能发布太多源代码,因为该软件是为公司服务的。
【问题讨论】:
您可以尝试使用GlassPane
,如图here。
您为什么不使用其中一种开源框架?喜欢gef.tigris.org
你知道windowBuilder吗?看这里 [eclipse.org/windowbuilder/]
erhun:我使用了windowbuilder,但是windowbuilder没有我需要的功能组件。 lbalazscs:如果我们使用 3rd 方解决方案,我的老板不喜欢它。以及图片中的面板或不仅仅是带有信息的面板。它们代表数据源并有自己的显示方法。所以我的意思是它不仅仅是关于 gui 编程,因为每个不同的数据源类型都有一个后端模块。谢谢
同时考虑JHotDraw
,引用here。
【参考方案1】:
您是否将Graphics
对象转换为Graphics2D
并设置RenderHints
?即
Graphics2D g2d=(Graphics2D)g;
g2d.setRenderingHint(RenderHints.KEY_ANTIALIASING,RenderHints.VALUE_ANTIALIASING _ON);
这将添加一些不错的anti aliasing 效果,并可能使线条看起来更直。
通过Graphics2D#setStroke
增加笔触宽度也会使锯齿状边缘消失,因为它现在更厚了。
看这个例子(按下、拖动和释放鼠标来创建一条线):
将g2d.setRenderingHint(..)
和g2d.setStroke(..)
内的paintComponent(..)
注释掉:
g2d.setRenderingHint(..)
和 g2d.setStroke(..)
未注释:
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Line2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Test
public static void main(String[] args)
SwingUtilities.invokeLater(new Runnable()
@Override
public void run()
Test gui = new Test();
);
public Test()
initComponents();
private void initComponents()
JFrame frame = new JFrame("Line Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new MyPanel());
frame.pack();
frame.setVisible(true);
class MyPanel extends JPanel
Point point1;
Point point2;
Line2D line2d;
public MyPanel()
addMouseListener(new MouseAdapter()
@Override
public void mousePressed(MouseEvent me)
super.mousePressed(me);
point1 = me.getPoint();
);
addMouseMotionListener(new MouseAdapter()
@Override
public void mouseDragged(MouseEvent me)
super.mouseDragged(me);
point2 = me.getPoint();
line2d = new Line2D.Double(point1, point2);
repaint();
);
@Override
public Dimension getPreferredSize()
return new Dimension(300, 300);
@Override
public void paintComponent(Graphics g)
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
//Set anti-alias!
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
if (point1 != null && point2 != null)
g2d.setPaint(Color.RED);
g2d.setStroke(new BasicStroke(1.5f));//set stroke size
g2d.draw(line2d);
如果上述方法没有帮助,发布 SSCCE 将使我们能够测试并查看可能出现的问题/使其变得更好。
【讨论】:
我会尝试并发布,而不是我要找的。非常感谢 谢谢大卫,在你的帮助下我解决了这个问题。我将另一个组件引用为输出组件,每次重新绘制整个面板时,我都会查找 output!=null 如果两个组件之间存在连接。如果有,我会按照你的方式连接它们。以上是关于Java 自己的组件通过拖放进行可视化连接的主要内容,如果未能解决你的问题,请参考以下文章