繁体   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