首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Paint问题

Java Paint问题
EN

Stack Overflow用户
提问于 2011-02-12 05:29:31
回答 2查看 688关注 0票数 0

好吧,我想知道为什么下面的代码不能显示JLabel。

可以正确地将MyPanel添加到JFrame和所有内容中,因为它会显示所有内容,但不会绘制JLabel。任何帮助都是非常感谢的。

代码语言:javascript
复制
public class MyPanel extends JPanel {
  private Root root;
  ...

  public void paintComponent(Graphics g)
  {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    root.paint(g2); 
  }
}

class Root {
  private Node1 node1;

  ...
  public void paint(Graphics g) {
    node1.paint(g);
  }
}

class Node1 {
  ...
  public void paint(Graphics g) {
    JLabel jtp = new JLabel();
    jtp.setLocation((int) x, (int) y);
    jtp.setSize((int) width, (int) height);
    jtp.setLocation(40, 40);
    jtp.setSize(40, 40);
    jtp.setText("Hello world");
    //jtp.setVisible(true);
    jtp.paint(g);
  }
}
EN

回答 2

Stack Overflow用户

发布于 2011-02-12 05:37:11

我建议您不要在paint方法中添加组件到容器中,因为1)您不能绝对控制何时调用paint方法,以及2) paint和paintComponent必须尽可能快,并且这不是更新图形用户界面的时间或地点。3)由于paint经常被调用多次,因此您将多次将组件添加到您的容器中,并且所有组件都不受直接控制。

此外,当您在paint方法中将组件添加到根(不管根是什么,因为它没有扩展JComponent、JPanel或类似的对象)时,根对象永远不会添加到我能告诉您的任何其他内容中,所以没有任何“添加”到最终没有添加到顶级窗口的组件将是可见的。

结论:我认为你需要重新设计图形用户界面作为你的解决方案。如果你告诉我们更多关于它的信息,我们可以帮助你。接下来,我们需要讨论布局管理器的使用,以及为什么设置组件的绝对位置和大小通常是不受欢迎的。

如果我说的任何事情令人困惑,请要求澄清,或者如果有任何错误,请帮助我纠正它!

票数 3
EN

Stack Overflow用户

发布于 2011-02-12 07:21:47

不应在paint方法内创建JLabel,而应在初始化MyPanel时创建一次。您的label是节点的渲染器组件,原则上这是一件好事。你可以看看JTable,JList,JTree的渲染器是如何工作的。

在您的例子中,不要设置标签的位置(它不会改变任何东西,因为它的paint-method希望它的图形对象由它自己的左上角确定方向),而是转换Graphics-context:

代码语言:javascript
复制
 Graphics copy = g.create((int)x, (int)y, (int)width, (int)height);
 jtp.paint(copy);

(Graphics2D也有一些更奇特的方法来移动、旋转、缩放上下文。)

除此之外,我看不出有什么问题。通过在其中放置一些System.out.println()来确保您的Node1.paint()方法被实际调用。

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

https://stackoverflow.com/questions/4974268

复制
相关文章

相似问题

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