【问题标题】:Creating a method to handle all Types of Swing Components创建一个方法来处理所有类型的 Swing 组件
【发布时间】:2014-02-19 10:17:46
【问题描述】:

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

我希望能够做到这一点:

import CustomComponents;
...
 JPanel xPanel = new JPanel();
 CSize.setDefiniteSize(xPanel, 400, 300);
...

或者(最好)

...
 JPanel xPanel = new JPanel();
 xPanel.CSize.setDefiniteSize(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(即使它是一个子类?我仍然没有'不知道它是如何工作的)

【问题讨论】:

  • 你能发布一个确切的错误/异常吗?
  • CustomComponents.CSize 类中的方法 setDefiniteSize 不能应用于给定类型;必需:javax.swing.JComponent,init,init;找到:javax.swing.JFrame.int,int;原因:实参javax.swing.JFrame无法通过方法调用转换为javax.swing.JComponent
  • JFrame 不是 JComponent

标签: java swing jcomponent


【解决方案1】:

你必须使用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 会更好,因为该类定义了您要使用的所有方法(setMinimumSizesetMaximumSizesetPreferredSize)。

【讨论】:

  • 感谢您的解释!我没有跳出框框思考,所以我只想解释组件如何适应它们的层次结构。但值得一提!
【解决方案2】:

虽然您正在尝试做的事情,您可能认为很狡猾,但您稍后可能会发现尝试调整所有内容的大小会令人沮丧

看到这个帖子Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?

相反,您应该使用 LayoutManagers。和.pack() 框架。 Swing 与 LayoutManager 一起使用。您需要考虑到您的程序在开发屏幕上可能看起来不错,但在其他屏幕上可能看起来不同。您还会发现许多 LayoutManegers 甚至不会尊重您的首选尺寸,因此您需要了解哪些可以,哪些不可以。这是simple example

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

有关如何使用它们的更多详细信息,请参阅Laying out Components Within a Container

【讨论】:

  • @Scott:布局是正确的选择;不要做this
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-09
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
相关资源
最近更新 更多