首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单的自定义Swing JComponent始终是平面的

简单的自定义Swing JComponent始终是平面的
EN

Stack Overflow用户
提问于 2011-09-13 22:06:57
回答 2查看 578关注 0票数 1

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

代码语言:javascript
复制
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);
}

但是完全不可能得到1以外的r.height值。组件是给定的宽度,但高度总是只有一个点。还有没有其他人有类似组件的经验?不幸的是,没有任何简单的教程。所有的教程都是难以理解、复杂(或过时)的。

似乎,布局管理器总是将此组件的大小调整为1高(与最小值无关)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-13 22:31:41

永远不要在绘制方法中调用setBound()。这是布局管理器的工作,而不是你的绘图代码。

我猜主要的问题(除了Heisenbug的观点)是你没有给你的组件一个大小。这是通过重写getPreferredSize()返回适合您的组件的大小来实现的。

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

票数 5
EN

Stack Overflow用户

发布于 2011-09-13 22:14:52

您的代码有几个问题:

关于扩展JComponent的类有什么问题:

  1. public void paint(Graphics g, JComponent c) {}

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

  • 您应该重写paintComponent(Graphics g)方法而不是paint。

  • 由于您正在扩展需要首先在重写的paintComponent方法中调用JComponent的super.paintComponent(g):

public class JPanelExtended{ public void paintComponent(Graphics g){ super.paintComponent(g); ... } }

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

代码语言:javascript
复制
public void paint(Graphics g, JComponent c) {
    super.paint(g,c);
}

EDIT:一个小建议:当你想覆盖一个方法时,把@override符号放在签名之前是非常有用的:

代码语言:javascript
复制
@Override
public void superMethodToBeOverridden(){}

这样,在您定义新方法而不是覆盖现有方法的情况下,编译器会通知您一条错误消息。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7403215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档