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;
    }