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

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

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

    奇怪的paintComponent()

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

    以下是部份源碼:

    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;

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

    然而把 super.paintComponent(g)前的//去掉之后不管是addremove中調用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;

    是什么原因導致執行了上面一段代碼之后,面板就可以立即更新了呢?難道跟dispose釋放資源有關?



    好好活著,因為我們會死的很久!

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

    評論

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

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

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

    super.paintComponent(g);的作用就是清除以前繪制的內容,實際上就是使用backgroundcolor,fill一下整個區域,如果不調用這個的話自然不會清除。
    而當最小化又最大化的時候,我理解的是,會根據層次結構由paintmanger負責重畫所有的界面,就相當于整個界面都是新的,自然會清除掉以前繪制的內容

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

    你把它改成paint就知道了

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲va在线va天堂va手机| 国产亚洲精品自在线观看| 亚洲精品亚洲人成在线麻豆| 国产婷婷成人久久Av免费高清| 亚洲日韩在线观看| 一级**爱片免费视频| 亚洲综合区小说区激情区| 国产黄在线播放免费观看| 亚洲欧洲国产成人综合在线观看| 思思久久99热免费精品6| 2022中文字字幕久亚洲| 在线看片免费人成视频久网下载| 亚洲情综合五月天| 在线观看肉片AV网站免费| 久久精品国产亚洲AV果冻传媒| 午夜免费啪视频在线观看| 亚洲成aⅴ人在线观看| 在线观看免费污视频| 深夜免费在线视频| 久久亚洲精品中文字幕三区| 91大神免费观看| 亚洲精品av无码喷奶水糖心| 一本色道久久88综合亚洲精品高清| 日本高清免费中文在线看| 无码久久精品国产亚洲Av影片| www.999精品视频观看免费| 国产精品亚洲专区无码牛牛| 亚洲午夜无码久久久久| 免费播放一区二区三区| 亚洲毛片基地4455ww| 亚洲AⅤ永久无码精品AA| 最新国产乱人伦偷精品免费网站 | 免费精品国产自产拍在线观看图片| 亚洲男人天堂2022| 亚洲国产精品无码久久青草| 亚洲国产精品免费视频| 亚洲色最新高清av网站| 国产亚洲日韩一区二区三区| 91精品国产免费久久久久久青草| 亚洲AV成人片无码网站| 亚洲人成人无码网www电影首页|