【问题标题】:Simple custom Swing JComponent always flat简单的自定义 Swing JComponent 总是扁平的
【发布时间】:2011-11-16 05:20:04
【问题描述】:

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

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 高度(无论最小值)。

【问题讨论】:

  • 您真的想为您的组件提供 UI 还是只需要覆盖 JComponent.paintComponent(Graphics)?在许多情况下,不会为特定组件创建 UI,因为这是额外的工作。
  • 这是一个有教育意义的例子。所以我以这种高级的方式来做。 c.setBounds(x, y, 100, 25); 这一行是多余的。从剪贴板粘贴代码时忘记删除它。

标签: java swing paint jcomponent paintcomponent


【解决方案1】:

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

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

阅读 Custom Painting 上的 Swing 教程部分,了解更多信息和工作示例。

【讨论】:

  • 谢谢,原因是:缺少首选尺寸。
【解决方案2】:

你的代码有几个问题:

扩展JComponent的类有什么关系:

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

    不是一个有效的签名,所以你没有覆盖方法paint,而是创建一个新的paint方法。

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

  3. 因为您正在扩展一个 JComponent,所以您需要首先在重写的 paintComponent 方法中调用 super.paintComponent(g):

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

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

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

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

@Override
public void superMethodToBeOverridden(){}

如果您定义了一个新方法而不是覆盖现有方法,编译器将通过这种方式通知您一条错误消息。

【讨论】:

  • 您的观点不正确:OP 谈论的是他已覆盖的 ComponentUI.paint(Graphics, JComponent),而不是 JComponent.paint(Graphics)
  • @jfpoilpret:你是对的。无论如何,paint 中对 super 方法的调用仍然有效。我会修正我的答案。谢谢
  • 好的,我明白了。调用超级方法是标准。然而,正确的原因是缺少首选尺寸。
猜你喜欢
  • 2014-06-22
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 2011-05-09
相关资源
最近更新 更多