Java 自己的组件通过拖放进行可视化连接

Posted

技术标签:

【中文标题】Java 自己的组件通过拖放进行可视化连接【英文标题】:Java own components visually connecting per drag and drop 【发布时间】:2012-12-26 03:17:42 【问题描述】:

我正在为小型工作流编辑器开发软件解决方案。为此,我创建了一个自己的JPanel,具有一些功能,例如删除自身或编辑主要信息。

看起来是这样的:

关键是,我需要一个动态连接器,如箭头或类似的东西。 我用drawline试过了,但它不是动态的,看起来不太好。我的意思是如果我移动其中一个框,那么绘制的线也必须改变它的位置。

JPanel 中的大框可移动并可调整大小。左右连接点为JButtons。其结构是任何传出连接都从右侧开始,从左侧进入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 自己的组件通过拖放进行可视化连接的主要内容,如果未能解决你的问题,请参考以下文章

使用WindowBuilder设计Swing程序

通过删除目标组件的导航标签,在组件之间进行拖放列表传输

教你自己开发!快手抖音视频MD5修改软件

Eclipse 中的拖放可视化编辑器

四款免费好用的Bootstrap ui编辑器

Java在列表中拖放图像