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

zysjyyx4  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(329)

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

关键是,我需要一个像箭头之类的动态连接器。我试过用抽绳,但它不是动态的,看起来不好。我的意思是,如果我移动其中一个盒子,那么抽屉线也必须改变它的位置。
大箱子里的箱子 JPanel 可移动和调整大小。左右连接点 JButton s。其结构是,任何传出连接都从右侧开始,从左侧开始 JButton .
你知道怎么设置吗?
我不能发布太多的源代码,因为该软件是为一家公司。

2ledvvac

2ledvvac1#

你皈依了吗 Graphics 反对 Graphics2D 并设置 RenderHints ? 即

Graphics2D g2d=(Graphics2D)g;   
g2d.setRenderingHint(RenderHints.KEY_ANTIALIASING,RenderHints.VALUE_ANTIALIASING _ON);

这将添加一些很好的抗锯齿效果,并可能使线的外观更直。
同时通过增加笔划宽度 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将使我们能够测试并查看哪些是错误的/使其更好。

相关问题