簡體   English   中英

Java 自己的組件通過拖放進行可視化連接

[英]Java own components visually connecting per drag and drop

我正在為小型工作流編輯器開發軟件解決方案。 為此,我創建了一個自己的JPanel具有一些功能,例如刪除自身或編輯主要信息。

這是它的外觀:

可移動組件

關鍵是,我需要一個像箭頭之類的動態連接器。 我用畫線試過,但它不是動態的,看起來不太好。 我的意思是如果我移動其中一個框,那么繪制的線也必須改變它的位置。

JPanel中的框是可移動和可調整大小的。 左右連接點是JButton 結構是任何傳出連接從右邊開始,從左邊開始JButton

任何想法如何設置它?

我不能發布很多源代碼,因為該軟件是為一家公司提供的。

您是否將Graphics對象轉換為Graphics2D並設置了RenderHints IE

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 將使我們能夠測試並查看可能有什么問題/使其更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM