Making a JPanel manually resizable

前端 未结 4 2140
我寻月下人不归
我寻月下人不归 2020-12-31 08:10

I have a JFrame with BorderLayout as the layout manager.

In the south border, I have a JPanel, I want this JPanel

4条回答
  •  Happy的楠姐
    2020-12-31 09:08

    I think you meant to say JPanel. You can add a custom mouseListener and handle mouse clicks, drags and mouse releases and then resize the panel programmaticaly.

    This will demonstrate this. Note that the jframe does NOT resize automatically with the JPanel. To make the effect more visible i painted the panel red and added a beveled border :

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Point;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionAdapter;
    
    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.border.BevelBorder;
    
    @SuppressWarnings("serial")
    public class ResizablePanel extends JPanel {
    
        private boolean drag = false;
        private Point dragLocation  = new Point();
    
        public  ResizablePanel() {
            setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
            setPreferredSize(new Dimension(500, 500));
            final JFrame f = new JFrame("Test");
            addMouseListener(new MouseAdapter() {
                @Override
                public void mousePressed(MouseEvent e) {
                    drag = true;
                    dragLocation = e.getPoint();
                }
    
                @Override
                public void mouseReleased(MouseEvent e) {
                    drag = false;
                }
            });
            addMouseMotionListener(new MouseMotionAdapter() {
                @Override
                public void mouseDragged(MouseEvent e) {
                    if (drag) {
                        if (dragLocation.getX()> getWidth()-10 && dragLocation.getY()>getHeight()-10) {
                            System.err.println("in");
                            setSize((int)(getWidth()+(e.getPoint().getX()-dragLocation.getX())),
                                    (int)(getHeight()+(e.getPoint().getY()-dragLocation.getY())));
                            dragLocation = e.getPoint();
                        }
                    }
                }
            });
            f.getContentPane().setLayout(new BorderLayout());
            f.getContentPane().add(this,BorderLayout.CENTER);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.pack();
            f.setVisible(true);
        }
    
        public static void main(String[] args) {
            new ResizablePanel();
        }
    
        public void paintComponent(Graphics g) {
            g.setColor(Color.red);
            g.fillRect(0, 0, getWidth(), getHeight());
        }
    
    }
    

提交回复
热议问题