/* * Copyright (C) 2015 Jack Jiang(cngeeker.com) The DroidUIBuilder Project. * All rights reserved. * Project URL:https://github.com/JackJiang2011/DroidUIBuilder * Version 1.0 * * Jack Jiang PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * * Desing$CodeSwitcherPane.java at 2015-2-6 16:12:02, original version by Jack Jiang. * You can contact author with [email protected]. */ package org.droiddraw.gui; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Stroke; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.AbstractButton; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JToggleButton; import org.jb2011.lnf.beautyeye.utils.BEUtils; public abstract class Desing$CodeSwitcherPane extends JPanel { private JToggleButton btnLeft = null; private JToggleButton btnRight = null; private MouseListener btnCursorListener = null; private BtnPane btnPane = null; public Desing$CodeSwitcherPane() { initGUI(); initListeners(); initDefaultselected(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); // ==== 说明:以下装饰的高度与this.getBorder().getInsets().top的值是一致的 // ==== 哦(目前是5),也就是说border的top高度至少应为5,否则装 饰将画不完全哦 //------------------------------------------------------------------------------ START // 水平虚线 Stroke oldStroke = ((Graphics2D)g).getStroke(); Stroke sroke = new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[]{2, 2}, 0);//实线,空白 ((Graphics2D)g).setStroke(sroke); Color oldColor = g.getColor(); g.setColor(new Color(162,162,162));//new Color(235,235,235));////239,239,239)); g.drawLine(0, 4, this.getWidth(), 4); g.setColor(oldColor); ((Graphics2D)g).setStroke(oldStroke); //-------------------------------------------------------------------- Color c = new Color(237,84,16); g.setColor(c); int w = this.getWidth(); // 先填充一个装饰3角形(用于在UI上提示用户它被选中了) // x2,y2 // //x1,y1 x3,y3 final int tW = 7,tH = 3; final int DECORATED_UNDERLINE_HEIGHT = 2; int x1 = w/2 - tW/2; int y1 = DECORATED_UNDERLINE_HEIGHT+1; int x2 = w/2; int y2 = DECORATED_UNDERLINE_HEIGHT+1 - tH; int x3 = w /2 + tW/2; int y3 = DECORATED_UNDERLINE_HEIGHT+1; //反走样 BEUtils.setAntiAliasing((Graphics2D)g, true); BEUtils.fillTriangle(g, x1, y1, x2, y2, x3, y3, c); BEUtils.setAntiAliasing((Graphics2D)g, false); // 再填充一个底线(用于装饰) final int BTTOM_LINE_WIDTH = 72; g.fillRect(w/2-BTTOM_LINE_WIDTH/2 - 1,DECORATED_UNDERLINE_HEIGHT+1 , BTTOM_LINE_WIDTH, DECORATED_UNDERLINE_HEIGHT);//h); // g.fillRect(0,DECORATED_UNDERLINE_HEIGHT+1 // , w, DECORATED_UNDERLINE_HEIGHT);//h); //------------------------------------------------------------------------------ END } private void initGUI() { // 实例化按钮 ButtonGroup bg = new ButtonGroup(); btnLeft = new JToggleButton(""); btnRight = new JToggleButton(""); btnLeft.setContentAreaFilled(false); btnLeft.setFocusable(false); btnLeft.setBorder(null); btnLeft.setPreferredSize(new Dimension(64,25)); btnRight.setContentAreaFilled(false); btnRight.setFocusable(false); btnRight.setBorder(null); btnRight.setPreferredSize(new Dimension(64,25)); // 加入到ButtonGroup(实现RadioButton的形为) bg.add(btnLeft); bg.add(btnRight); // 主面板布局 FlowLayout mainLayout = new FlowLayout(FlowLayout.CENTER); mainLayout.setHgap(0); mainLayout.setVgap(2); this.setLayout(mainLayout); // 此处的border的设置是为了背景上部的装饰而做哦 this.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0)); // 实例化按钮面板 btnPane = new BtnPane(); btnPane.add(btnLeft); btnPane.add(btnRight); // 添加到总体布局中 this.add(btnPane); } private void initListeners() { // 移动光标到组件上时更改光标为“手形”,移出时还原默认 btnCursorListener = new MouseAdapter(){ public void mouseEntered(MouseEvent e) { ((JComponent)e.getSource()).setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); } public void mouseExited(MouseEvent e) { ((JComponent)e.getSource()).setCursor(Cursor.getDefaultCursor()); } }; btnLeft.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { // 切换父面板的背景按钮 btnPane.switchToLeft(); // 处理额外事情 fireLeftSelected(); // 按钮即使处于ButtonGroup里(形成RadioButton的形为),它在处于被选中状态 // 后,再次点击它依然像正常状态一样触发事件,所以以下代码目的就是要解决:当 // 该按已经处理选中状态后,就不要让它能再次被点击了,否则重复这样的事件岂不浪费必能吗 // 说明:单纯的通过判断isSelected()是无效的,因为达到此处代码时,它已经是selected==true了 btnLeft.setEnabled(false); btnRight.setEnabled(true); // 手形光标的事件处理 btnLeft.removeMouseListener(btnCursorListener); btnRight.addMouseListener(btnCursorListener); } }); btnRight.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { // 切换父面板的背景按钮 btnPane.switchToRight(); // 处理额外事情 fireRightSelected(); // 按钮即使处于ButtonGroup里(形成RadioButton的形为),它在处于被选中状态 // 后,再次点击它依然像正常状态一样触发事件,所以以下代码目的就是要解决:当 // 该按已经处理选中状态后,就不要让它能再次被点击了,否则重复这样的事件岂不浪费必能吗 // 说明:单纯的通过判断isSelected()是无效的,因为达到此处代码时,它已经是selected==true了 btnLeft.setEnabled(true); btnRight.setEnabled(false); // 手形光标的事件处理 btnRight.removeMouseListener(btnCursorListener); btnLeft.addMouseListener(btnCursorListener); } }); } /** * 本方法将指明本面板在首次实例化时默认设置哪个按钮为选中状态(即点击状态). * * <p>本类中默认选中的是左按钮. * * @see AbstractButton#doClick() * */ protected void initDefaultselected() { btnLeft.doClick(); } /** * 当切换到左按钮时本方法将自动被调用.本方法默认什么也不做. * * <p>子类应实现本方法,以便处理自定义的业务需求——比如切换到一个新面板. */ protected abstract void fireLeftSelected(); /** * 当切换到右按钮时本方法将自动被调用..本方法默认什么也不做. * * <p>子类应实现本方法,以便处理自定义的业务需求——比如切换到一个新面板. */ protected abstract void fireRightSelected(); //------------------------------------------------------------------------------------ 按钮面板实现类 private enum BtnPaneStatus { left, right } private class BtnPane extends JPanel { private BtnPaneStatus status = BtnPaneStatus.left; public BtnPane() { FlowLayout btnPaneLayout = new FlowLayout(FlowLayout.CENTER); btnPaneLayout.setHgap(0); btnPaneLayout.setVgap(0); this.setLayout(btnPaneLayout); this.setPreferredSize(new Dimension(129,25)); } /** * 根据左右状态来决定面板的背景图片. * * @return */ private ImageIcon getBgImage() { if(status == BtnPaneStatus.left) return org.droiddraw.resource.IconFactory.getInstance().getDAndCPane_Icon_left(); else return org.droiddraw.resource.IconFactory.getInstance().getDAndCPane_Icon_right(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); ImageIcon bgIcon = getBgImage(); g.drawImage(bgIcon.getImage(), 0, 0, bgIcon.getIconWidth(),bgIcon.getIconHeight(), null); } public void switchToLeft() { this.status = BtnPaneStatus.left; this.repaint(); } public void switchToRight() { this.status = BtnPaneStatus.right; this.repaint(); } } // public static void main(String[] args) // { // JFrame frame = new JFrame("TTTTTTTTTTT"); // frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // // frame.getContentPane().add(new Desing$CodeSwitcherPane(){ // @Override // protected void fireLeftSelected() // { // System.out.println("切换到左边了哦!"); // } // // @Override // protected void fireRightSelected() // { // System.out.println("切换到右边了哦!"); // } // }, BorderLayout.SOUTH); // frame.setSize(1000, 715); // frame.setLocationRelativeTo(null); // frame.setVisible(true); // } }