Java JDesktopPane上未出现行

Java JDesktopPane上未出现行,java,swing,graphics2d,repaint,jlayeredpane,Java,Swing,Graphics2d,Repaint,Jlayeredpane,我想在两个JPanel之间画一条线,但这条线并没有出现在layeredPane上 这就是我所做的,请仔细检查,可编译。请尝试并更正此代码。我曾尝试过用这种方式在内部框架上绘制线条,但对JPanels不起作用 package build; import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQ

我想在两个JPanel之间画一条线,但这条线并没有出现在layeredPane上

这就是我所做的,请仔细检查,可编译。请尝试并更正此代码。我曾尝试过用这种方式在内部框架上绘制线条,但对JPanels不起作用

package build;
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;

public class LinkLayerPane1 {

    public static void main(String[] args) {
        new LinkLayerPane1();
    }

    public LinkLayerPane1() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JLayeredPane layer = new JLayeredPane();
                JPanel red = new JPanel();
                red.setBackground(Color.RED);
                JPanel blue = new JPanel();
                blue.setBackground(Color.BLUE);

                red.setBounds(50, 50, 50, 50);
                blue.setBounds(125, 125, 50, 50);

                layer.add(red);
                layer.add(blue);

                Point Red= new Point();
                Red.x=red.getX()+(red.getWidth()/2);
                Red.y=red.getY()-(red.getHeight()/2);

                Point Blue= new Point();
                Blue.x=blue.getX()+(blue.getWidth()/2);
                Blue.y=blue.getY()-(blue.getHeight()/2);




                handleDrag(red,Blue);
                handleDrag(blue,Red);
         layer.add(new LinkPane(red, blue), new Integer(JLayeredPane.DEFAULT_LAYER + 1));
         layer.setPreferredSize(new Dimension(250, 250));

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(layer);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

    public class LinkPane extends JPanel {

        private Point startPoint;
        private Point endPoint;

        public LinkPane(JPanel panel1, JPanel panel2) {

            setOpaque(false);

            Point p1 = panel1.getLocation();
            Point p2 = panel2.getLocation();

            startPoint = new Point();
            endPoint = new Point();

            Point from = new Point();
            Point to = new Point();

            if (p1.x < p2.x) {
                from.x = p1.x + (panel1.getWidth() / 2);
                to.x = p2.x + (panel2.getWidth() / 2);
            } else {
                from.x = p2.x + (panel2.getWidth() / 2);
                to.x = p1.x + (panel1.getWidth() / 2);
                startPoint.x = p2.x;
            }
            if (p1.y < p2.y) {
                from.y = p1.y + (panel1.getHeight()/ 2);
                to.y = p2.y + (panel2.getHeight()/ 2);

            } else {
                from.y = p2.y + (panel2.getHeight()/ 2);
                to.y = p1.y + (panel1.getHeight()/ 2);
            }

            int width = Math.max(1, to.x - from.x);
            int height = Math.max(1, to.y - from.y);

            setLocation(from);
            setSize(width, height);

            System.out.println(getBounds());

            if (p1.x < p2.x) {
                startPoint.x = 0;
                endPoint.x = getWidth();
            } else {
                startPoint.x = getWidth();
                endPoint.x = 0;
            }
            if (p1.y < p2.y) {
                startPoint.y = 0;
                endPoint.y = getHeight();
            } else {
                startPoint.y = getHeight();
                endPoint.y = 0;
            }            
        }

  @Override
  protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
  g2d.setStroke(new BasicStroke(3, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
            g2d.drawLine(startPoint.x, startPoint.y, endPoint.x, endPoint.y);
            g2d.dispose();


        }        
    }    

  //Dragging 
    public static void handleDrag(final JPanel Tpanel,final Point to)
     {
        final JPanel p = Tpanel;
            Tpanel.addMouseMotionListener(new MouseMotionAdapter() {

 @Override
 public void mouseDragged(MouseEvent me) {
 me.translatePoint(me.getComponent().getLocation().x, me.getComponent().getLocation().y);

                        //Handling Panel Dragging 
                        p.setLocation(me.getX(), me.getY());

              //Finding new point
                      Point p1 = Tpanel.getLocation();
                      Point p2=to;

                     Point startPoint = new Point();
                     Point endPoint = new Point();

                      Point from = new Point();


       if (p1.x < p2.x) {
         from.x = p1.x + (Tpanel.getWidth() / 2);
         to.x = p2.x + (Tpanel.getWidth() / 2);
             } else {
             from.x = p2.x + (Tpanel.getWidth() / 2);
             to.x = p1.x + (Tpanel.getWidth() / 2);
             startPoint.x = p2.x;
         }
           if (p1.y < p2.y) {
           from.y = p1.y + (Tpanel.getHeight()/ 2);
           to.y = p2.y + (Tpanel.getHeight()/ 2);

           } else {
               from.y = p2.y + (Tpanel.getHeight()/ 2);
               to.y = p1.y + (Tpanel.getHeight()/ 2);
           }
               int width = Math.max(1, to.x - from.x);
               int height = Math.max(1, to.y - from.y);



       if (p1.x < p2.x) {
    startPoint.x = 0;
    endPoint.x = Tpanel.getWidth();
    } else {
    startPoint.x = Tpanel.getWidth();
    endPoint.x = 0;
      }
     if (p1.y < p2.y) {
        startPoint.y = 0;
        endPoint.y = Tpanel.getHeight();
      } else {
               startPoint.y = Tpanel.getHeight();
           endPoint.y = 0;
       }                    


       }

     });
     }    

}
包构建;
导入java.awt.BasicStroke;
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Point;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseMotionAdapter;
导入javax.swing.JFrame;
导入javax.swing.JLayeredPane;
导入javax.swing.JPanel;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
导入javax.swing.border.LineBorder;
公共类LinkLayerPane1{
公共静态void main(字符串[]args){
新的LinkLayerPane1();
}
公共链接层面板1(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}捕获(ClassNotFoundException ex){
}catch(实例化异常){
}捕获(非法访问例外){
}捕获(无支持的LookandFeelexception ex){
}
JLayeredPane层=新的JLayeredPane();
JPanel red=新的JPanel();
红色。挫折背景(颜色。红色);
JPanel blue=新的JPanel();
蓝色。挫折背景(颜色。蓝色);
红色。后退(50,50,50,50);
蓝色。挫折(125125,50,50);
图层。添加(红色);
图层。添加(蓝色);
点红色=新点();
Red.x=Red.getX()+(Red.getWidth()/2);
Red.y=Red.getY()-(Red.getHeight()/2);
蓝色点=新点();
Blue.x=Blue.getX()+(Blue.getWidth()/2);
Blue.y=Blue.getY()-(Blue.getHeight()/2);
手抹布(红色、蓝色);
手抹布(蓝色、红色);
添加(新链接窗格(红色,蓝色),新整数(JLayeredPane.DEFAULT_layer+1));
layer.setPreferredSize(新尺寸(250250));
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的BorderLayout());
框架。添加(层);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类链接窗格扩展了JPanel{
专用点起始点;
专用点端点;
公共链接窗格(JPanel Panel 1、JPanel Panel 2){
设置不透明(假);
点p1=panel1.getLocation();
点p2=panel2.getLocation();
起始点=新点();
端点=新点();
点源=新点();
指向=新点();
if(p1.ximport java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;

public class LinkLayerPane {

    public static void main(String[] args) {
        new LinkLayerPane();
    }

    public LinkLayerPane() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JLayeredPane layer = new JLayeredPane();
                JPanel red = new JPanel();
                red.setBackground(Color.RED);
                JPanel blue = new JPanel();
                blue.setBackground(Color.BLUE);

                red.setBounds(50, 50, 50, 50);
                blue.setBounds(125, 125, 50, 50);

                layer.add(red);
                layer.add(blue);

                layer.add(new LinkPane(red, blue), new Integer(JLayeredPane.DEFAULT_LAYER + 1));
                layer.setPreferredSize(new Dimension(250, 250));

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(layer);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

    public class LinkPane extends JPanel {

        private Point startPoint;
        private Point endPoint;

        public LinkPane(JPanel panel1, JPanel panel2) {

            setOpaque(false);

            Point p1 = panel1.getLocation();
            Point p2 = panel2.getLocation();

            startPoint = new Point();
            endPoint = new Point();

            Point from = new Point();
            Point to = new Point();

            if (p1.x < p2.x) {
                from.x = p1.x + (panel1.getWidth() / 2);
                to.x = p2.x + (panel2.getWidth() / 2);
            } else {
                from.x = p2.x + (panel2.getWidth() / 2);
                to.x = p1.x + (panel1.getWidth() / 2);
                startPoint.x = p2.x;
            }
            if (p1.y < p2.y) {
                from.y = p1.y + (panel1.getHeight()/ 2);
                to.y = p2.y + (panel2.getHeight()/ 2);

            } else {
                from.y = p2.y + (panel2.getHeight()/ 2);
                to.y = p1.y + (panel1.getHeight()/ 2);
            }

            int width = Math.max(1, to.x - from.x);
            int height = Math.max(1, to.y - from.y);

            setLocation(from);
            setSize(width, height);

            System.out.println(getBounds());

            if (p1.x < p2.x) {
                startPoint.x = 0;
                endPoint.x = getWidth();
            } else {
                startPoint.x = getWidth();
                endPoint.x = 0;
            }
            if (p1.y < p2.y) {
                startPoint.y = 0;
                endPoint.y = getHeight();
            } else {
                startPoint.y = getHeight();
                endPoint.y = 0;
            }            
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setStroke(new BasicStroke(3, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
            g2d.drawLine(startPoint.x, startPoint.y, endPoint.x, endPoint.y);
            g2d.dispose();
        }        
    }    
}
public static void main(String[] args) {
    new LinkLayerPane();
}

public LinkLayerPane() {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (ClassNotFoundException ex) {
            } catch (InstantiationException ex) {
            } catch (IllegalAccessException ex) {
            } catch (UnsupportedLookAndFeelException ex) {
            }

            JLayeredPane layer = new JLayeredPane();
            JPanel red = new JPanel();
            red.setBackground(Color.RED);
            JPanel blue = new JPanel();
            blue.setBackground(Color.BLUE);

            red.setBounds(50, 50, 50, 50);
            blue.setBounds(125, 125, 50, 50);

            layer.add(red);
            layer.add(blue);

            layer.add(new LinkPane(red, blue), new Integer(JLayeredPane.DEFAULT_LAYER + 1));
            layer.setPreferredSize(new Dimension(250, 250));

            MouseAdapter ma = new MouseAdapter() {
                private Point offset;
                private Component dragComponent;

                @Override
                public void mousePressed(MouseEvent e) {
                    JLayeredPane layer = (JLayeredPane) e.getComponent();
                    dragComponent = layer.getComponentAt(e.getPoint());
                    if (dragComponent != null && !dragComponent.equals(layer) && !(dragComponent instanceof LinkPane)) {
                        offset = e.getPoint();
                        offset.x = dragComponent.getX() - offset.x;
                        offset.y = dragComponent.getY() - offset.y;
                    } else {
                        dragComponent = null;
                    }
                }

                @Override
                public void mouseReleased(MouseEvent e) {
                    dragComponent = null;
                    offset = null;
                }

                @Override
                public void mouseDragged(MouseEvent e) {
                    if (dragComponent != null) {
                        Point dragTo = e.getPoint();
                        dragTo.x += offset.x;
                        dragTo.y += offset.y;
                        dragComponent.setLocation(dragTo);
                    }
                }
            };

            layer.addMouseListener(ma);
            layer.addMouseMotionListener(ma);

            JFrame frame = new JFrame("Test");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new BorderLayout());
            frame.add(layer);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    });
}

public class LinkPane extends JPanel {

    private Point startPoint;
    private Point endPoint;
    private JPanel[] links;

    public LinkPane(JPanel panel1, JPanel panel2) {

        setOpaque(false);

        links = new JPanel[]{panel1, panel2};

        ComponentAdapter ca = new ComponentAdapter() {
            @Override
            public void componentMoved(ComponentEvent e) {
                updateLinks();
            }

            @Override
            public void componentResized(ComponentEvent e) {
                updateLinks();
            }
        };

        links[0].addComponentListener(ca);
        links[1].addComponentListener(ca);

        updateLinks();

    }

    protected void updateLinks() {

        Point p1 = links[0].getLocation();
        Point p2 = links[1].getLocation();

        startPoint = new Point();
        endPoint = new Point();

        Point from = new Point();
        Point to = new Point();

        if (p1.x < p2.x) {
            from.x = p1.x + (links[0].getWidth() / 2);
            to.x = p2.x + (links[1].getWidth() / 2);
        } else {
            from.x = p2.x + (links[1].getWidth() / 2);
            to.x = p1.x + (links[0].getWidth() / 2);
            startPoint.x = p2.x;
        }
        if (p1.y < p2.y) {
            from.y = p1.y + (links[0].getHeight() / 2);
            to.y = p2.y + (links[1].getHeight() / 2);

        } else {
            from.y = p2.y + (links[1].getHeight() / 2);
            to.y = p1.y + (links[0].getHeight() / 2);
        }

        int width = Math.max(1, to.x - from.x);
        int height = Math.max(1, to.y - from.y);

        setLocation(from);
        setSize(width, height);

        System.out.println(getBounds());

        if (p1.x < p2.x) {
            startPoint.x = 0;
            endPoint.x = getWidth();
        } else {
            startPoint.x = getWidth();
            endPoint.x = 0;
        }
        if (p1.y < p2.y) {
            startPoint.y = 0;
            endPoint.y = getHeight();
        } else {
            startPoint.y = getHeight();
            endPoint.y = 0;
        }

    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g.create();
        g2d.setStroke(new BasicStroke(3, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
        g2d.drawLine(startPoint.x, startPoint.y, endPoint.x, endPoint.y);
        g2d.dispose();
    }
}