Java 自己的组件通过拖放进行可视化连接 [英] Java own components visually connecting per drag and drop

查看:19
本文介绍了Java 自己的组件通过拖放进行可视化连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm working on a software solution for a small workflow editor. For this I created an own JPanel with some functionality like deleting itself or editing the main information.

看起来是这样的:

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

The point is, that i need a dynamic connector like a arrow or something like that. I tried it with drawline but its not dynamic and looks not well. I mean if I move one of the boxes so the drawed line have to change its position too.

JPanel 中的大框可移动并可调整大小.左右连接点是JButton.其结构是任何传出连接都从右侧开始并从左侧进入JButton.

The boxes in the big JPanel are movable and resizable. The connection point right and left are JButtons. The structure is that any outgoing connections startes from the right and incomes to the left JButton.

任何想法如何设置它?

我不能发布太多源代码,因为该软件是为公司服务的.

I can't post much of the source code, because the software is for a company.

推荐答案

您是否将 Graphics 对象转换为 Graphics2D 并设置 RenderHints?即

Did you convert Graphics object to Graphics2D and set the RenderHints? i.e

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

这将添加一些不错的 抗锯齿 效果,并可能使线条看起来更直.

This will add some nice anti aliasing effects and might make the line appearance straighter.

还通过 Graphics2D#setStroke 会使锯齿状边缘消失,因为它现在变厚了.

Also increasing the stroke width via Graphics2D#setStroke will make the jaggeder edges disappear as its now thicker.

看这个例子(按下、拖动和释放鼠标来创建一条线):

See this example (press, drag and release mouse to create a line):

paintComponent(..) 中将 g2d.setRenderingHint(..)g2d.setStroke(..) 注释掉:

With g2d.setRenderingHint(..) and g2d.setStroke(..) within paintComponent(..) commented out:

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 将使我们能够测试并查看可能出现的问题/使其变得更好.

If above does not help, posting an SSCCE would enable us to test and see what could be at fault/make it better.

这篇关于Java 自己的组件通过拖放进行可视化连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆