有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java paintComponent重写以在面板上绘制

这是一个很难回答的问题。 我们在课堂上学习小程序,我自己也在尝试一些东西

下面是代码

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);
}
}

我无法理解其中的区别。为什么相同的代码在本例中有效,而在前一例中无效

多谢各位


共 (1) 个答案

  1. # 1 楼答案

    controls类中重写public Dimension getPreferredSize()(并返回一个new Dimension)。将组件放入WEST时,宽度将由preferredSize确定。如果不重写getPreferredSize,首选大小将为0。计算完WEST后,CENTER将占用剩余的空间。第二种情况之所以有效,是因为它位于默认BorderLayoutCENTER