【问题标题】:Overriding setPreferredSize() and getPreferredSize()覆盖 setPreferredSize() 和 getPreferredSize()
【发布时间】:2013-03-09 07:47:05
【问题描述】:

由于我收到的答案,我现在以不同的方式进行此操作。

有什么方法可以覆盖 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);
}
}

谢谢。

【问题讨论】:

  • 更改逻辑,排序,JComponents 返回它的 PreferredSize 给容器,JPanel 给 JFrame,JComponents 给 JPanel
  • @mKorbel 你能具体一点吗?
  • 默认情况下,JCompoents 没有任何问题地返回容器的正确坐标(不包括空 JPanel,JPanel 仅包含 Graphics、JScrollPane 和 JComboBox),我想念这个问题的真正原因(事件描述得很好,并且 inc SSCCE)
  • “有什么办法……” 有什么合乎逻辑的理由……吗?似乎您想故意将此类用户的脚射中。你能用有意义的方式向我解释一下吗?
  • @Andrew Thompson 我正在制作一个 JPanel,您可以通过拖动来调整其大小。我试图在它周围画一个边框,当用户想要面板的大小时,我不希望他们知道它周围的额外边框。

标签: java swing size overriding


【解决方案1】:

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

以 ip 为例;

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

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

【讨论】:

  • @MadProgrammer 就像我对 Andrew 所说的一样,我正在制作一个 JPanel,您可以通过拖动来调整其大小。我试图在它周围画一个边框,当用户想要面板的大小时,我不希望他们知道它周围的额外边框。
  • @maptwo3 这很难。您可以使用边框组合,但这将始终在面板周围留出空间。您可以使用 JLayer 之类的东西,或者您可以将要调整大小的面板移动到玻璃面板上,并在玻璃面板上使用一些自定义绘画,或者使用具有 reszie 绘画的包装面板,并且您不会在其上调整大小的面板(所有人都坐在在玻璃板上)
  • +1 回答。 @maptwo3 请参阅 this 类似的答案,了解您想要实现的目标
猜你喜欢
  • 2012-06-07
  • 2018-10-07
  • 2019-12-18
  • 2012-07-18
  • 2015-02-08
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
相关资源
最近更新 更多