使 JPanel 可手动调整大小
2022-09-03 09:56:31
我有一个作为布局经理。JFrame
BorderLayout
在南边框中,我有一个,我希望这个大小可以由用户调整,即用户可以单击边框的边缘并将其向上拖动以使其更大。JPanel
JPanel
你知道我能做到这一点吗?
我有一个作为布局经理。JFrame
BorderLayout
在南边框中,我有一个,我希望这个大小可以由用户调整,即用户可以单击边框的边缘并将其向上拖动以使其更大。JPanel
JPanel
你知道我能做到这一点吗?
为了使框架中的面板可以单独调整大小,您需要将它们添加到JSplitPane上
。
与其把它放在框架的南部分,不如把它放在中心。拆分窗格将使拆分中的底部面板看起来像在南部,而拆分中的顶部面板将位于框架的中心。JSplitPane
确保使用 设置两个面板的方向。setOrientation(JSplitPane.VERTICAL_SPLIT )
然后,您可以调整窗格中面板的大小。
我想你的意思是说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());
}
}