这个方法只有定义,没有调用,为什么会执行了呢?

wokaoyan1981 2017-10-28 07:21:16
大家好,我从书上copy了一个绘制饼图的程序,也得到了理想的结果。但是有个问题百思不得其解。PiePanel这个类里面定义了一个名为paintComponent(Graphics comp)的方法,这个方法名没有在其他地方被调用,照理说方法里的内容不会执行的,可是运行后得到了饼图,说明这个方法已经执行了。这是为什么呢?请大佬赐教!代码如下:
package com.java24hours;

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

public class PiePanel extends JPanel{
private PieSlice[] slice;
private int current=0;
private float totalSize=0;
private Color background;

public PiePanel(int sliceCount){
slice=new PieSlice[sliceCount];
background=getBackground();
}

public void addSlice(Color sColor, float sSize){
if(current<=slice.length){
slice[current]=new PieSlice(sColor,sSize);
totalSize+=sSize;
current++;
}
}

public void paintComponent(Graphics comp){
super.paintComponent(comp);
Graphics2D comp2D=(Graphics2D) comp;
int width=getSize().width-10;
int height=getSize().height-15;
int xInset=5;
int yInset=5;
if(width<5){
xInset=width;
}
if(height<5){
yInset=height;
}
comp2D.setColor(background);
comp2D.fillRect(0,0,getSize().width,getSize().height);
comp2D.setColor(Color.lightGray);
Ellipse2D.Float pie=new Ellipse2D.Float(
xInset,yInset,width,height);
comp2D.fill(pie);
float start=0;
for(int i=0;i<slice.length;i++){
float extent=slice[i].size*360F/totalSize;
comp2D.setColor(slice[i].color);
Arc2D.Float drawSlice=new Arc2D.Float(
xInset,yInset,width,height,start,extent,
Arc2D.Float.PIE);
start+=extent;
comp2D.fill(drawSlice);
}
}
}

class PieSlice{
Color color=Color.lightGray;
float size=0;

PieSlice(Color pColor,float pSize){
color = pColor;
size=pSize;
}

}


package com.java24hours;

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

public class PieFrame extends JFrame{
Color uneasyBeingGreen=new Color(0xCC,0xCC,0x99);
Color zuzusPetals=new Color(0xCC,0x66,0xFF);
Color zootSuit=new Color(0x66,0x66,0x99);
Color sweetHomeAvocado=new Color(0x66,0x99,0x66);
Color shrinkingViolet=new Color(0x66,0x66,0x99);
Color miamiNice=new Color(0x33,0xFF,0xFF);
Color inBetweenGreen=new Color(0x00,0x99,0x66);
Color norwegianBlue=new Color(0x33,0xCC,0xCC);
Color purpleRain=new Color(0x66,0x33,0x99);
Color freckle=new Color(0x99,0x66,0x33);

public PieFrame(){
super("Pie Graph");
setLookAndFeel();
setSize(320,290);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);

PiePanel pie=new PiePanel(10);
pie.addSlice(uneasyBeingGreen,1350);
pie.addSlice(zuzusPetals, 1221);
pie.addSlice(zootSuit, 316);
pie.addSlice(sweetHomeAvocado, 251);
pie.addSlice(shrinkingViolet,201);
pie.addSlice(miamiNice,193);
pie.addSlice(inBetweenGreen, 173);
pie.addSlice(norwegianBlue, 164);
pie.addSlice(purpleRain, 143);
pie.addSlice(freckle, 127);
add(pie);
}

private void setLookAndFeel(){
try{
UIManager.setLookAndFeel(
"com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"
);
}catch (Exception exc){
//ignore error
}
}

public static void main(String[] arguments){
PieFrame pf=new PieFrame();
}
}
...全文
311 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
wokaoyan1981 2017-11-02
  • 打赏
  • 举报
回复
感谢楼上解答。
110成成 2017-10-30
  • 打赏
  • 举报
回复
一般窗体绘制或者窗体刷新以及改变大小等操作都会默认执行paintComponent 方法。

51,410

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧