Java 修改JTabbedPan的滚动按钮

Java 修改JTabbedPan的滚动按钮,java,swing,jtabbedpane,Java,Swing,Jtabbedpane,我正在使用Swing在Java上开发一个UI,我想更改JTabbedPane的滚动按钮,所以我使用了一个新的UI(MyTabbedPaneUI),它是从extends MetalTabbedPaneUI创建的 但是当我创建JTabbedPanel时,会出现两个选项卡,我不想要它们。如果我删除它们,我的滚动条就会消失 守则: public class MyTabbedPaneUI extends MetalTabbedPaneUI{ private Icon southIco

我正在使用Swing在Java上开发一个UI,我想更改JTabbedPane的滚动按钮,所以我使用了一个新的UI(MyTabbedPaneUI),它是从extends MetalTabbedPaneUI创建的

但是当我创建JTabbedPanel时,会出现两个选项卡,我不想要它们。如果我删除它们,我的滚动条就会消失

守则:

  public class MyTabbedPaneUI extends MetalTabbedPaneUI{

        private Icon southIcon = new ImageIcon(MyTabbedPaneUI.class.getResource("south.png"));
        private Icon northIcon = new ImageIcon(MyTabbedPaneUI.class.getResource("north.png"));
        private Icon eastIcon  = new ImageIcon(MyTabbedPaneUI.class.getResource("flecheVerte-gauche-20px.png"));
        private Icon westIcon  = new ImageIcon(MyTabbedPaneUI.class.getResource("flecheVerte-droite-20px.png"));


        public static ComponentUI createUI( JComponent x ) {
            return new MyTabbedPaneUI();
        }


        @Override
        protected JButton createScrollButton(int direction) {

            if ((direction != SOUTH) && (direction != NORTH) && (direction != EAST) && (direction != WEST)) {
                throw new IllegalArgumentException("Direction must be one of: " + "SOUTH, NORTH, EAST or WEST");
            }


            JButton b = new JButton();

            //b.setText("");
            b.setPreferredSize(new Dimension(eastIcon.getIconWidth(), eastIcon.getIconHeight()));

            if (direction == SOUTH) {
                b.setIcon(southIcon);
            } else if (direction == NORTH) {
                b.setIcon(northIcon);
            } else if (direction == WEST) {
                b.setIcon(westIcon);
            } else {
                b.setIcon(eastIcon);
            }

            return b;
        }

    }

请看我的帖子来澄清

,注意需要添加
tb.setTabLayoutPolicy(JTabbedPane.SCROLL\u TAB\u布局)

//

}


//这是我的解决方案,非常简单实用。你可以很容易地使用。实际上,这篇文章已经有8年历史了,可能对你来说已经不是问题了,但其他人可以使用。

是的,我想用我在
basictabedpaneui
中创建的图片更改这两个按钮,请参见
私有类ScrollableTabButton扩展BasicArrowButton
,以获取简单的实现。@Fred B抱歉,我没有幸运地将这四个AbstractButton替换为它的图标,您已查找(我丢失了链接)完全自定义的BasicTabbedPaneUI,这些AbstractButton必须接受preferredSize,真正的成功是使用定制的外观和感觉,其中一些完全覆盖了BasicTabbedPaneUIThanks Kazeka,您有显示结果的链接吗?所以我可以验证你的答案。我不再使用Swing,因此无法在我的计算机上进行测试。这是包含示例的最终项目
@Override
protected JButton createScrollButton(int direction) {
    if (direction != SOUTH && direction != NORTH && direction != EAST
            && direction != WEST) {
        throw new IllegalArgumentException("Direction must be one of: "
                + "SOUTH, NORTH, EAST or WEST");
    }
    return new ArrowButton(direction);
}
public final class ArrowButton extends JButton implements UIResource, SwingConstants {

protected int direction;
private final Image left, disabledleft, pressedleft;
private final Image right, disabledright, pressedright;

public ArrowButton(int direction) {
    super();
    setDirection(direction);
    left = new ImageIcon(getClass().getResource("/resources/arrowicons/left.png")).getImage();
    disabledleft = new ImageIcon(getClass().getResource("/resources/arrowicons/disabledleft.png")).getImage();
    pressedleft = new ImageIcon(getClass().getResource("/resources/arrowicons/leftpressed.png")).getImage();

    right = new ImageIcon(getClass().getResource("/resources/arrowicons/right.png")).getImage();
    disabledright = new ImageIcon(getClass().getResource("/resources/arrowicons/disabledright.png")).getImage();
    pressedright = new ImageIcon(getClass().getResource("/resources/arrowicons/rightpressed.png")).getImage();
}

public int getDirection() {
    return direction;
}

public void setDirection(int direction) {
    this.direction = direction;
}

@Override
public void paint(Graphics g) {
    boolean isPressed, isEnabled;
    int w, h, size;
    w = getSize().width;
    h = getSize().height;
    isPressed = getModel().isPressed();
    isEnabled = isEnabled();

    Image image = null;
    if(direction == EAST){
        if(isEnabled && isPressed){
            image = pressedright;
        }else if(!isEnabled){
            image = disabledright;
        }else{
            image = right;
        }
    }else{
        if(isEnabled && isPressed){
            image = pressedleft;
        }else if(!isEnabled){
            image = disabledleft;
        }else{
            image = left;
        }
    }
    g.drawImage(image, 0, 0, null);
}

@Override
public Dimension getPreferredSize() {
    return new Dimension(32, 32);
}

@Override
public Dimension getMinimumSize() {
    return new Dimension(5, 5);
}

@Override
public Dimension getMaximumSize() {
    return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE);
}