java 輕量級組件和重量級組件的區別


最近工作中遇到 需要把JLabel加到Canvas上去,整了半天,到最后發現JLabel總是在Canvas之下;

后問同事,原來JLabel屬於輕量級組件,而Canvas屬於重量級組件;於是乎就出現了上述情況。

輕量級組件 是用JAVA代碼畫出來的,這樣具有平台移植性
       重量級組件 是調用操作系統的函數畫出來的組件,比如主窗體
      一般來說盡量用輕量級的組件,這樣對程序的移植性很好,一般javax.swing包里的組件大部分是輕量級的java.awt里面的是重量級的。
       Swing是由100%純Java實現的,Swing組件是用Java實現的輕量級( light-weight)組件,沒有本地代碼,不依賴操作系統的支持,這是它與AWT組件的最大區別。由於AWT組件通過與具體平台相關的對等類(Peer)實現,因此Swing比AWT組件具有更強的實用性。Swing在不同的平台上表現一致,並且有能力提供本地窗口系統不支持的其它特性。

 

 

把百度知道上搜到的內容拷過來~哈哈

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Painter extends JFrame
{
private int xValue=0,yValue=0;
public Painter()
{
     super("A Simple paint program");

     getContentPane().add(new JLabel("Drag the Mouse To Paint"),"South");
     /*addMouseMotionListener(
     new MouseMotionAdapter(){
         public void mouseDragged(MouseEvent e)
   {
             xValue=e.getX();
             yValue=e.getY();
             repaint();
   }
                              }
    );*/
       setSize(300,300);
       setVisible(true);
}
/*
public void paint(Graphics g)
{
g.fillOval(xValue,yValue,4,4);
}*/
public static void main(String[] args)
{
Painter frame=new Painter();
}
}



這主要是paint(Griphics g)方法的問題
注意java.awt包和javax.swing包中的類的層次問題

java.lang.Object  ->java.awt.Component  ->java.awt.Label


java.lang.Object
->  java.awt.Component
  ->    java.awt.Container
   ->       javax.swing.JComponent
      ->        javax.swing.JLabel


而在java.awt.Component和javax.swing.JComponent都分別根據組件的清重量級定義了不同實現方式的paint方法
在你的程序中,你是在JFrame中直接進行繪畫,而JFrame屬於重量級組件,Label屬於偏重量級JLabel屬於偏輕(輕重的區別就是是否跟本地系統有太大關系)。。JFrame JWindow  JDialog 等等。。並且你繪畫的區域和你添加Label
的位置有重疊。。。諸多原因導致了無法顯示

建議:將繪畫的組件 改成JPanel。。可以多分級繪畫,也可以並列多個JPanel,然后分別添加 組件 和繪畫,不會重疊。。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com