Java 简单自定义Swing JComponent始终为平面
我只是在玩Swing,我正在开发一个非常简单的Swing组件。我有一个继承自JComponent类的组件,其UI继承自ComponentUI。绘制方法如下所示: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 =
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
多愁善感的。我从剪贴板粘贴代码时忘记删除它。谢谢,原因是:缺少首选大小。谢谢,原因是:缺少首选大小。