Java 简单自定义Swing JComponent始终为平面

Java 简单自定义Swing JComponent始终为平面,java,swing,paint,jcomponent,paintcomponent,Java,Swing,Paint,Jcomponent,Paintcomponent,我只是在玩Swing,我正在开发一个非常简单的Swing组件。我有一个继承自JComponent类的组件,其UI继承自ComponentUI。绘制方法如下所示: public void paint(Graphics g, JComponent c) { int x = c.getX(); int y = c.getY(); c.setBounds(x, y, 100, 25); int width = c.getWidth(); int height =

我只是在玩Swing,我正在开发一个非常简单的Swing组件。我有一个继承自JComponent类的组件,其UI继承自ComponentUI。绘制方法如下所示:

public void paint(Graphics g, JComponent c) {
    int x = c.getX();
    int y = c.getY();
    c.setBounds(x, y, 100, 25);
    int width = c.getWidth();
    int height = c.getHeight();
    Rectangle r = g.getClipBounds();
    g.fillRect(0, 0, 10, 10);
    g.drawString("Baf!", 3, 3);
}
但是,完全不可能得到另一个r.height值大于1。组件的宽度与给定值相同,但高度始终仅为一个点。还有其他人有过类似组件的经验吗?不幸的是,没有任何简单的教程。所有教程都是难以理解的、复杂的或过时的


布局管理器似乎会将此组件的大小始终调整为1高度,而不考虑最小值。

您的代码有几个问题:

对于类扩展JComponent的关注点:

公共图形g,J组件c{}

不是有效的签名,因此您不会重写方法paint,而是创建一个新的paint方法

您应该重写paintComponentGraphics方法,而不是paint方法

由于要扩展JComponent,首先需要在重写的paintComponent方法中调用super.paintComponent:

公共类JPaneLexed{ 公共空间组件图形{ 超级油漆组件; ... } }

对于类扩展ComponentUI,您甚至应该在超类上显式调用方法paint:

public void paint(Graphics g, JComponent c) {
    super.paint(g,c);
}
编辑: 有一点建议:当您想要重写一个方法时,在签名之前加上@override符号是非常有用的:

@Override
public void superMethodToBeOverridden(){}

这样,在定义新方法而不重写现有方法的情况下,编译器将向您发送错误消息

您的代码有几个问题:

对于类扩展JComponent的关注点:

公共图形g,J组件c{}

不是有效的签名,因此您不会重写方法paint,而是创建一个新的paint方法

您应该重写paintComponentGraphics方法,而不是paint方法

由于要扩展JComponent,首先需要在重写的paintComponent方法中调用super.paintComponent:

公共类JPaneLexed{ 公共空间组件图形{ 超级油漆组件; ... } }

对于类扩展ComponentUI,您甚至应该在超类上显式调用方法paint:

public void paint(Graphics g, JComponent c) {
    super.paint(g,c);
}
编辑: 有一点建议:当您想要重写一个方法时,在签名之前加上@override符号是非常有用的:

@Override
public void superMethodToBeOverridden(){}

这样,在定义新方法而不重写现有方法的情况下,编译器将向您发送错误消息

切勿在绘制方法中调用setBound。这是布局管理器的工作,而不是绘制代码

我想除了海森堡的观点之外,主要的问题是你没有给你一个组件的尺寸。这是通过覆盖getPreferredSize以返回适合组件的大小来实现的


有关更多信息和工作示例,请阅读上的Swing教程部分。

切勿在绘制方法中调用setBound。这是布局管理器的工作,而不是绘制代码

我想除了海森堡的观点之外,主要的问题是你没有给你一个组件的尺寸。这是通过覆盖getPreferredSize以返回适合组件的大小来实现的


阅读Swing教程中的部分以了解更多信息和工作示例。

您的观点不正确:OP讨论的是ComponentUI.paintGraphics,他已重写的JComponent,而不是JComponent.paintGraphics。@jfpoilpret:您是对的。无论如何,调用paint内部的super方法仍然有效。我会修正我的答案。谢谢,我理解。这是调用超级方法的标准。然而,正确的原因是缺少首选大小。您的观点不正确:OP谈论的是ComponentUI.paintGraphics,他已经覆盖的JComponent,而不是JComponent.paintGraphics。@jfpoilpret:您是对的。无论如何,调用paint内部的super方法仍然有效。我会修正我的答案。谢谢,我理解。这是调用超级方法的标准。然而,正确的原因是缺少首选大小。您真的要为组件提供UI,还是只需要覆盖JComponent.paintComponentGraphics?在许多情况下,人们不会为特定组件创建UI,因为这是额外的工作。这是一个有教育意义的例子。所以我用这种先进的方法来做。线c.setBoundsx,y,100,25;这是多余的。从剪贴板粘贴代码时,我忘记将其删除。是否确实要为组件提供UI,还是只需要覆盖JComponent.paintComponentGraphics?在许多情况下,人们不会为特定组件创建UI,因为这是额外的工作。这是一个有教育意义的例子。所以我用这种先进的方法来做。线c.setBoundsx,y,100,25;是sup
多愁善感的。我从剪贴板粘贴代码时忘记删除它。谢谢,原因是:缺少首选大小。谢谢,原因是:缺少首选大小。