微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java 通过调整元素大小来调整布局

如何解决Java 通过调整元素大小来调整布局

我有问题。

我有 JFrame 元素。 在这个框架元素中,有一个 PaintingPanel(扩展 Swing JPanel 类),其布局设置为 FlowLayout(FlowLayout.LEFT) 并固定了宽度和高度。 在 PaintPanel 内部有 CanvasPanel 元素(也扩展了 JPanel 类)。 CanvasPanel 的布局设置为 GroupLayout (2x2)。在左上角的单元格中,我有画布元素。 在其他 3 个单元格中,我有用于画布的调整器。 Resizer 也扩展了 JPanel 类。

在调整画布大小时,我想使用(画布)调整器调整 CanvasPanel 的大小。我还希望调整器适合画布尺寸:

  1. 对,水平缩放器的宽度应为 10 像素,画布的高度应为画布高度
  2. 底部,垂直缩放器的画布宽度和高度应为 10 像素
  3. 右下角,(水平和垂直)缩放器应为 10 像素 x 10 像素

我也不想调整 PaintingPanel 的大小。

我怎样才能达到预期的效果

这是CanvasPanel中布局的代码

private void setDefaultLayout()
{
    GroupLayout layout = new GroupLayout(this);
    setLayout(layout);
    layout.setautocreateGaps(true);
    layout.setautocreateContainerGaps(true);
    layout.setHorizontalGroup(
        layout.createSequentialGroup()
            .addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING)
                .addComponent(canvas)
                .addComponent(resizers.get("middle-right")))
            .addGroup(layout.createParallelGroup(GroupLayout.Alignment.CENTER)
                .addComponent(resizers.get("bottom-middle"))
                .addComponent(resizers.get("bottom-right")))
    );
    layout.setVerticalGroup(
        layout.createSequentialGroup()
            .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                .addComponent(canvas)
                .addComponent(resizers.get("bottom-middle")))
            .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                .addComponent(resizers.get("middle-right"))
                .addComponent(resizers.get("bottom-right")))
    );
}

这是当前调整 CanvasPanel 大小的方法

public void resizeCanvas(int width,int height)
{
    this.width = width + 40;
    this.height = height + 40;
    setSize(width,height);
    setPreferredSize(new Dimension(this.width,this.height));
    setMinimumSize(new Dimension(this.width,this.height));
    setMaximumSize(new Dimension(this.width,this.height));
    canvas.setSize(width,height);
}

有人可以帮忙吗?

解决方法

我已经找到了解决方案,并将其发布在下方。 我是通过使用 setLayout(null)setBounds() 方法完成的。 代码尚未重构。

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.HashMap;

public class Launcher
{
    private int offsetX = 10,offsetY = 10;
    private HashMap<String,Res> resizers = new HashMap<String,Res>();
    private JFrame frame;
    private JScrollPane pane;
    private Canvas canvas;

public static void main(String[] args)
{
    Launcher l = new Launcher();
    l.create();
}

public void create()
{
    initFrame();

    int canvasWidth = 200;
    int canvasHeight = 200;

    canvas = new Canvas();
    canvas.setSize(canvasWidth,canvasHeight);
    canvas.setPreferredSize(new Dimension(canvasWidth,canvasHeight));
    canvas.setMinimumSize(new Dimension(canvasWidth,canvasHeight));
    canvas.setMaximumSize(new Dimension(canvasWidth,canvasHeight));
    canvas.setBackground(Color.WHITE);
    canvas.setVisible(true);
    canvas.setBounds(offsetX,offsetY,canvasWidth,canvasHeight);
    canvas.repaint();

    resizers.put("horizontal",new Res(
            this,2*offsetX + canvasWidth,Res.DEFAULT_WIDTH,canvasHeight
    ));
    resizers.put("vertical",offsetX,2*offsetY + canvasHeight,Res.DEFAULT_WIDTH
    ));
    resizers.put("both",Res.DEFAULT_WIDTH
    ));

    pane = new JScrollPane();
    pane.setLayout(null);
    pane.setBackground(Color.LIGHT_GRAY);
    pane.add(canvas);
    pane.add(resizers.get("horizontal"));
    pane.add(resizers.get("vertical"));
    pane.add(resizers.get("both"));

    frame.add(pane,BorderLayout.CENTER);
    frame.pack();
}

public void resizeCanvasBy(int x,int y)
{
    int width = canvas.getWidth() + x;
    int height = canvas.getHeight() + y;
    canvas.setSize(width,height);
    canvas.setPreferredSize(new Dimension(width,height));
    canvas.setMinimumSize(new Dimension(width,height));
    canvas.setMaximumSize(new Dimension(width,height));

    resizers.get("horizontal").setBounds(
            2*offsetX + width,height);
    resizers.get("vertical").setBounds(
            offsetX,2*offsetY + height,width,Res.DEFAULT_WIDTH);
    resizers.get("both").setBounds(
            2*offsetX + width,Res.DEFAULT_WIDTH);
}

public void initFrame()
{
    frame = new JFrame();
    frame.setPreferredSize(new Dimension(400,400));
    frame.setMinimumSize(new Dimension(400,400));
    frame.setMaximumSize(new Dimension(400,400));
    frame.setResizable(true);
    frame.setUndecorated(false);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public class Res extends JPanel implements MouseListener
{
    public static final int DEFAULT_WIDTH = 10;
    private Launcher launcher;
    private int pressedX,pressedY;

    public Res(Launcher launcher,int x,int y,int width,int height)
    {
        this.launcher = launcher;
        setPreferredSize(new Dimension(width,height));
        setMinimumSize(new Dimension(width,height));
        setMaximumSize(new Dimension(width,height));
        setVisible(true);
        addMouseListener(this);
        setBounds(x,y,height);
        repaint();
    }

    @Override
    public void mouseClicked(MouseEvent e) {}

    @Override
    public void mousePressed(MouseEvent e)
    {
        pressedX = e.getX();
        pressedY = e.getY();
    }

    @Override
    public void mouseReleased(MouseEvent e)
    {
        int deltaX = e.getX() - pressedX;
        int deltaY = e.getY() - pressedY;
        launcher.resizeCanvasBy(deltaX,deltaY);
    }

    @Override
    public void mouseEntered(MouseEvent e) {}

    @Override
    public void mouseExited(MouseEvent e) {}
}

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。