簡體   English   中英

如何從一個jpanel到另一個jpanel畫一條線

[英]How to draw a line from a jpanel to another jpanel

我有兩個JPanels,我想單擊第一個面板,然后單擊第二個面板,並在兩個面板之間繪制一條直線。 放置后,該線還必須在兩個面板之間保持不變。 有人可以給我小費的起點嗎? 這兩個面板位於第三個面板上,它們是下圖中的藍色矩形。 先感謝您。 在此處輸入圖片說明 //父級JPanels

import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;


            class WorkflowPanel extends JPanel {
                private volatile int screenX = 0;
                private volatile int screenY = 0;
                private static final int RADIUS = 35;
                private int radius = RADIUS;
                private ArrayList<ModelView> relationship;
                WorkflowPanel() {
                    relationship = new ArrayList<>();
                    relationship.add(new ModelView());
                    relationship.add(new ModelView());
                    add(relationship.get(0));
                    add(relationship.get(1));
                    setLayout(null);
                    setVisible(true);
                }

                @Override
                protected void paintChildren(Graphics g) {
                        for (int i = 0; i < relationship.size(); i += 2) {
                        ModelView one = relationship.get(i);
                        ModelView two = relationship.get(i + 1);
                        Point p1 = new Point(one.getLocation().x + one.getWidth() / 2, one.getLocation().y + one.getHeight() / 2);
                        Point p2 = new Point(two.getLocation().x + two.getWidth() / 2, two.getLocation().y + two.getHeight() / 2);
                        g.drawLine(p1.x, p1.y, p2.x, p2.y);
                        this.repaint();
                    }
                    super.paintChildren(g);
                }


                public ArrayList<ModelView> getRelationship() {
                    return relationship;
                }
            }

    // Draggable Jpanels

    import javax.swing.*;
    import javax.swing.border.*;
    class ModelView extends JPanel {
            private volatile int screenX = 0;
            private volatile int screenY = 0;
            private volatile int myX = 0;
            private volatile int myY = 0;
            private JLabel modelLbl;


            public ModelView() {
                setBorder(new LineBorder(new Color(128, 149, 255), 2));
                setBackground(Color.WHITE);
                setBounds(0, 0, 150, 75);
                setOpaque(false);


                GridBagConstraints gbc = new GridBagConstraints();
                gbc.anchor = GridBagConstraints.FIRST_LINE_START;
                gbc.fill = GridBagConstraints.HORIZONTAL;

                modelLbl = getLabel("DecisionTree");



                addMouseMotionListener(new MouseMotionListener() {
                    @Override
                    public void mouseDragged(MouseEvent e) {

                    }

                    @Override
                    public void mouseMoved(MouseEvent e) {

                    }
                });

                addMouseListener(new MouseListener() {

                    @Override
                    public void mouseClicked(MouseEvent e) { }

                    @Override
                    public void mousePressed(MouseEvent e) {
                        screenX = e.getXOnScreen();
                        screenY = e.getYOnScreen();

                        myX = getX();
                        myY = getY();
                    }

                    @Override
                    public void mouseReleased(MouseEvent e) {

                    }

                    @Override
                    public void mouseEntered(MouseEvent e) { }

                    @Override
                    public void mouseExited(MouseEvent e) { }

                });
                addMouseMotionListener(new MouseMotionListener() {

                    @Override
                    public void mouseDragged(MouseEvent e) {
                        int deltaX = e.getXOnScreen() - screenX;
                        int deltaY = e.getYOnScreen() - screenY;

                        setLocation(myX + deltaX, myY + deltaY);
                        e.getComponent().repaint();   
                        // Repaint the parent component
                        workflowPanel.repaint();
                    }



                    @Override
                    public void mouseMoved(MouseEvent e) { }

                });
            }

            private JLabel getLabel(String labelText) {

                JLabel label = new JLabel(labelText);
                label.setFont(new Font("Verdana", Font.PLAIN, 10));
                return label;
            }

            public JPanel getPanel() {
                return this;
            }
        }

有人可以給我小費的起點嗎?

父面板需要知道子面板之間的關系。

一種方法是保留ArrayList來跟蹤成對的組件之間的關系。 然后,您將需要覆蓋父面板的paintChildren(...)方法,以在兩個孩子之間畫一條線。

您可以在父面板類中定義ArrayList:

private ArrayList<Component> relationships = new ArrayList<Component>();

然后根據需要將成對的組件添加到ArrayList中:

relationships.add( component1a );
relationships.add( component1b );

基本繪畫代碼為:

@Override
protected void paintChildren(Graphics g)
{
    for (int i = 0; i < relationships.size(); i += 2)
    {
        Component one = relationships.get(i);
        Component two = relationships.get(i + 1);
        Point p1 = //calculate the center of component one
        Point p2 = //calculate the center of component two
        g.drawline(p1.x, p1.y, p2.x, p2.y);
    }

    super.paintChildren(g);
}

因此,上面的代碼應在您添加到ArrayList的每對組件的中心點之間繪制線。 然后,子面板將繪制在線條的頂部,以便線條看起來像從每個組件的邊緣出來。

退房trashgod的GraphPanel例子。 此示例支持拖動形狀,線條將跟隨形狀。

暫無
暫無

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

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