簡體   English   中英

JComboBox自定義垂直滾動條

[英]JComboBox customize vertical scrollbar

這個目的主要是美學,我已經在JTextArea上做了類似的事情,但是我無法弄明白或者可以從JComboBox上獲取彈出滾動條。 我通過將其設置為0來移除顯示在頂部的箭頭。

    setUI(new BasicComboBoxUI(){
        protected JButton createArrowButton(){
            return new JButton(){
                @Override public int getWidth() {
                    return 0;
                }
                @Override
                public void setFocusable(boolean focusable) {
                    super.setFocusable(false);
                }
            };
        }
    });

jcombobox圖像

這是一個JScrollPane里面的JTextArea,沒有箭頭和一個更細的條

    getVerticalScrollBar().setPreferredSize(new Dimension(10, 0));
    getVerticalScrollBar().setUI(new BasicScrollBarUI(){
        @Override
        protected JButton createDecreaseButton(int orientation) {
            return createZeroButton();
        }

        @Override    
        protected JButton createIncreaseButton(int orientation) {
            return createZeroButton();
        }

        private JButton createZeroButton() {
            JButton jbutton = new JButton();
            jbutton.setPreferredSize(new Dimension(0, 0));
            jbutton.setMinimumSize(new Dimension(0, 0));
            jbutton.setMaximumSize(new Dimension(0, 0));
            return jbutton;
        }
    });

jtextarea的例子

您可以覆蓋BasicComboBoxUIgetPopup()方法以創建新的BasicComboPopup 然后您可以訪問createScroller()方法,通過覆蓋它,您可以返回自己的自定義JScrollPane


在此輸入圖像描述

import java.awt.Dimension;
import java.awt.EventQueue;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.plaf.basic.BasicComboBoxUI;
import javax.swing.plaf.basic.BasicComboPopup;
import javax.swing.plaf.basic.BasicScrollBarUI;
import javax.swing.plaf.basic.ComboPopup;

public class Example {

    public Example() {
        JComboBox<Integer> comboBox = new JComboBox<Integer>();
        for (int i = 1; i <= 10; i++) {
            comboBox.addItem(i);
        }

        comboBox.setUI(new BasicComboBoxUI() {
            @Override
            protected ComboPopup createPopup() {
                return new BasicComboPopup(comboBox) {
                    @Override
                    protected JScrollPane createScroller() {
                        JScrollPane scroller = new JScrollPane(list, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
                        scroller.getVerticalScrollBar().setUI(new BasicScrollBarUI() {
                            @Override
                            protected JButton createDecreaseButton(int orientation) {
                                return createZeroButton();
                            }

                            @Override
                            protected JButton createIncreaseButton(int orientation) {
                                return createZeroButton();
                            }

                            @Override
                            public Dimension getPreferredSize(JComponent c) {
                                return new Dimension(10, super.getPreferredSize(c).height);
                            }

                            private JButton createZeroButton() {
                                return new JButton() {
                                    @Override
                                    public Dimension getMinimumSize() {
                                        return new Dimension(new Dimension(0, 0));
                                    }

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

                                    @Override
                                    public Dimension getMaximumSize() {
                                        return new Dimension(new Dimension(0, 0));
                                    }
                                };
                            }
                        });
                        return scroller;
                    }
                };
            }
        });

        JPanel mainPanel = new JPanel();
        mainPanel.add(comboBox);

        JFrame frame = new JFrame("Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Example();
            }
        });
    }

}

你可以試試下面的代碼從這個參考

private void updateScrollBar(JComboBox<E> box) {
    Object comp = box.getUI().getAccessibleChild(box, 0);

    if (comp instanceof JPopupMenu) {
        JPopupMenu popup = (JPopupMenu) comp;
        JScrollPane scrollPane = (JScrollPane) popup.getComponent(0);
        jScrollPane.getVerticalScrollBar().setPreferredSize(new Dimension(35, 35));
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM