【问题标题】:paintComponent overriding to draw on a panel覆盖在面板上绘制的paintComponent
【发布时间】:2014-11-21 16:08:56
【问题描述】:

这是一个菜鸟问题。 我们在课堂上学习小程序,而我正在自己尝试一些东西。

以下是代码

import java.awt.*;
import javax.swing.*;


class controls extends JPanel{

@Override public void paintComponent(Graphics g) {
    g.drawOval(50, 50, 50, 50); // <-- draws an oval on the panel
}

}

 public class test extends JApplet{
public void init(){
    final JPanel stage = new JPanel();
    final JPanel controlPanel = new controls();
    final JPanel banner = new JPanel();
    final JLabel name = new JLabel("Test", JLabel.CENTER);
    this.setLayout(new BorderLayout());
    banner.setBackground(Color.CYAN);
    banner.add(name);
    this.add(controlPanel, BorderLayout.WEST);
    this.add(banner, BorderLayout.NORTH);
}
}

据我了解,paintComponent() 不需要显式调用。 控件类单独使用时效果很好。

我的意思是下面的代码有效。

public class test extends JApplet{
public void init(){
    JPanel controlPanel = new controls();
    this.add(controlPanel);
}
}

我无法理解其中的区别。为什么相同的代码在这种情况下有效,而不是在以前的情况下?

谢谢。

【问题讨论】:

  • 我不确定我是否遵循。哪些代码有效,哪些无效?当您运行不起作用的代码时会发生什么?
  • @MichaelMyers:没有布局的代码有效。具有布局的显示横幅面板,但不显示我在测试类中创建的对象的控制面板。

标签: java swing applet japplet


【解决方案1】:

controls 类中覆盖public Dimension getPreferredSize()(并返回new Dimension)。将组件放入WEST 时,宽度将由preferredSize 确定。如果您不覆盖getPreferredSize,则首选大小将为0。CENTER 将占用其余空间,在计算WEST 等之后。第二种情况有效,因为它位于默认BorderLayoutCENTER

【讨论】:

  • 我在控件类中添加了public Dimension getPreferredSize(){ return new Dimension(50,50); }。但它仍然没有渲染面板。我做错了吗?
  • 试试100。无法弄清楚为什么 50 行不通
  • 哦,那是因为你画的圆圈的位置。如果面板的大小为 50,并且您从 50 开始绘制,则圆圈将超出面板的大小。如果您在0, 0, 50, 50 绘图,您可以使用50, 50。但是您应该使面板的大小与您希望整个绘图表面一样大
猜你喜欢
  • 1970-01-01
  • 2018-02-16
  • 2019-07-28
  • 2018-03-18
  • 2021-04-14
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多