简体   繁体   中英

Make JPanel resizable

I want to make a draggable and resizable panel which also can be closed/removed. Dragging the panel is working good, but there is some error in my resizing code. It is working but not very well. Maybe there is someone who can help me to fix it. The issue is to set the correct location of the labels "close" and "resize".

Thank you for help

public class PanelDraggable extends JPanel {

    private Point pointPressed;
    int width1;
    int height1;
    int headerHeight;
    int closeDim;

    JLabel close;
    JLabel resize;
    JPanel cs;
    JLabel header;

    public PanelDraggable( int x,  int y, int width, int height, String lblName) {

        //        draggable.setCursor(draggable.getCursor());
        //        setCursor(new Cursor(Cursor.HAND_CURSOR));

        width1 = width; height1 = height;
        closeDim = 15;

        headerHeight = 20;

        setBounds(x, y, width, height);
        this.setLayout(null);
        setBorder(new LineBorder(new Color(147, 147, 255), 3, true));
        this.setOpaque(true);


        //header
        header = new JLabel(lblName);
        this.add(header);
        header.setBounds(0, 0, width-(closeDim + 2), headerHeight);
        header.setBorder(new LineBorder(new Color(147, 147, 255), 3, true));
        header.setBackground(new Color(147, 147, 255));
        header.setOpaque(true);
        MouseInputAdapter mouseAdapter = new HeaderMouseHandler();
        header.addMouseMotionListener(mouseAdapter);
        header.addMouseListener(mouseAdapter);

        //close Button
        close = new JLabel("cx");
        close.setIcon(new ImageIcon("icons/close_16x16.png"));
        close.setBounds( (width- (closeDim + 2)) , 2, closeDim, closeDim);
        close.setCursor(new Cursor(Cursor.HAND_CURSOR));
        this.add(close);

        //Container
        cs = new JPanel();
        cs.setBounds(0, headerHeight, width, (height-headerHeight) );
        cs.setOpaque(false);
        cs.setBackground(Color.red);
        this.add(cs);

        //Resise
        resize = new JLabel("re");
        resize.setBounds( (width-closeDim), (height-closeDim) , closeDim, closeDim);
        resize.setCursor(new Cursor(Cursor.SE_RESIZE_CURSOR));
        this.add(resize);

        MouseInputAdapter resizeMouseAdapter = new ResizeMouseHandler();
        resize.addMouseMotionListener(resizeMouseAdapter);
        resize.addMouseListener(resizeMouseAdapter);

    }


    private class HeaderMouseHandler extends MouseInputAdapter {

        public void mouseDragged(final MouseEvent e) {
            Point pointDragged = e.getPoint();
            Point loc = getLocation();
            loc.translate(pointDragged.x - pointPressed.x,
                pointDragged.y - pointPressed.y);
            setLocation(loc);

        }

        public void mousePressed(final MouseEvent e) {

                pointPressed = e.getPoint();

        }
    }

    private class ResizeMouseHandler extends MouseInputAdapter {

        public void mouseDragged(final MouseEvent e) {
            Point pointDragged = e.getPoint();

            int w = width1 + pointDragged.x;
            int h = height1 + pointDragged.y;

            setSize(w , h);
            cs.setSize(w, (h-headerHeight) );
            header.setSize(w -(closeDim + 2), headerHeight);

            //Point loc = getLocation();
            //loc.translate(pointDragged.x - pointPressed.x,
                //pointDragged.y - pointPressed.y);

            //System.out.println("p: "+Integer.toString((pointDragged.x - pointPressed.x)) + " / " + Integer.toString((pointDragged.y - pointPressed.y)));
            //System.out.println("n: "+Integer.toString(w) + " / " + Integer.toString(h));
            //System.out.println("o: "+Integer.toString(width1) + " / " + Integer.toString(height1));

            Point resizeloc = new Point();
            resizeloc.translate(w-closeDim, h-closeDim);
            resize.setLocation(resizeloc);

            //Point closeloc = new Point();
            //closeloc.translate((w - (closeDim + 2)) , 2 );
            //close.setLocation(closeloc);


            revalidate(); 
            repaint();
        }

        public void mousePressed(final MouseEvent e) {

                pointPressed = e.getPoint();

        }
    }
}

Now solved. The problem was that the Dimensions of the panel (which are my references for the new locations of the labels) were not variable.

int w = width1 + pointDragged.x;
        int h = height1 + pointDragged.y;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM