package com.javaxyq.ui; import java.awt.Color; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.util.List; import javax.swing.AbstractButton; import javax.swing.Action; import javax.swing.ButtonModel; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JToolTip; import javax.swing.UIManager; import javax.swing.plaf.basic.BasicButtonUI; import com.javaxyq.event.EventDelegator; import com.javaxyq.util.UIUtils; import com.javaxyq.widget.Frame; import com.javaxyq.widget.Sprite; /** * �Զ����Button��<br> * ʹ����Ϸ��Դ����ʾ * * @author gdw * @date */ public class Button extends JButton { private static final long serialVersionUID = -1440948304007652916L; private static final String uiClassID = "GameButtonUI"; static { UIManager.put("GameButtonUI", "com.javaxyq.ui.GameButtonUI"); } /** * ��ť����ʱ�Ƿ��Զ�������ƫ�� */ private boolean autoOffset = false; private String tooltipTpl; private TooltipTemplate template; public Button() { } public Button(Action action) { super(action); } /** * ����һ������4֡ͼƬ��������Ϊ��ť��4��״̬,0-3����Ϊnormal,pressed,rollover,disabled * * @param frames */ public Button(int width, int height, List<Frame> frames) { setSize(width, height); init(frames); } public Button(Sprite sprite) { init(sprite); } @Override public String getUIClassID() { return uiClassID; } private void init(List<Frame> frames) { // changed ui setUI(new CustomButtonUI()); setFont(UIUtils.TEXT_FONT); setForeground(Color.WHITE); setHorizontalTextPosition(JButton.CENTER); setVerticalTextPosition(JButton.CENTER); setHorizontalAlignment(JButton.CENTER); setVerticalAlignment(JButton.CENTER); // changed viewer properties setIgnoreRepaint(true); setBorder(null); // setOpaque(false); setFocusable(false); setContentAreaFilled(false); // set icons try { int frameCount = frames.size(); this.setAutoOffset(frameCount < 3); if (frameCount > 0) { setIcon(new ImageIcon(frames.get(0).getImage())); } if (frameCount > 1) { setPressedIcon(new ImageIcon(frames.get(1).getImage())); } if (frameCount > 2) { setRolloverIcon(new ImageIcon(frames.get(2).getImage())); } if (frameCount > 3) { setDisabledIcon(new ImageIcon(frames.get(3).getImage())); } } catch (Exception e) { System.err.println("����Buttonʧ��!"); e.printStackTrace(); } } public void init(Sprite sprite) { setSize(sprite.getWidth(), sprite.getHeight()); List<Frame> frames = sprite.getAnimation(0).getFrames(); init(frames); } public boolean isAutoOffset() { return autoOffset; } // ��ײ��� // public boolean contains(int x, int y) { // return super.contains(x, y); // } /** * ��ť����ʱ�Ƿ��Զ�������ƫ�� */ public void setAutoOffset(boolean autoOffset) { this.autoOffset = autoOffset; } static class CustomButtonUI extends BasicButtonUI { @Override protected void paintIcon(Graphics g, JComponent c, Rectangle iconRect) { Button btn = (Button) c; ButtonModel model = btn.getModel(); if (btn.isAutoOffset() && model.isArmed() && model.isPressed()) { defaultTextShiftOffset = 1; // down } else { defaultTextShiftOffset = 0; } setTextShiftOffset(); super.paintIcon(g, c, iconRect); } protected void paintText(Graphics g, JComponent c, Rectangle textRect, String text) { AbstractButton b = (AbstractButton) c; ButtonModel model = b.getModel(); if (model.isArmed() && model.isPressed()) { defaultTextShiftOffset = 1; // down } else { defaultTextShiftOffset = 0; } setTextShiftOffset(); super.paintText(g, c, textRect, text); } } public JToolTip createToolTip() { LucidToolTip tip = new LucidToolTip(); tip.setComponent(this); return tip; } @Override public String getToolTipText() { if(tooltipTpl !=null && tooltipTpl.trim().length()>0 && template!=null) { return template.getTooltipText(tooltipTpl); } return super.getToolTipText(); } public String getTooltipTpl() { return tooltipTpl; } public void setTooltipTpl(String tooltipTpl) { this.tooltipTpl = tooltipTpl; LightweightToolTipManager toolTipManager = LightweightToolTipManager.sharedInstance(); if (tooltipTpl != null) { toolTipManager.registerComponent(this); } else { toolTipManager.unregisterComponent(this); } } public void setToolTipText(String text) { putClientProperty(TOOL_TIP_TEXT_KEY, text); } public void setTemplate(TooltipTemplate template) { this.template = template; } @Override public void paintImmediately(int x, int y, int w, int h) { // super.paintImmediately(x, y, w, h); } @Override protected void fireActionPerformed(ActionEvent event) { super.fireActionPerformed(event); EventDelegator.getInstance().delegateEvent(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, getActionCommand())); } }