<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    奇怪的paintComponent()

      paintComponent定義在JComponent中,這個(gè)類是所有非窗口Swing組件的超類,只要窗口需要重新繪圖,事件處理器就會(huì)通告組件,從而引發(fā)執(zhí)行所有組件的paintComponent方法。一定不要自己調(diào)用paintComponent方法。--摘自《Java核心技術(shù)》 

    以下是部份源碼:

    protected void paintComponent(Graphics g) {
               
    //注意這里
    // super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;

            
    //draw all rectangles
            for (Rectangle2D rect : squares) {
                g2.draw(rect);
            }

    }

     
    public void add(Point2D p) {
            
    double x = p.getX();
            
    double y = p.getY();

            current 
    = new Rectangle2D.Double(
                    x 
    - SIDELENGTH / 2,
                    y 
    - SIDELENGTH / 2,
                    SIDELENGTH,
                    SIDELENGTH);
            squares.add(current);
            repaint();
    }

      
    public void remove(Rectangle2D p) {
            
    if (p == null{
                
    return;
            }

            
    if (p == current) {
                current 
    = null;
            }

            squares.remove(p);
            repaint();
        }

        
    private static final int SIDELENGTH = 10;
        
    private ArrayList<Rectangle2D> squares;
    private Rectangle2D current;

    當(dāng)鼠標(biāo)單擊panel的時(shí)候,就會(huì)調(diào)用add方法,Panel面板上立刻出現(xiàn)了一個(gè)小方塊。當(dāng)鼠標(biāo)在小方塊上雙擊的時(shí)候,就會(huì)調(diào)用remove方法,但是Panel面板上的小方塊并不能立刻消失,必須將整個(gè)面板最小化,或者改變面板大小的時(shí)候,面板上的小方塊才會(huì)消失。也就是說,remove方法中repaint()并沒有立刻生效。

    然而把 super.paintComponent(g)前的//去掉之后不管是addremove中調(diào)用repaint()都立刻生效。

    JComponent中的paintComponent方法:

    protected void paintComponent(Graphics g) {
            
    if (ui != null{
                Graphics scratchGraphics 
    = (g == null? null : g.create();
                
    try {
                    ui.update(scratchGraphics, 
    this);
                }

                
    finally {
                    scratchGraphics.dispose();
                }

            }

    }

       
    protected transient ComponentUI ui;

    是什么原因?qū)е聢?zhí)行了上面一段代碼之后,面板就可以立即更新了呢?難道跟dispose釋放資源有關(guān)?



    好好活著,因?yàn)槲覀儠?huì)死的很久!

    posted on 2008-08-14 17:18 RaviLi 閱讀(3859) 評(píng)論(3)  編輯  收藏 所屬分類: Java相關(guān)

    評(píng)論

    # re: 奇怪的paintComponent() 2008-08-14 19:44 Matthew Chen  回復(fù)  更多評(píng)論   

    remove(Rectangle2D r)的參數(shù)是如何獲得的?是通過點(diǎn)擊生成的吧,這個(gè)能夠和List里面的匹配嗎?用==看起來怪怪的,是不是該用equals,代碼不夠全,看不透。

    # re: 奇怪的paintComponent() 2008-08-14 21:19 zht  回復(fù)  更多評(píng)論   

    super.paintComponent(g);的作用就是清除以前繪制的內(nèi)容,實(shí)際上就是使用backgroundcolor,fill一下整個(gè)區(qū)域,如果不調(diào)用這個(gè)的話自然不會(huì)清除。
    而當(dāng)最小化又最大化的時(shí)候,我理解的是,會(huì)根據(jù)層次結(jié)構(gòu)由paintmanger負(fù)責(zé)重畫所有的界面,就相當(dāng)于整個(gè)界面都是新的,自然會(huì)清除掉以前繪制的內(nèi)容

    # re: 奇怪的paintComponent() 2008-08-15 22:46 千里冰封  回復(fù)  更多評(píng)論   

    你把它改成paint就知道了

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲国产综合精品中文字幕| 日木av无码专区亚洲av毛片| 成人a毛片免费视频观看| 亚洲乱亚洲乱妇无码麻豆| 24小时日本电影免费看| 美女被爆羞羞网站在免费观看| 国产亚洲一区二区在线观看| 久久久高清免费视频| 新最免费影视大全在线播放| 色婷婷亚洲十月十月色天| 永久久久免费浮力影院| 免费国产成人午夜在线观看| 亚洲日本乱码卡2卡3卡新区| 中文字幕亚洲综合久久菠萝蜜 | 毛片a级毛片免费观看品善网| 一级日本高清视频免费观看| 亚洲成在人线中文字幕| 中文字幕专区在线亚洲| 成人性生交大片免费看午夜a| 国产免费无码一区二区| 亚洲爆乳成av人在线视菜奈实| 久久久久亚洲AV无码专区首| 亚洲av午夜成人片精品电影| 免费毛片a在线观看67194| 中文字幕无码毛片免费看| 精品久久久久亚洲| 亚洲成a人片在线不卡| 亚洲影院在线观看| 国产精品亚洲综合专区片高清久久久| 四虎成人精品一区二区免费网站 | 国产国拍精品亚洲AV片 | 亚洲伦理一二三四| 国产成人无码综合亚洲日韩| 免费一看一级毛片人| 成人A级毛片免费观看AV网站| 99久久99热精品免费观看国产| 二区久久国产乱子伦免费精品| 野花视频在线官网免费1| 亚洲日产乱码一二三区别| 亚洲日韩乱码久久久久久| 亚洲AV人无码综合在线观看|