You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
373 lines
10 KiB
373 lines
10 KiB
package com.fr.design.gui.ibutton; |
|
|
|
import com.fr.base.BaseUtils; |
|
import com.fr.base.CellBorderStyle; |
|
import com.fr.base.GraphHelper; |
|
import com.fr.design.constants.UIConstants; |
|
import com.fr.design.event.UIObserver; |
|
import com.fr.design.event.UIObserverListener; |
|
import com.fr.design.utils.gui.GUICoreUtils; |
|
import com.fr.stable.Constants; |
|
import com.fr.stable.StringUtils; |
|
|
|
import javax.swing.*; |
|
import javax.swing.plaf.ButtonUI; |
|
import java.awt.*; |
|
import java.awt.event.ActionEvent; |
|
import java.awt.event.ActionListener; |
|
import java.awt.event.MouseEvent; |
|
import java.awt.geom.RoundRectangle2D; |
|
|
|
public class UISliderButton extends JButton implements UIObserver { |
|
|
|
public static final int OTHER_BORDER = 1; |
|
public static final int NORMAL_BORDER = 2; |
|
private static final int HEIGH = 20; |
|
private static final int TOOLTIP_Y = 30; |
|
private boolean isExtraPainted = true; |
|
private boolean isRoundBorder = true; |
|
private int rectDirection = Constants.NULL; |
|
private Stroke borderStroke = UIConstants.BS; |
|
private Color borderColor = UIConstants.LINE_COLOR; |
|
|
|
private boolean isPressedPainted = true; |
|
private boolean isNormalPainted = true; |
|
protected boolean isBorderPaintedOnlyWhenPressed = false; |
|
|
|
private int borderType = NORMAL_BORDER; |
|
private CellBorderStyle border = null; |
|
|
|
protected UIObserverListener uiObserverListener; |
|
|
|
public UISliderButton() { |
|
this(StringUtils.EMPTY); |
|
} |
|
|
|
public UISliderButton(String string) { |
|
this(string, null); |
|
} |
|
|
|
|
|
public UISliderButton(Icon icon) { |
|
this(null, icon); |
|
} |
|
|
|
public UISliderButton(Action action) { |
|
super(action); |
|
init(); |
|
} |
|
|
|
public UISliderButton(String text, Icon icon) { |
|
super(text, icon); |
|
init(); |
|
} |
|
|
|
/** |
|
* 是否进行过权限编辑 |
|
* |
|
* @param role 角色 |
|
* @return 否 |
|
*/ |
|
public boolean isDoneAuthorityEdited(String role) { |
|
return false; |
|
} |
|
|
|
public UISliderButton(Icon normal, Icon rollOver, Icon pressed) { |
|
super(normal); |
|
setBorderPainted(false); |
|
setRolloverIcon(rollOver); |
|
setPressedIcon(pressed); |
|
setExtraPainted(false); |
|
setBackground(null); |
|
setOpaque(false); |
|
initListener(); |
|
} |
|
|
|
protected void initListener() { |
|
if (shouldResponseChangeListener()) { |
|
this.addActionListener(new ActionListener() { |
|
public void actionPerformed(ActionEvent e) { |
|
if (uiObserverListener == null) { |
|
return; |
|
} |
|
uiObserverListener.doChange(); |
|
} |
|
}); |
|
} |
|
} |
|
|
|
|
|
//确定是正常的边框类型,还是其他的Border类型 |
|
//若是其他的border类型,则要setOtherType,即设置线型颜色等。若是其他类型,但是没有设置,则默认的是虚线型边框 |
|
public void setBorderType(int borderType) { |
|
this.borderType = borderType; |
|
} |
|
|
|
|
|
public void setBorderStyle(CellBorderStyle border) { |
|
this.border = border; |
|
} |
|
|
|
public void set4ToolbarButton() { |
|
setNormalPainted(false); |
|
Dimension dim = getPreferredSize(); |
|
dim.height = HEIGH; |
|
setBackground(null); |
|
setOpaque(false); |
|
setSize(dim); |
|
setBorderPaintedOnlyWhenPressed(true); |
|
} |
|
|
|
public void set4LargeToolbarButton() { |
|
setNormalPainted(false); |
|
setBackground(null); |
|
setOpaque(false); |
|
setSize(new Dimension(40, 40)); |
|
setBorderPaintedOnlyWhenPressed(true); |
|
} |
|
|
|
public void set4ChartLargeToolButton() { |
|
setNormalPainted(false); |
|
setBackground(null); |
|
setOpaque(false); |
|
setSize(new Dimension(34, 44)); |
|
setBorderPaintedOnlyWhenPressed(true); |
|
} |
|
|
|
|
|
private void init() { |
|
setOpaque(false); |
|
setBackground(null); |
|
setRolloverEnabled(true); |
|
initListener(); |
|
} |
|
|
|
@Override |
|
public ButtonUI getUI() { |
|
return new UISliderButtonUI(); |
|
} |
|
|
|
/** |
|
* 更新界面 |
|
*/ |
|
public void updateUI() { |
|
setUI(getUI()); |
|
} |
|
|
|
public CellBorderStyle getBorderStyle() { |
|
return this.border; |
|
} |
|
|
|
@Override |
|
public Insets getInsets() { |
|
if (getIcon() != null) { |
|
return new Insets(0, 3, 0, 3); |
|
} |
|
return new Insets(0, 0, 0, 0); |
|
} |
|
|
|
//@Override |
|
public Dimension getPreferredSize() { |
|
return new Dimension(super.getPreferredSize().width, 20); |
|
} |
|
|
|
|
|
public int getBorderType() { |
|
return borderType; |
|
} |
|
|
|
public void setOtherBorder(Stroke s, Color c) { |
|
borderStroke = s; |
|
borderColor = c; |
|
} |
|
|
|
|
|
@Override |
|
protected void paintBorder(Graphics g) { |
|
|
|
if (!isBorderPainted()) { |
|
return; |
|
} |
|
if (borderType == OTHER_BORDER) { |
|
paintOtherBorder(g); |
|
} else { |
|
boolean isPress = (isBorderPaintedOnlyWhenPressed && getModel().isPressed()); |
|
if (isPress || !isBorderPaintedOnlyWhenPressed) { |
|
if (ui instanceof UISliderButtonUI) { |
|
((UISliderButtonUI) ui).paintBorder(g, this); |
|
|
|
} else { |
|
super.paintBorder(g); |
|
|
|
} |
|
} |
|
} |
|
} |
|
|
|
@Override |
|
public void paintComponent(Graphics g) { |
|
super.paintComponent(g); |
|
Dimension size = this.getSize(); |
|
Graphics2D g2d = (Graphics2D) g; |
|
Stroke oldStroke = g2d.getStroke(); |
|
if (border != null) { |
|
g2d.setColor(border.getTopColor()); |
|
GraphHelper.drawLine(g2d, 3, 4, size.getWidth() - 4, 4, border.getTopStyle()); |
|
g2d.setColor(border.getLeftColor()); |
|
GraphHelper.drawLine(g2d, 3, 4, 3, size.getHeight() - 4, border.getLeftStyle()); |
|
g2d.setColor(border.getBottomColor()); |
|
GraphHelper.drawLine(g2d, 3, size.getHeight() - 4, size.getWidth() - 4, size.getHeight() - 4, border.getBottomStyle()); |
|
g2d.setColor(border.getRightColor()); |
|
GraphHelper.drawLine(g2d, size.getWidth() - 4, 4, size.getWidth() - 4, size.getHeight() - 4, border.getRightStyle()); |
|
} else { |
|
GraphHelper.drawLine(g2d, 2, 4, size.getWidth() - 4, 4, Constants.LINE_NONE); |
|
GraphHelper.drawLine(g2d, 2, 4, 2, size.getHeight() - 4, Constants.LINE_NONE); |
|
GraphHelper.drawLine(g2d, 2, size.getHeight() - 4, size.getWidth() - 4, size.getHeight() - 4, Constants.LINE_NONE); |
|
GraphHelper.drawLine(g2d, size.getWidth() - 4, 4, size.getWidth() - 4, size.getHeight() - 4, Constants.LINE_NONE); |
|
} |
|
g2d.setStroke(oldStroke); |
|
} |
|
|
|
|
|
protected void paintOtherBorder(Graphics g) { |
|
Graphics2D g2d = (Graphics2D) g; |
|
g2d.setStroke(borderStroke); |
|
Shape shape = new RoundRectangle2D.Float(0.5f, 0.5f, getWidth() - 1f, getHeight() - 1f, UIConstants.ARC, UIConstants.ARC); |
|
g2d.setColor(borderColor); |
|
g2d.draw(shape); |
|
} |
|
|
|
public void setExtraPainted(boolean extra) { |
|
this.isExtraPainted = extra; |
|
} |
|
|
|
/** |
|
* 是否额外画 |
|
* |
|
* @return 是则返回TRUE |
|
*/ |
|
public boolean isExtraPainted() { |
|
return this.isExtraPainted; |
|
} |
|
|
|
/** |
|
* @return |
|
*/ |
|
public int getRectDirection() { |
|
return rectDirection; |
|
} |
|
|
|
/** |
|
* 是否圆边框 |
|
* |
|
* @return 是则返回true |
|
*/ |
|
public boolean isRoundBorder() { |
|
return isRoundBorder; |
|
} |
|
|
|
/** |
|
* @param isRoundBorder |
|
*/ |
|
public void setRoundBorder(boolean isRoundBorder) { |
|
setRoundBorder(isRoundBorder, Constants.NULL); |
|
} |
|
|
|
/** |
|
* @param isRound |
|
* @param rectDirection |
|
*/ |
|
public void setRoundBorder(boolean isRound, int rectDirection) { |
|
this.isRoundBorder = isRound; |
|
this.rectDirection = rectDirection; |
|
} |
|
|
|
/** |
|
* 是否按压画 |
|
* |
|
* @return 是则返回TRUE |
|
*/ |
|
public boolean isPressedPainted() { |
|
return isPressedPainted; |
|
} |
|
|
|
/** |
|
* @param isPressedPainted |
|
*/ |
|
public void setPressedPainted(boolean isPressedPainted) { |
|
this.isPressedPainted = isPressedPainted; |
|
} |
|
|
|
/** |
|
* 是否正常画 |
|
* |
|
* @return 是则返回TRUE |
|
*/ |
|
public boolean isNormalPainted() { |
|
return isNormalPainted; |
|
} |
|
|
|
/** |
|
* @param isNormalPressed |
|
*/ |
|
public void setNormalPainted(boolean isNormalPressed) { |
|
this.isNormalPainted = isNormalPressed; |
|
if (!isNormalPressed) { |
|
setBackground(null); |
|
setOpaque(false); |
|
} |
|
} |
|
|
|
/** |
|
* @param value |
|
*/ |
|
public void setBorderPaintedOnlyWhenPressed(boolean value) { |
|
this.isBorderPaintedOnlyWhenPressed = value; |
|
} |
|
|
|
@Override |
|
public Point getToolTipLocation(MouseEvent event) { |
|
return new Point(event.getX(), event.getY() - TOOLTIP_Y); |
|
} |
|
|
|
/** |
|
* 主函数 |
|
* |
|
* @param args 入口参数 |
|
*/ |
|
public static void main(String... args) { |
|
JFrame jf = new JFrame("test"); |
|
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); |
|
JPanel content = (JPanel) jf.getContentPane(); |
|
content.setLayout(null); |
|
|
|
UISliderButton bb = new UISliderButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/add.png")); |
|
bb.setEnabled(false); |
|
bb.setBorderType(OTHER_BORDER); |
|
// bb.setBounds(20, 20,content.getSize().width, bb.getPreferredSize().height); |
|
bb.setPreferredSize(new Dimension(100, 30)); |
|
bb.setBounds(0, 0, bb.getPreferredSize().width, bb.getPreferredSize().height); |
|
content.add(bb); |
|
GUICoreUtils.centerWindow(jf); |
|
jf.setSize(400, 400); |
|
jf.setVisible(true); |
|
} |
|
|
|
/** |
|
* 给组件登记一个观察者监听事件 |
|
* |
|
* @param listener 观察者监听事件 |
|
*/ |
|
public void registerChangeListener(UIObserverListener listener) { |
|
this.uiObserverListener = listener; |
|
} |
|
|
|
/** |
|
* 组件是否需要响应添加的观察者事件 |
|
* |
|
* @return 如果需要响应观察者事件则返回true,否则返回false |
|
*/ |
|
public boolean shouldResponseChangeListener() { |
|
return true; |
|
} |
|
} |