症状一:调用jframe的repaint()方法时为什么不会自动引发paintcomponent()方法?(不过会引发paint()方法)
症状二:引发paint()方法后,我用drawstring()方法在jframe中画字符串,不能显示,不过改变jframe的大小时会正确显示。 其实repaint()方法,好像是这样的,如果有paint()方法则调用paint()方法,没有paint()方法
而有paintcomponent()方法则调用paintcomponent()方法,下面代码就是为了测试。你可以测试有paint()方法,和注释掉 paint()方法两种情况。 import javax.swing.*; import java.awt.*; import java.awt.event.mouseadapter; import java.awt.event.mouseevent; import java.awt.graphics2d; public class testpanel extends jframe { ttt panel = new ttt(); jpanel pnlctl = new jpanel(); jbutton button = new jbutton("draw line"); jbutton button2 = new jbutton("clear all"); public testpanel() { container cp = this.getcontentpane(); cp.add(panel,borderlayout.center); button.addmouselistener(new mouseadapter(){ public void mouseclicked(mouseevent me) { graphics2d g2 = (graphics2d) panel.getgraphics(); g2.drawrect(20,20,100,300); panel.repaint(); } }); button2.addmouselistener(new mouseadapter(){ public void mouseclicked(mouseevent me) { panel.getgraphics().clearrect(0,0,700,400); } }); pnlctl.add(button); pnlctl.add(button2); cp.add(pnlctl,borderlayout.north); setsize(800,600); this.setdefaultcloseoperation(jframe.exit_on_close); this.show(); } public static void main(string[] args) { testpanel testpanel = new testpanel(); } } class ttt extends jpanel { public ttt() { super(); } public void paintcomponent(graphics g) { joptionpane.showconfirmdialog(null,"paintcomponent() called"); graphics2d g2 = (graphics2d) g; g2.drawline(10,10,300,300); } //如果要试验没有paint()的情况注释掉下面的方法 public void paint(graphics g) { joptionpane.showconfirmdialog(null,"paint() called"); graphics2d g2 = (graphics2d) g; g2.drawrect(20,20,300,300); } } |
|
来自: 软件团队头目 > 《java swing》