JAVA Swing使用JLayer裝飾組件(個人理解,看註釋)

兩個步驟:
LayerUI layerUI = new XxxLayerUI(); //創建LayerUI對象,擴充的子類,重寫paint(Graphics g,JComponent f方法),用以實現不同的裝飾層
var layer = new JLayer(panel,layerUI);// 使用layerUI裝飾組件panel

package net.cszxxx.www;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLayer;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.plaf.LayerUI;

public class JLayerTest {
	class FirstLayerUI extends LayerUI<JComponent>{
		public void paint(Graphics g,JComponent c) {//Graphics類,我的理解是創建一張“畫布”
			super.paint(g,c);//調用父類paint方法,將組件c繪製到g畫布上
			var g2 = (Graphics2D)g.create();//g調用create方法創建Graphics2D對象
											//這個Graphics2D類擴展了Graphics類,
											//以提供對幾何、座標變換、顏色管理和文本佈局的更復雜的控制。
			g2.setComposite(AlphaComposite.  //設置  Graphics2D的上下文。 
					getInstance(AlphaComposite.SRC_OVER,.5f));
			g2.setPaint(new GradientPaint(0,0,Color.RED,//設置Graphics2D上下文的Paint屬性爲紅藍過渡色
					0,c.getHeight(),Color.BLUE));
			g2.fillRect(0, 0, c.getWidth(), c.getHeight());//繪製跟組件大小一樣的矩形
			g2.dispose();//釋放資源
		}
	}
	public void init() {
		var jf = new JFrame("LayerUI測試");
		var p = new JPanel();
		var group = new ButtonGroup();
		JRadioButton radioButton;
		
		p.add(radioButton = new JRadioButton("網購購買",true));
		group.add(radioButton);
		p.add(radioButton = new JRadioButton("書店購買"));
		group.add(radioButton);
		p.add(radioButton = new JRadioButton("圖書館借閱"));
		group.add(radioButton);
		
		p.add(new JCheckBox("測試1"));
		p.add(new JCheckBox("測試2"));
		p.add(new JCheckBox("測試3"));
		p.add(new JCheckBox("測試4"));
		
		var orderButton = new JButton("投票");
		p.add(orderButton);
		
		LayerUI<JComponent> layerUI = new FirstLayerUI();//創建layerUI對象
		var layer = new JLayer<JComponent>(p,layerUI);//使用將layerUI裝飾組件P
		
		jf.add(layer);
		jf.setSize(300,170);
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jf.setVisible(true);
	}

	public static void main(String[] args) {
		// TODO 自動生成的方法存根
		new JLayerTest().init();
	}

}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章