我有一个 JFrameBorderLayout 作为布局管理器。

在南部边境,我有一个 JPanel, , 我要这个 JPanel的大小可由用户调整,即用户可以单击边框的边缘并将其向上拖动以使其变大。

你有什么办法知道我可以做到这一点吗?

有帮助吗?

解决方案

为了使框架中的面板单独调整大小,您需要将它们添加到 JSplitPane.

不要将其放在框架的南部分,而是将其放在 JSplitPane 在中心。分割窗格将使分割中的底部面板看起来像在南方,而分割中的顶部面板将位于框架的中心。

确保使用以下命令设置两个面板的方向 setOrientation(JSplitPane.VERTICAL_SPLIT ).

然后,您可以调整窗格中面板的大小。

其他提示

我觉得你的意思是说的JPanel。可以添加自定义的MouseListener和处理鼠标点击,拖动和鼠标释放,然后programmaticaly调整面板。

这将证明这一点。需要注意的是JFrame中不与JPanel的自动调整。为了使效果更为明显我涂在面板的红色和加入的斜面边框:

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());
    }

}

我为一个类,如果你想利用。它isn`t完呢。

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);
    }

}

您可能必须在两个指定JFrame.setResizeable = true;JFrame(带有边框布局)和儿童JFrame

您也可能想在南方边境使用JPanel

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top