Java JSpinner';s JButton to ImageIcon
尝试将Java JSpinner';s JButton to ImageIcon,java,swing,jbutton,imageicon,jspinner,Java,Swing,Jbutton,Imageicon,Jspinner,尝试将JSpinner的JButton控制器替换为ImageIcon。但由于某些原因,它不会侦听任何鼠标单击(在BasicSpinnerUI中的installButtonListeners()似乎添加了MouseListener)。你知道为什么以及如何修复吗 public class SpinnerIconBtn extends JFrame { public SpinnerIconBtn(){ JSpinner spinner = new JSpinner();
JSpinner
的JButton
控制器替换为ImageIcon
。但由于某些原因,它不会侦听任何鼠标单击(在BasicSpinnerUI
中的installButtonListeners()
似乎添加了MouseListener
)。你知道为什么以及如何修复吗
public class SpinnerIconBtn extends JFrame {
public SpinnerIconBtn(){
JSpinner spinner = new JSpinner();
spinner.setUI(new JSpinnerArrow());
this.add(spinner);
this.pack();
this.setVisible(true);
}
class JSpinnerArrow extends BasicSpinnerUI {
@Override
protected Component createNextButton() {
Component c = createArrowButton(SwingConstants.NORTH);
c.setName("Spinner.nextButton");
installNextButtonListeners(c);
return c;
}
@Override
protected Component createPreviousButton() {
Component c = createArrowButton(SwingConstants.SOUTH);
c.setName("Spinner.previousButton");
installPreviousButtonListeners(c);
return c;
}
private Component createArrowButton(int direction) {
String path = "/Users/tst.png";
JLabel icon = new JLabel(new ImageIcon(path));
return icon;
}
}
public static void main(String[] args) {
new SpinnerIconBtn();
}
}
installNextButtonListeners()
和installPreviousButtonListeners()
调用以下方法:
private void installButtonListeners(Component c,
ArrowButtonHandler handler) {
if (c instanceof JButton) {
((JButton)c).addActionListener(handler);
}
c.addMouseListener(handler);
}
instanceof
的原因检查箭头按钮Handler
不会作为ActionListener
连接到处理旋转的JLabel
您可以使用JButton
的子类代替JLabel
- 不要更改图标,请使用paintIcon()
- 如果箭头按钮移动或图标太大,请更改布局管理器
没能用答案解决它。通过删除所有没有箭头的按钮来调整按钮,然后我将箭头移动到一起:
private Component createArrowButton(int direction) {
JButton b = new BasicArrowButton(direction){
private static final long serialVersionUID = 1L;
@Override
public void paintTriangle(Graphics g, int x, int y, int size,
int direction, boolean isEnabled) {
if(direction == NORTH){
y +=3;
}
else if(direction == SOUTH){
y -=3;
}
Color shadow = UIManager.getColor("controlShadow");
Color darkShadow = UIManager.getColor("controlDkShadow");
Color highlight = UIManager.getColor("controlLtHighlight");
Color oldColor = g.getColor();
int mid, i, j;
j = 0;
size = Math.max(size, 2);
mid = (size / 2) - 1;
g.translate(x, y);
if (isEnabled)
g.setColor(darkShadow);
else
g.setColor(shadow);
switch (direction) {
case NORTH:
for (i = 0; i < size; i++) {
g.drawLine(mid - i, i, mid + i, i);
}
if (!isEnabled) {
g.setColor(highlight);
g.drawLine(mid - i + 2, i, mid + i, i);
}
break;
case SOUTH:
if (!isEnabled) {
g.translate(1, 1);
g.setColor(highlight);
for (i = size - 1; i >= 0; i--) {
g.drawLine(mid - i, j, mid + i, j);
j++;
}
g.translate(-1, -1);
g.setColor(shadow);
}
j = 0;
for (i = size - 1; i >= 0; i--) {
g.drawLine(mid - i, j, mid + i, j);
j++;
}
break;
case WEST:
for (i = 0; i < size; i++) {
g.drawLine(i, mid - i, i, mid + i);
}
if (!isEnabled) {
g.setColor(highlight);
g.drawLine(i, mid - i + 2, i, mid + i);
}
break;
case EAST:
if (!isEnabled) {
g.translate(1, 1);
g.setColor(highlight);
for (i = size - 1; i >= 0; i--) {
g.drawLine(j, mid - i, j, mid + i);
j++;
}
g.translate(-1, -1);
g.setColor(shadow);
}
j = 0;
for (i = size - 1; i >= 0; i--) {
g.drawLine(j, mid - i, j, mid + i);
j++;
}
break;
}
g.translate(-x, -y);
g.setColor(oldColor);
}
};
b.setBorder(BorderFactory.createEmptyBorder());
//removes content area
b.setContentAreaFilled(false);
b.setInheritsPopupMenu(true);
b.setOpaque(false);
b.setBackground(color);
return b;
}
专用组件createArrowButton(int方向){
JButton b=新基本箭头按钮(方向){
私有静态最终长serialVersionUID=1L;
@凌驾
公共三角形(图形g、整数x、整数y、整数大小、,
int方向,布尔值(已启用){
如果(方向==北){
y+=3;
}
否则,如果(方向==南){
y-=3;
}
Color shadow=UIManager.getColor(“controlShadow”);
Color darkShadow=UIManager.getColor(“controlDkShadow”);
Color highlight=UIManager.getColor(“ControlThighlight”);
Color oldColor=g.getColor();
int-mid,i,j;
j=0;
尺寸=数学最大值(尺寸,2);
mid=(大小/2)-1;
g、 翻译(x,y);
如果(已启用)
g、 setColor(黑色阴影);
其他的
g、 设置颜色(阴影);
开关(方向){
案例北:
对于(i=0;i=0;i--){
g、 抽绳(中间-i,j,中间+i,j);
j++;
}
g、 翻译(-1,-1);
g、 设置颜色(阴影);
}
j=0;
对于(i=size-1;i>=0;i--){
g、 抽绳(中间-i,j,中间+i,j);
j++;
}
打破
凯西:
对于(i=0;i=0;i--){
g、 抽绳(j,中间-i,j,中间+i);
j++;
}
g、 翻译(-1,-1);
g、 设置颜色(阴影);
}
j=0;
对于(i=size-1;i>=0;i--){
g、 抽绳(j,中间-i,j,中间+i);
j++;
}
打破
}
g、 平移(-x,-y);
g、 setColor(oldColor);
}
};
b、 setboorder(BorderFactory.createEmptyByOrder());
//删除内容区域
b、 setContentAreaFilled(假);
b、 setInheritsPopupMenu(真);
b、 设置不透明(假);
b、 挫折背景(颜色);
返回b;
}
private Component createArrowButton(int direction) {
JButton b = new BasicArrowButton(direction){
private static final long serialVersionUID = 1L;
@Override
public void paintTriangle(Graphics g, int x, int y, int size,
int direction, boolean isEnabled) {
if(direction == NORTH){
y +=3;
}
else if(direction == SOUTH){
y -=3;
}
Color shadow = UIManager.getColor("controlShadow");
Color darkShadow = UIManager.getColor("controlDkShadow");
Color highlight = UIManager.getColor("controlLtHighlight");
Color oldColor = g.getColor();
int mid, i, j;
j = 0;
size = Math.max(size, 2);
mid = (size / 2) - 1;
g.translate(x, y);
if (isEnabled)
g.setColor(darkShadow);
else
g.setColor(shadow);
switch (direction) {
case NORTH:
for (i = 0; i < size; i++) {
g.drawLine(mid - i, i, mid + i, i);
}
if (!isEnabled) {
g.setColor(highlight);
g.drawLine(mid - i + 2, i, mid + i, i);
}
break;
case SOUTH:
if (!isEnabled) {
g.translate(1, 1);
g.setColor(highlight);
for (i = size - 1; i >= 0; i--) {
g.drawLine(mid - i, j, mid + i, j);
j++;
}
g.translate(-1, -1);
g.setColor(shadow);
}
j = 0;
for (i = size - 1; i >= 0; i--) {
g.drawLine(mid - i, j, mid + i, j);
j++;
}
break;
case WEST:
for (i = 0; i < size; i++) {
g.drawLine(i, mid - i, i, mid + i);
}
if (!isEnabled) {
g.setColor(highlight);
g.drawLine(i, mid - i + 2, i, mid + i);
}
break;
case EAST:
if (!isEnabled) {
g.translate(1, 1);
g.setColor(highlight);
for (i = size - 1; i >= 0; i--) {
g.drawLine(j, mid - i, j, mid + i);
j++;
}
g.translate(-1, -1);
g.setColor(shadow);
}
j = 0;
for (i = size - 1; i >= 0; i--) {
g.drawLine(j, mid - i, j, mid + i);
j++;
}
break;
}
g.translate(-x, -y);
g.setColor(oldColor);
}
};
b.setBorder(BorderFactory.createEmptyBorder());
//removes content area
b.setContentAreaFilled(false);
b.setInheritsPopupMenu(true);
b.setOpaque(false);
b.setBackground(color);
return b;
}