Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使我的JComponent符合JFrame.pack和布局管理器?_Java_Swing_Layout Manager_Jcomponent - Fatal编程技术网

Java 如何使我的JComponent符合JFrame.pack和布局管理器?

Java 如何使我的JComponent符合JFrame.pack和布局管理器?,java,swing,layout-manager,jcomponent,Java,Swing,Layout Manager,Jcomponent,我制作了一个JComponent,它显示一个指定颜色的矩形。(还没有找到任何其他方法来达到这种效果)。问题是,它并不像预期的那样遵循JFrame.pack()和布局管理器 代码: 我尝试在pack和显式指定帧的大小之间进行实验。以下是我的GUI在各种设置下的默认外观: 普通大型机.pack(): 大型机。设置大小(500500): 大型机。设置大小(500300): 最接近我想要实现的是mainFrame.setSize(500500),尽管我计划再添加几个组件,但我预计它会很脆弱。如您所

我制作了一个JComponent,它显示一个指定颜色的矩形。(还没有找到任何其他方法来达到这种效果)。问题是,它并不像预期的那样遵循JFrame.pack()和布局管理器

代码:

我尝试在pack和显式指定帧的大小之间进行实验。以下是我的GUI在各种设置下的默认外观:

普通大型机.pack():

大型机。设置大小(500500):

大型机。设置大小(500300):


最接近我想要实现的是mainFrame.setSize(500500),尽管我计划再添加几个组件,但我预计它会很脆弱。如您所见,在另外两个组件中,“操作”按钮与ColorSample组件重叠——就像它没有遵循我设置的布局管理器一样。然后查看如何包装ColorSample组件的切割。关于如何实现所需效果的任何提示?

pack()
使用组件的
getPreferredSize()
。因此,只需返回矩形的所需大小,该大小将在
LayoutManager

中使用,LayoutManager可以根据需要自由调整/定位组件的大小,组件不能强制它们,只能在getXXSize(XX==min/pref/max)方法中给出提示。因此,组件实现所能做的最好的事情就是

  • 实现所有getXXSize并返回理想的大小
  • 实施油漆组件以应对不同的尺寸
只是一个片段

public class MyBox extends JComponent {
     Dimension boxSize;

     public void setBoxSize(Dimension box) {
         this.boxSize = new Dimension(box);
         ...   
     } 

     @Override
     public void paintComponent(Graphics g) {
         super.paintComponent(g);
         // position the box in the actual size
         // and paint it 
     }

     @Override
     public Dimension getPreferredSize() {
         return getBoxSize();
     }
     @Override // same for min/max
     public Dimension getM...Size( {
         return getBoxSize();
     }
}

解决方法:使用空的
JLabel
,将其大小设置为所需大小,然后调用
setBackground(color)
?哇。老实说,我没想到。只是,ColorSample将来必须改变形状——我实际上是在制作一些类似于儿童托儿所的软件。不过我会记住的达恩。。被打败了,而且更短:-)
public class MyBox extends JComponent {
     Dimension boxSize;

     public void setBoxSize(Dimension box) {
         this.boxSize = new Dimension(box);
         ...   
     } 

     @Override
     public void paintComponent(Graphics g) {
         super.paintComponent(g);
         // position the box in the actual size
         // and paint it 
     }

     @Override
     public Dimension getPreferredSize() {
         return getBoxSize();
     }
     @Override // same for min/max
     public Dimension getM...Size( {
         return getBoxSize();
     }
}