Как установить ширину Java ComboBox так же широко, как JPanel, в которой он находится? - PullRequest
1 голос
/ 03 мая 2011

Мне было интересно, есть ли способ установить ширину ComboBox так же широко, как JPanel, в которой он находится. У меня есть следующий фрагмент кода:

    public newPanel() {
        setLayout(new GridLayout(2,0));

        String[] example = new String[] {"one, "two", "three", "four"};

        JComboBox cBox = new JComboBox(levels);
        cBox.setPreferredSize(new Dimension(300, 20));

        this.add(new JLabel("This is text that goes above the ComboBox:"));
        this.add(cBox);
    }

Вы можете видеть, что я сказал, что хочу, чтобы ComboBox имел ширину 300 пикселей, но есть ли способ автоматически настроить его так же широко, как Panel, в которой он находится? Что-то вроде cBox.setPreferredWidth (max); (Я знаю, что этого не существует, я просто показываю свое мышление).

Спасибо!

Ответы [ 4 ]

2 голосов
/ 03 мая 2011

Как уже отмечали некоторые другие, заполнение пространства comboBox поддерживается несколькими LayoutManager.Поведение точное остается на усмотрение конкретного менеджера.Нет никакого способа узнать, что они делают :-) Затем решите, какое поведение вы хотите, и выберите подходящее, не забывая, что вокруг есть отличные менеджеры LayoutManager от сторонних производителей.полная ширина, но при увеличении высоты рамы сохраняйте ее «разумную» однострочность.BoxLayout может сделать это с небольшой помощью вашего кода: он учитывает максимальную подсказку компонента, если она есть.Некоторые компоненты (например, JLabel) возвращают что-то разумное, другие (например, JComboBox) - нет.

Ниже приведен фрагмент, который добавляет максимальный размер в поле со списком.

    JComponent panel = new JPanel();
    panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));

    String[] levels = new String[] { "one", "two", "three", "four" };

    JComboBox cBox = new JComboBox(levels) {

        @Override
        public Dimension getMaximumSize() {
            Dimension dim = super.getMaximumSize();
            dim.height = getPreferredSize().height;
            return dim;
        }

    };

    panel.add(new JLabel("This is text that goes above the ComboBox:"));
    panel.add(cBox);
2 голосов
/ 03 мая 2011

есть ли способ автоматически настроить его так же широко, как панель, в которой он находится?

Возможно, вы захотите, чтобы менеджер по расположению позаботился об этом.

Если вы не установите предпочитаемую ширину, GridLayout убедится, что поле со списком заполнит всю панель горизонтально.

Этот фрагмент ...

import java.awt.GridLayout;
import javax.swing.*;

class Test {
    public static void main(String[] args) {

        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(2,0));

        String[] example = new String[] {"one", "two", "three", "four"};

        JComboBox cBox = new JComboBox(example);
        //cBox.setPreferredSize(new Dimension(300, 20));

        panel.add(new JLabel("This is text that goes above the ComboBox:"));
        panel.add(cBox);
        panel.setBorder(BorderFactory.createTitledBorder("Panel border"));

        frame.setContentPane(panel);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}

... приводит к

enter image description here

Если это не достаточно гибко для вас, я бы порекомендовал вам использовать GridBagLayout.

1 голос
/ 03 мая 2011

Вы можете сделать это, используя BoxLayout и отображая элементы сверху вниз. Он будет автоматически использовать их максимальный размер

Вы можете посмотреть на это, если хотите глубже понять: http://blogs.oracle.com/CoreJavaTechTips/entry/getting_to_know_boxlayout

    class newPanel extends JPanel{
        public newPanel(){
            setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

            String[] levels = new String[] {"one", "two", "three", "four"};

            JComboBox cBox = new JComboBox(levels);
            //cBox.setPreferredSize(new Dimension(300, 20));

            add(new JLabel("This is text that goes above the ComboBox:"));
            add(cBox);
        }
   }
1 голос
/ 03 мая 2011

Вы можете использовать GridBagLayout в качестве менеджера макета с ограничениями заполнения. ГОРИЗОНТАЛЬНО:

this.setLayout(new GridBagLayout());
this.add(cBox,new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
...