0

由于我收到的答案,我现在以不同的方式做这件事。

有没有办法覆盖 setPreferredSize() 和 getPreferredSize() 以便它实际上将组件的大小设置为高于实际输入的数字,并获得一个低于实际数字的数字?

在这里,我重写了两种方法,将面板的大小设置为比我实际放入 setPreferredSize() 的大小大 100 像素,如果我要获得首选大小,我希望它返回我放入 setPreferredSize() 的内容

我怀疑 Swing 使用 getPreferredSize() 来设置大小,那么是否有另一种方法可以覆盖来实现这一点,或者我是否不得不使用另一种方法来返回我想要的值?

import java.awt.*;
import java.beans.Transient;
import javax.swing.*;

public class PreferredSize extends JPanel{

public static void main(String[] args) {
    JPanel background = new JPanel();

    PreferredSize ps = new PreferredSize();
    ps.setPreferredSize(new Dimension(200, 200));
    ps.setBackground(Color.CYAN);

    JPanel panel = new JPanel();
    panel.setBackground(Color.BLUE);
    panel.setPreferredSize(new Dimension(200, 200));


    background.add(ps);
    background.add(panel);

    JFrame f = new JFrame();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setContentPane(background);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setVisible(true);
}


@Override
public void setPreferredSize(Dimension preferredSize) {
    super.setPreferredSize(new Dimension(preferredSize.width+100, preferredSize.height+100));
}

@Override
@Transient
public Dimension getPreferredSize() {
    return new Dimension(super.getPreferredSize().width-100, super.getPreferredSize().height-100);
}
}

谢谢。

4

1 回答 1

4

您面临的问题是,首选尺寸只是一个指南,布局管理器可以使用它来决定组件的布局方式。布局管理器忽略这些提示是完全合理的。

在 ip 你的例子的情况下;

  1. a 的默认大小JPanel是 0x0,所以当您添加和减去 100 个像素时,它现在又是 0x0。
  2. a 的默认布局管理器JFrameis BorderLayout,如果其可用尺寸大于或小于首选尺寸指定的尺寸,它将忽略首选尺寸

真正的问题是,你真正想要达到的目标是什么?

于 2013-03-09T08:05:14.947 回答