
“主从按钮”,差不多就是跟 IE “后退” 按钮类试的东西。对于增强按钮功能有蛮大作用,比孤立的单按钮能表达更复杂的操作事件。 这里我做了一个 package 专门生成 主从按钮。写的不好的地方欢迎指正,匆忙写完,应该还有蛮多瑕疵。
发现问题,已经修正 完整代码,示例下载:http://my.nbip.net/homepage/zhouB403/MyCode/SubordinateButton.exe
======================================================================
- ==== package subbutton ====
-
-
- //SubordinateButton.java 主从按钮类
-
- /**
- * [SubordinateButton.java] 主从按钮
- *
- * 创建日期:(2003-9-4)
- * @author:ONE_Fox
- */
-
- package subbutton;
-
- import java.awt.java/awt/BorderLayout.java.html" target="_blank">BorderLayout;
- import java.awt.event.java/awt/event/MouseAdapter.java.html" target="_blank">MouseAdapter;
- import javax.swing.javax/swing/JPanel.java.html" target="_blank">JPanel;
- import javax.swing.javax/swing/JButton.java.html" target="_blank">JButton;
- import javax.swing.border.javax/swing/border/Border.java.html" target="_blank">Border;
- import javax.swing.border.javax/swing/border/BevelBorder.java.html" target="_blank">BevelBorder;
- import javax.swing.border.javax/swing/border/EmptyBorder.java.html" target="_blank">EmptyBorder;
-
-
-
- public class SubordinateButton extends javax/swing/JPanel.java.html" target="_blank">JPanel {
-
-
- /**
- * 从属按钮相对与主按钮的位置
- *
- * int UP = 1;
- * int DOWN = 2;
- * int LEFT = 3;
- * int RIGHT = 4;
- */
- public static final int UP = 1;
- public static final int DOWN = 2;
- public static final int LEFT = 3;
- public static final int RIGHT = 4;
-
- private int position = RIGHT; //默认从按钮在右边
-
-
- /**
- * 按钮三态(普通、鼠标进入、鼠标按下)默认配置
- *
- * usual 默认普通状态边框
- * mouseIn 默认鼠标进入边框
- * mousePress 默认鼠标按下边框
- */
- public static javax/swing/border/Border.java.html" target="_blank">Border usual = new javax/swing/border/EmptyBorder.java.html" target="_blank">EmptyBorder(2, 2, 2, 2);
- public static javax/swing/border/Border.java.html" target="_blank">Border mouseIn = new ThinBevelBorder(javax/swing/border/BevelBorder.java.html" target="_blank">BevelBorder.RAISED);
- public static javax/swing/border/Border.java.html" target="_blank">Border mousePress = new ThinBevelBorder(javax/swing/border/BevelBorder.java.html" target="_blank">BevelBorder.LOWERED);
-
-
- //默认鼠标事件--------------//
- private java/awt/event/MouseAdapter.java.html" target="_blank">MouseAdapter listener = null;
-
-
- /**
- * master 主按钮
- * slave 从按钮
- */
- public javax/swing/JButton.java.html" target="_blank">JButton master = null; //主按钮
- public javax/swing/JButton.java.html" target="_blank">JButton slave = null; //从按钮
-
-
-
- //------------------------------------------------------//
-
- /**
- * 构造方法 1:
- * @param master javax.swing.JButton 主按钮
- * @param slave javax.swing.JButton 从按钮
- */
- public SubordinateButton(javax/swing/JButton.java.html" target="_blank">JButton master, javax/swing/JButton.java.html" target="_blank">JButton slave) {
- this.master = master;
- this.slave = slave;
-
- listener = new DefaultMouseEvent(master ,slave);
-
- makeButton();
- }
-
-
- /**
- * 构造方法 2:
- * @param master javax.swing.JButton 主按钮
- * @param slave javax.swing.JButton 从按钮
- * @param position int 从属按钮位置
- */
- public SubordinateButton(javax/swing/JButton.java.html" target="_blank">JButton master, javax/swing/JButton.java.html" target="_blank">JButton slave, int position) {
- this(master, slave);
-
- if(position >= 1 && position <= 4)
- this.position = position;
- }
-
-
-
-
-
- //------------------------------------------------------//
-
- /**
- * 方法:按钮制作
- */
- private void makeButton() {
- setLayout(new java/awt/BorderLayout.java.html" target="_blank">BorderLayout());
-
- java/lang/String.java.html" target="_blank">String pos = position == 1? java/awt/BorderLayout.java.html" target="_blank">BorderLayout.NORTH:
- (position == 2? java/awt/BorderLayout.java.html" target="_blank">BorderLayout.SOUTH:
- (position == 3? java/awt/BorderLayout.java.html" target="_blank">BorderLayout.WEST:java/awt/BorderLayout.java.html" target="_blank">BorderLayout.EAST));
-
- add(master, java/awt/BorderLayout.java.html" target="_blank">BorderLayout.CENTER);
- add(slave, pos);
-
- setUsualBorder(usual);
-
- setListener(listener);
- }
-
-
-
-
-
-
-
- /**
- * 方法:设置普通状态边框
- */
- public void setUsualBorder(javax/swing/border/Border.java.html" target="_blank">Border usual) {
- this.usual = usual;
- master.setBorder(usual);
- slave.setBorder(usual);
- }
-
-
-
- /**
- * 方法:设置鼠标进入边框
- */
- public void setMouseInBorder(javax/swing/border/Border.java.html" target="_blank">Border mouseIn) {
- this.mouseIn = mouseIn;
- }
-
-
-
- /**
- * 方法:设置鼠标按下边框
- */
- public void setMousePressBorder(javax/swing/border/Border.java.html" target="_blank">Border mousePress) {
- this.mousePress = mousePress;
- }
-
-
-
- /**
- * 方法:设置鼠标监听
- */
- public void setListener(java/awt/event/MouseAdapter.java.html" target="_blank">MouseAdapter listener) {
- this.listener = listener;
-
- master.removeMouseListener(listener);
- slave.removeMouseListener(listener);
-
- master.addMouseListener(listener);
- slave.addMouseListener(listener);
- }
- }
-
-
- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- //DefaultMouseEvent.java 主从按钮默认事件类
-
- /**
- * [DefaultMouseEvent.java] 默认鼠标事件
- *
- * 创建日期:(2003-9-4)
- * @author:ONE_Fox
- */
-
-
- package subbutton;
-
- import java.awt.event.java/awt/event/MouseEvent.java.html" target="_blank">MouseEvent;
- import java.awt.event.java/awt/event/MouseAdapter.java.html" target="_blank">MouseAdapter;
- import javax.swing.javax/swing/JButton.java.html" target="_blank">JButton;
- import javax.swing.border.javax/swing/border/BevelBorder.java.html" target="_blank">BevelBorder;
-
-
- public class DefaultMouseEvent extends java/awt/event/MouseAdapter.java.html" target="_blank">MouseAdapter {
- private javax/swing/JButton.java.html" target="_blank">JButton master = null;
- private javax/swing/JButton.java.html" target="_blank">JButton slave = null;
-
-
-
- //-----------------------------------------------------------//
-
- /**
- * 构造方法
- * @param master javax.swing.JButton 主按钮
- * @param slave javax.swing.JButton 从按钮
- */
- public DefaultMouseEvent(javax/swing/JButton.java.html" target="_blank">JButton master, javax/swing/JButton.java.html" target="_blank">JButton slave) {
- this.master = master;
- this.slave = slave;
- }
-
-
-
-
- //-----------------------------------------------------------//
-
- /**
- * 方法:鼠标进入
- */
- public void mouseEntered(java/awt/event/MouseEvent.java.html" target="_blank">MouseEvent e) {
- master.setBorder(SubordinateButton.mouseIn);
- slave.setBorder(SubordinateButton.mouseIn);
- }
-
-
- /**
- * 方法:鼠标退出事件
- */
- public void mouseExited(java/awt/event/MouseEvent.java.html" target="_blank">MouseEvent e) {
- master.setBorder(SubordinateButton.usual);
- slave.setBorder(SubordinateButton.usual);
- }
-
-
-
- /**
- * 方法:鼠标按下事件
- */
- public void mousePressed(java/awt/event/MouseEvent.java.html" target="_blank">MouseEvent e) {
- ((javax/swing/JButton.java.html" target="_blank">JButton)e.getComponent())
- .setBorder(SubordinateButton.mousePress);
-
- //////////SomeCode////////////
- }
-
-
-
- /**
- * 方法:鼠标弹起事件
- */
- public void mouseReleased(java/awt/event/MouseEvent.java.html" target="_blank">MouseEvent e) {
- master.setBorder(SubordinateButton.mouseIn);
- slave.setBorder(SubordinateButton.mouseIn);
- }
- }
-
-
- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- //DefaultOtherBTEvent.java 为使其它按钮风格统一而备用的其它按钮默认事件类
-
- /**
- * [DefaultOtherBTEvent.java] 默认其它按钮鼠标事件
- *
- * 创建日期:(2003-9-4)
- * @author:ONE_Fox
- */
-
-
- package subbutton;
-
- import java.awt.event.java/awt/event/MouseEvent.java.html" target="_blank">MouseEvent;
- import java.awt.event.java/awt/event/MouseAdapter.java.html" target="_blank">MouseAdapter;
- import javax.swing.javax/swing/JButton.java.html" target="_blank">JButton;
- import javax.swing.border.javax/swing/border/BevelBorder.java.html" target="_blank">BevelBorder;
-
-
- public class DefaultOtherBTEvent extends java/awt/event/MouseAdapter.java.html" target="_blank">MouseAdapter {
- private javax/swing/JButton.java.html" target="_blank">JButton button = null;
-
-
-
- //--------------------------------------------------------------//
-
- /**
- * 构造方法
- * @param button javax.swing.JButton 操作的按钮
- */
- public DefaultOtherBTEvent(javax/swing/JButton.java.html" target="_blank">JButton button) {
- this.button = button;
- }
-
-
-
-
- //-------------------------------------------------------------//
-
- /**
- * 方法:鼠标进入
- */
- public void mouseEntered(java/awt/event/MouseEvent.java.html" target="_blank">MouseEvent e) {
- button.setBorder(SubordinateButton.mouseIn);
- }
-
-
- /**
- * 方法:鼠标退出事件
- */
- public void mouseExited(java/awt/event/MouseEvent.java.html" target="_blank">MouseEvent e) {
- button.setBorder(SubordinateButton.usual);
- }
-
-
-
- /**
- * 方法:鼠标按下事件
- */
- public void mousePressed(java/awt/event/MouseEvent.java.html" target="_blank">MouseEvent e) {
- button.setBorder(SubordinateButton.mousePress);
-
- //////////SomeCode////////////
- }
-
-
-
- /**
- * 方法:鼠标弹起事件
- */
- public void mouseReleased(java/awt/event/MouseEvent.java.html" target="_blank">MouseEvent e) {
- button.setBorder(SubordinateButton.mouseIn);
- }
- }
-
-
-
- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- //ThinBevelBorder.java 按钮边框类(由 zhvfeng 朋友制造)
-
- /**
- * [ThinBevelBorder.java]
- *
- * @author:zhvfeng
- *
- * 这个 ThinBevelBorder 由 zhvfeng 朋友制造,
- * 我在这里做个利用,比java默认的 BevelBorder 漂亮
- */
-
-
- package subbutton;
-
-
- import java.awt.java/awt/Color.java.html" target="_blank">Color;
- import java.awt.java/awt/Component.java.html" target="_blank">Component;
- import java.awt.java/awt/Graphics.java.html" target="_blank">Graphics;
- import java.awt.java/awt/Insets.java.html" target="_blank">Insets;
- import javax.swing.border.javax/swing/border/BevelBorder.java.html" target="_blank">BevelBorder;
-
-
- public class ThinBevelBorder extends javax/swing/border/BevelBorder.java.html" target="_blank">BevelBorder {
-
- public ThinBevelBorder(int bevelType) { super(bevelType); }
-
-
- public ThinBevelBorder(int bevelType, java/awt/Color.java.html" target="_blank">Color highlight, java/awt/Color.java.html" target="_blank">Color shadow) {
- super(bevelType, highlight, shadow);
- }
-
-
- public ThinBevelBorder(int bevelType, java/awt/Color.java.html" target="_blank">Color highlightOuterColor,
- java/awt/Color.java.html" target="_blank">Color highlightInnerColor, java/awt/Color.java.html" target="_blank">Color shadowOuterColor,
- java/awt/Color.java.html" target="_blank">Color shadowInnerColor) {
- super(bevelType, highlightOuterColor, highlightInnerColor,
- shadowOuterColor, shadowInnerColor);
- }
-
-
- protected void paintRaisedBevel(java/awt/Component.java.html" target="_blank">Component c, java/awt/Graphics.java.html" target="_blank">Graphics g, int x, int y,
- int width, int height) {
- try {
- java/awt/Color.java.html" target="_blank">Color oldColor = g.getColor();
- int h = height;
- int w = width;
- g.translate(x, y);
- g.setColor(getHighlightInnerColor(c));
- g.drawLine(0, 0, 0, h - 1);
- g.drawLine(1, 0, w - 1, 0);
- g.setColor(getShadowInnerColor(c));
- g.drawLine(1, h - 1, w - 1, h - 1);
- g.drawLine(w - 1, 1, w - 1, h - 2);
- g.translate( -x, -y);
- g.setColor(oldColor);
- } catch (java/lang/NullPointerException.java.html" target="_blank">NullPointerException e) { }
- }
-
-
- protected void paintLoweredBevel(java/awt/Component.java.html" target="_blank">Component c, java/awt/Graphics.java.html" target="_blank">Graphics g, int x, int y,
- int width, int height) {
- try {
- java/awt/Color.java.html" target="_blank">Color oldColor = g.getColor();
- int h = height;
- int w = width;
- g.translate(x, y);
- g.setColor(getShadowInnerColor(c));
- g.drawLine(0, 0, 0, h - 1);
- g.drawLine(1, 0, w - 1, 0);
- g.setColor(getHighlightOuterColor(c));
- g.drawLine(1, h - 1, w - 1, h - 1);
- g.drawLine(w - 1, 1, w - 1, h - 2);
- g.translate( -x, -y);
- g.setColor(oldColor);
- } catch (java/lang/NullPointerException.java.html" target="_blank">NullPointerException e) { }
- }
- }
-
-
- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-
- //最后一个 Test.java 测试类
-
- /**
- * [Test.java] 主从按钮测试类
- *
- *
- * 创建日期:(2003-9-4)
- * @author:ONE_Fox
- */
-
-
-
- import java.awt.*;
- import java.awt.event.*;
- import javax.swing.*;
-
- import subbutton.*;
-
-
-
- public class Test extends javax/swing/JFrame.java.html" target="_blank">JFrame {
-
- //界面组件-----------------------//
- private javax/swing/JToolBar.java.html" target="_blank">JToolBar edit = new javax/swing/JToolBar.java.html" target="_blank">JToolBar();
-
- private javax/swing/JButton.java.html" target="_blank">JButton jBtnNew = new javax/swing/JButton.java.html" target="_blank">JButton(" NEW ",new javax/swing/ImageIcon.java.html" target="_blank">ImageIcon("ICON/edit.gif"));
- private javax/swing/JButton.java.html" target="_blank">JButton jBtnMore = new javax/swing/JButton.java.html" target="_blank">JButton(">",new javax/swing/ImageIcon.java.html" target="_blank">ImageIcon("ICON/more.gif"));
- private javax/swing/JButton.java.html" target="_blank">JButton[] jBtnOther = new javax/swing/JButton.java.html" target="_blank">JButton[5];
-
- private SubordinateButton sButton = //主从按钮
- new SubordinateButton(jBtnNew, jBtnMore, SubordinateButton.RIGHT);
-
-
-
-
- /**
- * 构造方法 Test()
- */
- public Test() {
- makeFace(); //界面构造
- addListener(); //事件监听
- showFace(); //面板显示
- }
-
-
-
-
- /**
- * 面板制作
- */
- private void makeFace() {
-
- //演示按钮配置-------------------------------//
- jBtnNew.setFocusable(false);
- jBtnNew.setVerticalTextPosition(javax/swing/AbstractButton.java.html" target="_blank">AbstractButton.BOTTOM);
- jBtnNew.setHorizontalTextPosition(javax/swing/AbstractButton.java.html" target="_blank">AbstractButton.CENTER);
-
- jBtnMore.setFocusable(false);
- jBtnMore.setVerticalTextPosition(javax/swing/AbstractButton.java.html" target="_blank">AbstractButton.BOTTOM);
- jBtnMore.setHorizontalTextPosition(javax/swing/AbstractButton.java.html" target="_blank">AbstractButton.CENTER);
-
-
- //重新设置演示按钮的事件---------------------//
- sButton.setListener(new DefaultMouseEvent(jBtnNew, jBtnMore) {
-
- //重写 mousePressed 方法
- public void mousePressed(java/awt/event/MouseEvent.java.html" target="_blank">MouseEvent e) {
- super.mousePressed(e);
-
- //自己的代码-------------------//
- if(((javax/swing/JButton.java.html" target="_blank">JButton)e.getComponent()).equals(jBtnNew))
- javax/swing/JOptionPane.java.html" target="_blank">JOptionPane.showMessageDialog(null,"你点了【主】按钮");
- else
- javax/swing/JOptionPane.java.html" target="_blank">JOptionPane.showMessageDialog(null,"你点了【从】按钮");
- }
- });
-
-
- //其它按钮构建-------------------------------//
- for(int i = 0; i < jBtnOther.length; i++) {
- jBtnOther[i] = new javax/swing/JButton.java.html" target="_blank">JButton(" Other"+i+" ",
- new javax/swing/ImageIcon.java.html" target="_blank">ImageIcon("ICON/insert.gif"));
-
- jBtnOther[i].setVerticalTextPosition(javax/swing/AbstractButton.java.html" target="_blank">AbstractButton.BOTTOM);
- jBtnOther[i].setHorizontalTextPosition(javax/swing/AbstractButton.java.html" target="_blank">AbstractButton.CENTER);
-
- //添加其它按钮事件为默认 DefaultOtherBTEvent -----------//
- jBtnOther[i].addMouseListener(new DefaultOtherBTEvent(jBtnOther[i]) {
- //重写 mousePressed 方法
- public void mousePressed(java/awt/event/MouseEvent.java.html" target="_blank">MouseEvent e) {
- super.mousePressed(e);
-
- //自己的代码-------------------//
- javax/swing/JOptionPane.java.html" target="_blank">JOptionPane.showMessageDialog(null,"你点了 "
- +((javax/swing/JButton.java.html" target="_blank">JButton)e.getComponent()).getText() +" !");
- }
- });
- }
-
-
- //添加按钮到 JToolBar------------------------//
- edit.setLayout(new java/awt/FlowLayout.java.html" target="_blank">FlowLayout(java/awt/FlowLayout.java.html" target="_blank">FlowLayout.LEFT, 0, 0));
- edit.add(jBtnOther[0]);
- edit.add(sButton);
- for(int i = 1; i < jBtnOther.length; i++)
- edit.add(jBtnOther[i]);
-
-
- //设置其它按钮边框为 SubordinateButton.usual
- for(int i = 0; i < jBtnOther.length; i++)
- jBtnOther[i].setBorder(SubordinateButton.usual);
-
- //添加 JToolBar
- getContentPane().add(edit,java/awt/BorderLayout.java.html" target="_blank">BorderLayout.NORTH);
- }
-
-
-
-
- /**
- * 面板显示
- */
- private void showFace() {
- setTitle("主从按钮 Demo");
- setSize(500, 400);
-
- java/awt/Toolkit.java.html" target="_blank">Toolkit tmpTK = java/awt/Toolkit.java.html" target="_blank">Toolkit.getDefaultToolkit();
- java/awt/Dimension.java.html" target="_blank">Dimension dime = tmpTK.getScreenSize(); //取得屏幕大小
- setLocation(dime.width2 - 250, dime.height2 - 200);
- show();
- }
-
-
-
-
- /**
- * 方法:事件监听
- */
- private void addListener() {
- this.addWindowListener(new java/awt/event/WindowAdapter.java.html" target="_blank">WindowAdapter() { //添加窗口关闭事件
- public void windowClosing(java/awt/event/WindowEvent.java.html" target="_blank">WindowEvent e) {
- setVisible(false);
- dispose();
- java/lang/System.java.html" target="_blank">System.exit(0);
- }
- });
- }
-
-
-
-
- /**
- * 程序入口
- */
- public static void main(java/lang/String.java.html" target="_blank">String[] args) {
- //设置 windows 风格
- try {
- javax/swing/UIManager.java.html" target="_blank">UIManager.setLookAndFeel(
- "com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
- } catch (java/lang/Exception.java.html" target="_blank">Exception e) {}
-
- //全局字体设置-----------------------//
- java/awt/Font.java.html" target="_blank">Font font1 = new java/awt/Font.java.html" target="_blank">Font("宋体",java/awt/Font.java.html" target="_blank">Font.PLAIN,12);
- java/awt/Font.java.html" target="_blank">Font font2 = new java/awt/Font.java.html" target="_blank">Font("宋体",java/awt/Font.java.html" target="_blank">Font.PLAIN,15);
- javax/swing/UIManager.java.html" target="_blank">UIManager.put("Button.font",font1);
- javax/swing/UIManager.java.html" target="_blank">UIManager.put("OptionPane.messageFont",font2);
- javax/swing/UIManager.java.html" target="_blank">UIManager.put("OptionPane.buttonFont",font1);
-
- //测试启动
- new Test();
- }
- }
|