Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.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 创建处理所有类型的Swing组件的方法_Java_Swing_Jcomponent - Fatal编程技术网

Java 创建处理所有类型的Swing组件的方法

Java 创建处理所有类型的Swing组件的方法,java,swing,jcomponent,Java,Swing,Jcomponent,为了在设置Swing组件(JPanel、JLabel等)的大小时节省一些时间,我尝试编写一个方法,在调用该方法时,将使用3个标准大小定义函数来设置该组件的大小 我希望能够做到这一点: import CustomComponents; ... JPanel xPanel = new JPanel(); CSize.setDefiniteSize(xPanel, 400, 300); ... 或(最好是) 这是我到目前为止的代码。问题是,我希望该方法对所有类型的Swing组件都有效,而且它似乎

为了在设置Swing组件(JPanel、JLabel等)的大小时节省一些时间,我尝试编写一个方法,在调用该方法时,将使用3个标准大小定义函数来设置该组件的大小

我希望能够做到这一点:

import CustomComponents;
...
 JPanel xPanel = new JPanel();
 CSize.setDefiniteSize(xPanel, 400, 300);
...
或(最好是)

这是我到目前为止的代码。问题是,我希望该方法对所有类型的Swing组件都有效,而且它似乎只对我在标题中指定的组件有效

package CustomComponents;
import javax.swing.JComponent;
import java.awt.Dimension;

public class CSize
{
public static void setDefiniteSize(JComponent c, int h, int w)
{
    Dimension k = new Dimension (h, w);
    c.setMaximumSize(k);
    c.setMinimumSize(k);
    c.setPreferredSize(k);
}
}

如您所见,我在这里尝试使用JComponent,但它不起作用,因为我使用它的任何东西——比如JPanel——都是JPanel,而不是JComponent(即使它是一个子类?我仍然不知道它是如何工作的)

您必须使用
java.awt.Container
,因为JFrame不是
JComponent
的直接子类

因此,它应该使用以下代码:

package CustomComponents;

import java.awt.Container;
import java.awt.Dimension;

public class CSize {
    public static void setDefiniteSize(Container c, int h, int w) {
        Dimension k = new Dimension (h, w);
        c.setMaximumSize(k);
        c.setMinimumSize(k);
        c.setPreferredSize(k);
    }
}
查看组件的层次结构:

java.awt.Component
  |--java.awt.Container
       |--java.awt.Window
       |    |--java.awt.Frame
       |         |--javax.swing.JFrame
       |--javax.swing.JComponent
            |--javax.swing.JLabel

更好的方法是使用
java.awt.Component
,因为这个类定义了您想要使用的所有方法(,和)。

尽管您试图做的事情,您可能认为是狡猾的,但您可能会发现,稍后会阻止尝试调整所有内容的大小

看到这条线了吗

相反,你应该利用LayoutManager。和
.pack()
框架。Swing用于LayoutManager。您需要考虑到,您的程序在开发屏幕上可能看起来不错,但在其他屏幕上可能会有所不同。你还将发现,许多员工甚至不尊重你喜欢的尺码,所以你需要了解哪些人喜欢,哪些人不喜欢。这里有一个

使用布局管理器,您可以让布局为您完成所有大小调整。有些布局会拉伸组件,有些布局会将组件放在开放空间的中心。如果你使用它们,你的程序将会更加流畅


有关如何使用它们的更多详细信息,请参阅。

能否发布准确的错误/异常?CustomComponents.CSize类中的方法setDefiniteSize无法应用于给定类型;必需:javax.swing.JComponent、init、init;找到:javax.swing.JFrame.int,int;原因:实际参数javax.swing.JFrame无法通过方法调用转换为javax.swing.JComponent。转换
JFrame
不是
JComponent
@Scott:布局是正确的选择;不要这样做。谢谢你的解释!我没有跳出框框进行思考,所以我只想解释组件如何适合其层次结构。但这是值得一提的一点!
java.awt.Component
  |--java.awt.Container
       |--java.awt.Window
       |    |--java.awt.Frame
       |         |--javax.swing.JFrame
       |--javax.swing.JComponent
            |--javax.swing.JLabel