2013-03-09 27 views
0

由于我收到的答案,我现在正在做这个不同的方式。覆盖setPreferredSize()和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); 
} 
} 

谢谢。

+0

更改逻辑,排序,JComponents将其PreferredSize返回给客户端,JPanel返回给JFrame,JComponents返回JPanel – mKorbel 2013-03-09 07:51:06

+0

@mKorbel您能更具体一点吗? – 2013-03-09 07:53:47

+0

默认JCompoents返回没有任何问题适当的坐标到容器(不包括空的JPanel,JPanel只包含图形,JScrollPane和JComboBox),我想念这个问题的真正原因(事件是很好的描述,并包括SSCCE) – mKorbel 2013-03-09 07:57:14

回答

4

您面临的问题是,首选大小只是布局管理人员可以使用的一个指南,以决定如何布置组件。布局经理忽略这些提示是完全合理的。

在ip的情况下你的例子;

  1. JPanel的默认大小是0x0,因此在您添加和减去100像素时,它的当前再次为0x0。
  2. JFrame的默认布局管理器是BorderLayout,这将忽略首选大小,如果它的可用大小是然后通过首选大小指定较大或较小

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

+1

+1主要用于最后一句。 – 2013-03-09 08:05:51

+0

@MadProgrammer与我对Andrew所说的一样,我正在制作一个JPanel,可以通过拖动来调整大小。我试图在它周围绘制边框,并且当用户需要面板的大小时,我不希望他们知道围绕它的额外边框。 – 2013-03-09 08:24:31

+0

@ maptwo3这是一件困难的事情。你可以使用边界的组合,但是这总会在面板周围留下空间。你可以使用像JLayer这样的东西,或者你可以将你正在改变的面板移动到玻璃板上,并在玻璃板上使用一些自定义的绘画,或者一个包装面板上有你不会调整的reszie绘画和面板(所有坐在玻璃窗格上) – MadProgrammer 2013-03-09 09:13:04