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.
200 lines
6.8 KiB
200 lines
6.8 KiB
package com.fr.design.style; |
|
|
|
import com.fine.theme.utils.FineUIScale; |
|
import com.formdev.flatlaf.ui.FlatArrowButton; |
|
import com.formdev.flatlaf.ui.FlatUIUtils; |
|
import com.fr.design.event.HoverAware; |
|
import com.fr.design.layout.FRGUIPaneFactory; |
|
import com.fr.design.style.background.BackgroundJComponent; |
|
|
|
import javax.swing.JPanel; |
|
import javax.swing.JButton; |
|
import javax.swing.UIManager; |
|
import javax.swing.event.AncestorEvent; |
|
import javax.swing.event.AncestorListener; |
|
import javax.swing.SwingConstants; |
|
import java.awt.BorderLayout; |
|
import java.awt.Dimension; |
|
import java.awt.Graphics; |
|
import java.awt.Graphics2D; |
|
import java.awt.Point; |
|
import java.awt.Rectangle; |
|
import java.awt.Color; |
|
import java.awt.event.MouseAdapter; |
|
import java.awt.event.MouseEvent; |
|
import java.awt.event.MouseListener; |
|
|
|
/** |
|
* @author kunsnat E-mail:kunsnat@gmail.com |
|
* @version 创建时间:2011-10-31 下午03:28:31 类说明: 抽象出来的弹出box. 可以弹出颜色选择, 图案选择, 纹理选择. |
|
* 主要是 弹出界面的不同 |
|
*/ |
|
public abstract class AbstractSelectBox<T> extends AbstractPopBox implements MouseListener, HoverAware { |
|
private static final String UI_CLASS_ID = "SelectBoxUI"; |
|
private static final long serialVersionUID = 2355250206956896774L; |
|
|
|
private boolean rollOver; |
|
private JButton triggerButton; |
|
|
|
protected void initBox(int preWidth) { |
|
// 初始化面板布局 |
|
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
|
// 初始化组件 |
|
displayComponent = new BackgroundJComponent(); |
|
triggerButton = new SelectBoxButton(); |
|
// 初始化组件布局 |
|
JPanel displayPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
|
displayPane.setBorder(null); |
|
displayPane.setOpaque(false); |
|
displayPane.add(displayComponent, BorderLayout.CENTER); |
|
displayComponent.setSize(new Dimension(FineUIScale.scale(preWidth), displayPane.getPreferredSize().height)); |
|
// 添加事件监听 |
|
displayComponent.addMouseListener(mouseListener); |
|
triggerButton.addMouseListener(mouseListener); |
|
displayComponent.addMouseListener(this); |
|
triggerButton.addMouseListener(this); |
|
|
|
this.add(displayPane, BorderLayout.CENTER); |
|
this.add(triggerButton, BorderLayout.EAST); |
|
|
|
this.addAncestorListener(new AncestorListener() { |
|
public void ancestorAdded(AncestorEvent event) { |
|
} |
|
|
|
public void ancestorRemoved(AncestorEvent evt) { |
|
hidePopupMenu(); |
|
} |
|
|
|
public void ancestorMoved(AncestorEvent event) { |
|
hidePopupMenu(); |
|
} |
|
}); |
|
|
|
displayComponent.addMouseListener(new MouseAdapter() { |
|
@Override |
|
public void mouseExited(MouseEvent e) { |
|
if (!isPopupVisible()) { |
|
//如果弹出框==null 或者 弹出框不可见 直接return |
|
return; |
|
} |
|
Point popMenuP = getControlWindow().getLocation(); |
|
Point displayComponentP = displayComponent.getLocationOnScreen(); |
|
if (popMenuP.getX() < displayComponentP.getX() - 1) { |
|
//如果 弹出框横向超出屏幕 往左调整了 和displayComponent横向错开 就不处理了 |
|
return; |
|
} |
|
|
|
Rectangle rectangle = displayComponent.getBounds(); |
|
boolean bottomPopAndExitTop = displayComponentP.getY() < popMenuP.getY() && e.getY() <= rectangle.y; |
|
boolean topPopAndExitBottom = displayComponentP.getY() > popMenuP.getY() && e.getY() >= rectangle.y + rectangle.getHeight(); |
|
boolean exitLeftOrRight = rectangle.x > e.getX() || rectangle.x + rectangle.getWidth() < e.getX(); |
|
if (bottomPopAndExitTop || topPopAndExitBottom || exitLeftOrRight) { |
|
//弹出框在displayComponent下面 且 鼠标是从displayComponent上面离开的,隐藏弹出界面。 |
|
//弹出框在displayComponent上面 且 鼠标是从displayComponent下面离开的,隐藏弹出界面。 |
|
//鼠标从displayComponent左边 或者 右边 离开,隐藏弹出界面。 |
|
hidePopupMenu(); |
|
} |
|
|
|
} |
|
}); |
|
} |
|
|
|
@Override |
|
public String getUIClassID() { |
|
return UI_CLASS_ID; |
|
} |
|
|
|
public void setEnabled(boolean enabled) { |
|
super.setEnabled(enabled); |
|
|
|
displayComponent.setEnabled(enabled); |
|
triggerButton.setEnabled(enabled); |
|
} |
|
|
|
@Override |
|
public JPanel initWindowPane(double preWidth) { |
|
return null; |
|
} |
|
|
|
@Override |
|
public void paint(Graphics g) { |
|
super.paint(g); |
|
triggerButton.setSelected(isPopupVisible()); |
|
} |
|
|
|
/** |
|
* 应用于SelectBox的右侧按钮 |
|
*/ |
|
protected class SelectBoxButton extends FlatArrowButton { |
|
|
|
protected SelectBoxButton() { |
|
this(SwingConstants.SOUTH, |
|
UIManager.getString("Component.arrowType"), |
|
UIManager.getColor("ComboBox.buttonArrowColor"), |
|
UIManager.getColor("ComboBox.buttonDisabledArrowColor"), |
|
null, null, null, null); |
|
} |
|
|
|
protected SelectBoxButton(int direction, String type, Color foreground, Color disabledForeground, |
|
Color hoverForeground, Color hoverBackground, Color pressedForeground, Color pressedBackground) { |
|
super(direction, type, foreground, disabledForeground, |
|
hoverForeground, hoverBackground, pressedForeground, pressedBackground); |
|
} |
|
|
|
@Override |
|
protected void paintArrow(Graphics2D g) { |
|
if (isPopupVisible()) { |
|
setDirection(SwingConstants.NORTH); |
|
} else { |
|
setDirection(SwingConstants.SOUTH); |
|
} |
|
super.paintArrow(g); |
|
} |
|
|
|
@Override |
|
public Dimension getPreferredSize() { |
|
int outerHeight = FlatUIUtils.getUIInt("ComboBox.height", 24); |
|
int buttonSize = FineUIScale.scale(outerHeight - |
|
2 * FlatUIUtils.getUIInt("Component.borderWidth", 1)); |
|
return new Dimension(buttonSize, buttonSize); |
|
} |
|
} |
|
|
|
|
|
public abstract T getSelectObject(); |
|
|
|
public abstract void setSelectObject(T t); |
|
|
|
|
|
@Override |
|
public void mouseEntered(MouseEvent e) { |
|
rollOver = true; |
|
repaint(); |
|
} |
|
|
|
@Override |
|
public void mouseExited(MouseEvent e) { |
|
rollOver = false; |
|
repaint(); |
|
} |
|
|
|
@Override |
|
public void mouseClicked(MouseEvent e) { |
|
|
|
} |
|
|
|
@Override |
|
public void mousePressed(MouseEvent e) { |
|
|
|
} |
|
|
|
@Override |
|
public void mouseReleased(MouseEvent e) { |
|
|
|
} |
|
|
|
@Override |
|
public boolean isHovered() { |
|
return rollOver; |
|
} |
|
} |