有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java BasicScrollBarUI:标签代替按钮无法滚动

我做了一个定制的BasicScrollBarUI。 我用JLabels替换了递增/递减按钮

因此,我必须重写InstallListeners(),将侦听器添加到incr/decrLabel而不是JButtons

    //TODO
    protected void installListeners() {
    trackListener = createTrackListener();
    buttonListenerCustom = createArrowButtonListenerCustom();
    modelListener = createModelListener();
    propertyChangeListener = createPropertyChangeListener();

    scrollbar.addMouseListener(trackListener);
    scrollbar.addMouseMotionListener(trackListener);
    scrollbar.getModel().addChangeListener(modelListener);
    scrollbar.addPropertyChangeListener(propertyChangeListener);
    //      scrollbar.addFocusListener(getHandler());

    if (incrLabel != null) {
        incrLabel.addMouseListener(buttonListenerCustom);
        System.out.println("OK gemacht");
    }
    if (decrLabel != null) {
        decrLabel.addMouseListener(buttonListenerCustom);
    }

    scrollListener = createScrollListener();
    scrollTimer = new Timer(scrollSpeedThrottle, scrollListener);
    scrollTimer.setInitialDelay(300); // default InitialDelay?
}

因此,我必须覆盖ArrowButtonListener,才能对标签做出反应

protected class ArrowButtonListenerCustom extends MouseAdapter {

    boolean handledEvent;

    public void mousePressed(MouseEvent e) {
        if (!scrollbar.isEnabled()) {
            return;
        }
        // not an unmodified left mouse button
        // if(e.getModifiers() != InputEvent.BUTTON1_MASK) {return; }
        if (!SwingUtilities.isLeftMouseButton(e)) {
            return;
        }

        int direction;
        if (e.getSource() == incrLabel) {
            direction = 1;
            incrLabel.setIcon(new ImageIcon(increaseButtonPressedImage));
        } else {
            direction = -1;
            decrLabel.setIcon(new ImageIcon(decreaseButtonPressedImage));
        }

        scrollByUnit(direction);
        scrollTimer.stop();
        scrollListener.setDirection(direction);
        scrollListener.setScrollByBlock(false);
        scrollTimer.start();

        handledEvent = true;
        if (!scrollbar.hasFocus() && scrollbar.isRequestFocusEnabled()) {
            scrollbar.requestFocus();
        }
    }

    public void mouseReleased(MouseEvent e) {
        scrollTimer.stop();
        handledEvent = false;
        scrollbar.setValueIsAdjusting(false);
        incrLabel.setIcon(new ImageIcon(increaseButtonImage));
        decrLabel.setIcon(new ImageIcon(decreaseButtonImage));
    }
}

当然,createArrowButtonListenerCustom()返回ArrowButtonListenerCustom的新实例

现在我的问题是:

当我单击递增/递减标签时,列表会正确滚动,但滚动条的拇指不会移动(或者更好:拇指不会重新绘制。如果我将鼠标移到拇指上,它会在正确的位置重新绘制)。当我用鼠标滚轮滚动时,我也有同样的问题

我不明白,为什么这样不行。 谢谢你的帮助


共 (0) 个答案