Положение кнопки прокрутки JTabbedPane

Работал с JTabbedPane и пытался настроить его при использовании SCROLL_TAB_LAYOUT специально с кнопками направления прокрутки.

Я расширяю BasicTabbedPaneUI, но не вижу способа или возможности изменить расположение кнопок прокрутки. Искал вокруг и не видел, чтобы кто-то делал это, кроме как используя другой внешний вид. Я считаю, что контроль над расположением кнопок направления прокрутки был бы очень полезен.

У кого-нибудь есть идеи, как это сделать, расширяя BasicTabbedPaneUI или любой другой метод?


person Neil    schedule 20.12.2011    source источник


Ответы (2)


Я предполагаю, что вы хотите переместить кнопку прокрутки назад на другую сторону вкладок.

В классе BasicTabbedPaneUI есть метод createDecreaseButton это только пакет (без модификатора доступа).

Похоже, вам придется создать свой собственный класс BasicTabbedPaneUI с собственной версией createDecreaseButton.

person Gilbert Le Blanc    schedule 20.12.2011
comment
согласился на жесткую модификацию этих двух кнопок +1 - person mKorbel; 20.12.2011
comment
Спасибо за это. В основном то, чего я боялся :) В итоге я реализовал свою собственную панель вкладок, используя различные компоненты. Переопределить методы рисования BasicTabbedPaneUI, чтобы исключить встроенные вкладки и т. д. - person Neil; 26.01.2012

Я изменил положение кнопки прокрутки, не используя многие другие компоненты, а просто расширил BasicTabbedPaneUI и взломал его метод paint() для настройки положения кнопки.

Вот код:

public class MyTabbedScrollPane extends JTabbedPane {       
    public MyTabbedScrollPane ()
    {
        super ();
    }

    public MyTabbedScrollPane ( final int tabPlacement )
    {
        super ( tabPlacement );
    }

    public MyTabbedScrollPane ( final int tabPlacement, final int tabLayoutPolicy )
    {
        super ( tabPlacement, tabLayoutPolicy );
        initialize();
    }

    public void initialize() {
        setUI(new MyTabbedPaneUI());
    }

    private class MyTabbedPaneUI extends BasicTabbedPaneUI {
        private int leadingTabIndex;
        private Point tabViewPosition;
        private Component adjustedButton;
        private boolean scrollableTabLayoutEnabled() {
            return tabPane.getTabLayoutPolicy() == SCROLL_TAB_LAYOUT;
        }
        /*
         * Target button and view port utilities
         */
        private Component findBackwardButton() {
            Component[] comps = tabPane.getComponents();
            for(Component comp:comps) {
                if(comp instanceof BasicArrowButton) {
                    int direction = ((BasicArrowButton)comp).getDirection();
                    if(tabPane.getTabPlacement() == TOP || tabPane.getTabPlacement() == BOTTOM) {
                        if(direction == WEST) {
                            return comp;
                        }
                    }
                }
            }
            return null;
        }
        private JViewport findViewPort() {
            Component[] comps = tabPane.getComponents();
            for(Component comp:comps) {
                if(comp instanceof JViewport) {
                    return (JViewport)comp;
                }
            }
            return null;
        }
        /*
         * Override View port controlling (copy from BasicTabbedPaneUI.java)
         */
        public void scrollForward(int tabPlacement) {
            JViewport viewport = findViewPort();
            Dimension viewSize = viewport.getViewSize();
            Rectangle viewRect = viewport.getViewRect();

            if (tabPlacement == TOP || tabPlacement == BOTTOM) {
                if (viewRect.width >= viewSize.width - viewRect.x) {
                    return; // no room left to scroll
                }
            } else { // tabPlacement == LEFT || tabPlacement == RIGHT
                if (viewRect.height >= viewSize.height - viewRect.y) {
                    return;
                }
            }
            setLeadingTabIndex(tabPlacement, leadingTabIndex+1);
        }

        public void scrollBackward(int tabPlacement) {
            if (leadingTabIndex == 0) {
                return; // no room left to scroll
            }
            setLeadingTabIndex(tabPlacement, leadingTabIndex-1);
        }

        public void setLeadingTabIndex(int tabPlacement, int index) {
            JViewport viewport = findViewPort();
            leadingTabIndex = index;       
            Dimension viewSize = viewport.getViewSize();
            Rectangle viewRect = viewport.getViewRect();

            int offsetX = adjustedButton.getWidth()+2;

            switch(tabPlacement) {
              case TOP:
              case BOTTOM:
                tabViewPosition.x = leadingTabIndex == 0? 0-offsetX : rects[leadingTabIndex].x-offsetX;

                if ((viewSize.width - tabViewPosition.x) < viewRect.width) {
                    // We've scrolled to the end, so adjust the viewport size
                    // to ensure the view position remains aligned on a tab boundary
                    Dimension extentSize = new Dimension(viewSize.width - tabViewPosition.x, 
                                                         viewRect.height);
                    viewport.setExtentSize(extentSize);
                }
                break;
              case LEFT:
              case RIGHT:
                tabViewPosition.y = leadingTabIndex == 0? 0 : rects[leadingTabIndex].y;

                if ((viewSize.height - tabViewPosition.y) < viewRect.height) {
                // We've scrolled to the end, so adjust the viewport size
                // to ensure the view position remains aligned on a tab boundary
                     Dimension extentSize = new Dimension(viewRect.width, 
                                                          viewSize.height - tabViewPosition.y);
                     viewport.setExtentSize(extentSize);
                }
            }
            viewport.setViewPosition(tabViewPosition);
        }
        /*
         * UI Rendering
         */
        public void paint(final Graphics g, JComponent c) {
            super.paint(g, c);
            if(scrollableTabLayoutEnabled()) {
                if(adjustedButton == null) {
                    adjustedButton = findBackwardButton();
                    tabViewPosition = new Point(0-(adjustedButton.getWidth()+2), 0);
                    Component[] comps = tabPane.getComponents();
                    for(Component comp:comps) {
                        if(comp instanceof BasicArrowButton) {
                            if(comp instanceof BasicArrowButton) {
                                BasicArrowButton button = (BasicArrowButton)comp;
                                int direction = button.getDirection();
                                if(tabPane.getTabPlacement() == TOP || tabPane.getTabPlacement() == BOTTOM) {
                                    // left align the west button
                                    if(direction == WEST) {
                                        button.removeActionListener(button.getActionListeners()[0]);
                                        button.addActionListener(new ActionListener() {                                         
                                            @Override
                                            public void actionPerformed(ActionEvent e) {
                                                scrollBackward(tabPane.getTabPlacement());
                                            }
                                        });
                                    } else if(direction == EAST) {
                                        button.removeActionListener(button.getActionListeners()[0]);
                                        button.addActionListener(new ActionListener() {                                         
                                            @Override
                                            public void actionPerformed(ActionEvent e) {
                                                scrollForward(tabPane.getTabPlacement());
                                            }
                                        });
                                    }
                                }
                            }
                        }
                    }
                }
                if(adjustedButton != null && adjustedButton.isVisible()) {
                    // move the scroll button
                    int by = adjustedButton.getY();
                    adjustedButton.setLocation(0, by);
                    findViewPort().setViewPosition(tabViewPosition);
                    return;
                }
            }
        }
    }
}
person gogog22510    schedule 27.08.2015