Java 重写setPreferredSize()和getPreferredSize()

Java 重写setPreferredSize()和getPreferredSize(),java,swing,size,overriding,Java,Swing,Size,Overriding,由于我得到的答案,我现在用不同的方式来做这件事 有没有办法重写setPreferredSize()和getPreferredSize(),这样它就可以将组件的大小设置为比实际输入值高的数字,并得到比实际输入值低的数字 在这里,我覆盖了这两种方法,将面板的大小设置为比我实际放入setPreferredSize()中的大小多100像素,如果要获得首选大小,我希望它返回我放入setPreferredSize()中的大小 我怀疑Swing使用getPreferredSize()来设置大小,那么是否有其他

由于我得到的答案,我现在用不同的方式来做这件事

有没有办法重写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);
}
}

谢谢。

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

以知识产权为例

  • JPanel
    的默认大小是0x0,因此当您添加并减去100个像素时,现在又是0x0了
  • JFrame
    的默认布局管理器是
    BorderLayout
    ,如果可用大小大于或小于首选大小指定的大小,则会忽略首选大小

  • 真正的问题是,您真正想要实现的是什么?

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

    以知识产权为例

  • JPanel
    的默认大小是0x0,因此当您添加并减去100个像素时,现在又是0x0了
  • JFrame
    的默认布局管理器是
    BorderLayout
    ,如果可用大小大于或小于首选大小指定的大小,则会忽略首选大小

  • 真正的问题是,您实际想要实现什么?

    更改逻辑、排序,JComponents将其首选大小返回给contianer,JPanel返回给JFrame,JComponents返回给JPanel@mKorbel你能说得更具体一点吗?默认情况下,JCompoents返回容器时没有任何问题(不包括空的JPanel,JPanel只包含图形、JScrollPane和JComboBox),我想不出这个问题的真正原因(事件描述得很好,inc SSCCE)“有没有办法……”有没有合理的理由…?看起来你想故意射中这个类的用户的脚。你能解释一下吗?@Andrew Thompson我正在制作一个JPanel,你可以通过拖动来调整大小。我试图在它周围画一个边框,当用户想要面板的大小时,我不想让他们改变大小现在关于它周围的额外边界。更改逻辑、排序,JComponents将其首选大小返回给contianer,JPanel返回给JFrame,JComponents返回给JPanel@mKorbel你能说得更具体一点吗?默认情况下,JCompoents返回容器时没有任何问题(不包括空的JPanel,JPanel只包含图形、JScrollPane和JComboBox),我想不出这个问题的真正原因(事件描述得很好,inc SSCCE)“有没有办法……”有没有合理的理由…?看起来你想故意射中这个类的用户的脚。你能解释一下吗?@Andrew Thompson我正在制作一个JPanel,你可以通过拖动来调整大小。我试图在它周围画一个边框,当用户想要面板的大小时,我不想让他们改变大小现在谈谈它周围的额外边框。@madtool和我对Andrew说的一样,我正在制作一个JPanel,你可以通过拖动来调整大小。我试图在它周围画一个边框,当用户想要面板的大小时,我不想让他们知道它周围的额外边框。@maptoo3这是一件困难的事情。你可以使用f边框,但这将始终在面板周围留下空间。您可以使用类似于JLayer的工具,也可以将正在重新调整大小的面板移动到玻璃窗格上,并在玻璃窗格或包装面板上使用一些自定义的绘画。该面板上有重新调整大小的绘画,并且不会调整其大小(全部位于玻璃窗格上)+答案为1。@maptwo3要了解的内容,请参见类似的答案achieve@MadProgrammer和我对Andrew说的一样,我正在制作一个JPanel,你可以通过拖动来调整大小。我试图在它周围画一个边框,当用户想要面板的大小时,我不想让他们知道它周围的额外边框。@maptwo3这是一个很难做到的事情兴。您可以使用边框的组合,但这将始终在面板周围留下空间。您可以使用类似JLayer的工具,也可以将正在重新调整大小的面板移动到玻璃窗格上,并在玻璃窗格或包装面板上使用一些自定义的绘画,该面板上有重新调整大小的图案,而不会调整大小(全部坐在玻璃窗上)+1表示答案。@maptwo3表示您想要实现的目标,请参见类似的答案