Как остановить BasicArrowButton от расширения, чтобы занять всю панель инструментов?

Я создаю окно с JToolBar, содержащим две кнопки. Один обычный JButton, а другой BasicArrowButton (javax.swing.plaf.basic.BasicArrowButton). Без какой-либо дополнительной настройки JButton не расширяется на панели инструментов, но BasicArrowButton расширяется, чтобы занять всю панель инструментов.

Я попытался настроить его так, чтобы он помещался в небольшой квадрат 16x16, установив его максимальный и предпочтительный размер на 16x16. Но это не работает. Также безуспешно пытался использовать setSize(). Может ли кто-нибудь сказать мне, где может быть проблема?

Я также пытался использовать горизонтальный клей (я использую WindowBuilder с Eclipse) справа от BasicArrowButton. Это тоже не сработало.

Я использую JDK1.7.0_07.

public class ToolbarTest {

    private JFrame frame;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    ToolbarTest window = new ToolbarTest();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public ToolbarTest() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JToolBar toolBar = new JToolBar();
        frame.getContentPane().add(toolBar, BorderLayout.NORTH);

        JButton btnEdit = new JButton("Edit");
        toolBar.add(btnEdit);

        //------------------------------------------------------------
        JButton btnUp = new BasicArrowButton(BasicArrowButton.NORTH);
        btnUp.setSize(new Dimension(16, 16));
        btnUp.setMaximumSize(new Dimension(16, 16));
        toolBar.add(btnUp);
        //------------------------------------------------------------
    }
}

введите здесь описание изображения


person iaswtw    schedule 21.01.2013    source источник
comment
Чтобы быстрее получить помощь, опубликуйте SSCCE. Вероятно, вам нужно переопределить getMaximumSize(), чтобы вместо этого возвращалось getPreferredSize().   -  person Andrew Thompson    schedule 22.01.2013
comment
Не рекомендуется использовать компоненты из пакетов Look and Feel таким образом.   -  person MadProgrammer    schedule 22.01.2013
comment
Вы не должны устанавливать размеры. Вместо этого попробуйте использовать менеджер компоновки: toolBar.setLayout(...);   -  person Vlad Topala    schedule 22.01.2013
comment
@MadProgrammer Спасибо. Я не знал об этом. Я читаю об этом сейчас. Теперь я бы предпочел использовать кнопку со значком стрелки.   -  person iaswtw    schedule 22.01.2013
comment
Попробуйте добавить пустой JPanel или JLabel() в качестве третьего компонента   -  person StanislavL    schedule 22.01.2013


Ответы (2)


Внутри JToolBar использует DefaultToolBarLayout, подкласс BoxLayout. Вы можете заменить свой собственный, используя setLayout(). FlowLayout может быть подходящим выбором:

JToolBar bar = new JToolBar("Edit Menu");
bar.setLayout(new FlowLayout(FlowLayout.LEFT));
person trashgod    schedule 22.01.2013

Еще один пример, почему вы не должны вызывать ни один из методов setXXSize :-)

Как уже упоминалось @trashgod, LayoutManager по умолчанию для JToolBar — это BoxLayout, который учитывает maxSize компонента. Поэтому попытка каким-то образом заставить кнопку возвращать что-то разумное — это шаг в правильном направлении. Что, как ни странно, не имеет никакого эффекта.

Причина, по которой это здесь не действует, заключается в том, что ... BasicArrowButton возвращает жестко запрограммированные размеры, то есть значение, установленное через XX, просто игнорируется. Вот основной фрагмент:

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

Выход состоит в том, чтобы расширить и переопределить, например:

JButton btnUp = new BasicArrowButton(BasicArrowButton.NORTH) {

    @Override
    public Dimension getMaximumSize() {
        return getPreferredSize();
    }

};
person kleopatra    schedule 22.01.2013