Making a JPanel manually resizable

前端 未结 4 2043
我寻月下人不归
我寻月下人不归 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条回答
  • 2020-12-31 08:43

    You might have to specify JFrame.setResizeable = true; on both the Parent JFrame(the one with the border layout) and the child JFrame.

    You also might want to use a JPanel in the south border.

    0 讨论(0)
  • 2020-12-31 09:00

    I made a class for that if you want to take a look. It isn`t finished yet.

    package projetoSplitPainel;
    
    import java.awt.Component;
    import java.util.ArrayList;
    
    import javax.swing.JSplitPane;
    
    /**
     * This Components is based on the JSplitPane. JSplitPane is used to divide two
     * (and only two) Components. This class intend to manipulate the JSplitPane in
     * a way that can be placed as many Component as wanted.
     * 
     * @author Bode
     *
     */
    public class JSplitPaneMultiTabs extends JSplitPane {
        private ArrayList<JSplitPane> ecanpsulationList = new ArrayList<JSplitPane>();
        private int numberOfComponents = 1;
        private int sizeOfDivision = 6;
    
        /**
         * Builds the Pane
         */
        public JSplitPaneMultiTabs() {
            super();
            this.setLeftComponent(null);
            this.setBorder(null);
            ecanpsulationList.add(this);
            setAllBorders(sizeOfDivision);
        }
    
        /**
         * 
         * @param comp - adds a Component to the Pane
         */
        public void addComponent(Component comp) {
            JSplitPane capsule = new JSplitPane();
    
            capsule.setRightComponent(null);
            capsule.setLeftComponent(comp);
            capsule.setDividerSize(sizeOfDivision);
            capsule.setBorder(null);
    
            ecanpsulationList.get(numberOfComponents - 1).setRightComponent(capsule);
            ecanpsulationList.add(capsule);
            numberOfComponents++;
            this.fixWeights();
        }
    
        /**
         * 
         * @param orientation
         *            JSplitPane.HORIZONTAL_SPLIT - sets the orientation of the
         *            Components to horizontal alignment
         * @param orientation
         *            JSplitPane.VERTICAL_SPLIT - sets the orientation of the
         *            Components to vertical alignment
         */
        public void setAlignment(int orientation) {
            for (int i = 0; i < numberOfComponents; i++) {
                ecanpsulationList.get(i).setOrientation(orientation);
    
            }
        }
    
        /**
         * 
         * @param newSize - resizes the borders of the all the Components of the Screen
         */
        public void setAllBorders(int newSize) {
            this.setDividerSize(newSize);
            for (int i = 0; i < numberOfComponents; i++) {
                ecanpsulationList.get(i).setDividerSize(newSize);
            }
    
        }
    
        /**
         * each Component added needs to be readapteded to the screen
         */
        private void fixWeights() {
            ecanpsulationList.get(0).setResizeWeight(1.0);
            for (int i = 1; i < numberOfComponents; i++) {
                double resize = (double) 1 / (double) (i + 1);
                ecanpsulationList.get(numberOfComponents - i - 1).setResizeWeight(
                        resize);
            }
            ecanpsulationList.get(numberOfComponents - 1).setResizeWeight(0.0);
        }
    
    }
    
    0 讨论(0)
  • 2020-12-31 09:03

    In order to make panels in a frame individually resizable you need to add them onto a JSplitPane.

    Instead of putting it in the South portion of the Frame, put the JSplitPane in the Center. The split pane will make the bottom panel in the split seem like it is in the South, and the top panel in the split will be in the Center of the frame.

    Make sure you set the orientation of the two panels with setOrientation(JSplitPane.VERTICAL_SPLIT ).

    Then, you can resize the panels that are in the pane.

    0 讨论(0)
  • 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());
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题