使 JPanel 可手动调整大小

2022-09-03 09:56:31

我有一个作为布局经理。JFrameBorderLayout

在南边框中,我有一个,我希望这个大小可以由用户调整,即用户可以单击边框的边缘并将其向上拖动以使其更大。JPanelJPanel

你知道我能做到这一点吗?


答案 1

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

与其把它放在框架的南部分,不如把它放在中心。拆分窗格将使拆分中的底部面板看起来像在南部,而拆分中的顶部面板将位于框架的中心。JSplitPane

确保使用 设置两个面板的方向。setOrientation(JSplitPane.VERTICAL_SPLIT )

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


答案 2

我想你的意思是说JPanel。您可以添加自定义鼠标筛选器并处理鼠标单击、拖动和鼠标释放,然后以编程方式调整面板大小。

这将证明这一点。请注意,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());
    }

}

推荐