Сколько деталей вертикального поля я могу иметь в приложении Java Swing? - PullRequest
0 голосов
/ 30 августа 2018

Мне известны подробности полей NORTH, CENTER и SOUTH для установки компонента (например, BorderLayout) на верхнюю, среднюю или нижнюю соответственно, однако мне было интересно, возможно ли иметь более трех компонентов, и если да, то Как мне поступить с дополнительными полевыми данными?

В настоящее время у меня есть следующее.

Север - BorderLayout

Центр - GridLayout

Юг - GridBagLayout

Я хочу добавить дополнительный GridBagLayout в конец программы (ниже или выше существующего GridBagLayout). Как мне добавить дополнительный макет, чтобы он не мешал и не сливался с текущей областью ЮГ?

Код:

public class boggleView extends JFrame {    
    public  boggleView(){
        super("Boggle");
        setResizable(false);
        setLocationRelativeTo(null);
        setMinimumSize(new Dimension(400, 400));

        JPanel northPanel = new JPanel();
        JPanel middlePanel = new JPanel();
        JPanel southPanel = new JPanel();
        JPanel southPanelBottom = new JPanel();

        // North Panel
        getContentPane().add(northPanel, BorderLayout.NORTH);
        northPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
        JLabel gameBoardTitle = new JLabel("<html><font size = 5>Game Board</font></html>");
        northPanel.add(gameBoardTitle);

        // Middle Panel
        getContentPane().add(middlePanel, BorderLayout.CENTER);
        middlePanel.setLayout(new GridLayout(4,4));
        for(int button=0 ; button<16 ; button++){
            JButton diceButton = new JButton(String.valueOf("<html><font size = 10>E</font></html>"));
            diceButton.setBackground(Color.WHITE);
            diceButton.setBorder(new LineBorder(Color.BLACK));
            diceButton.setPreferredSize(new Dimension(100, 100));
            middlePanel.add(diceButton);
        }

        // South Panel        
        southPanel.setLayout (new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.insets = new Insets(10,10,0,10);
        c.fill = GridBagConstraints.HORIZONTAL;
        Border wordBorder = BorderFactory.createLineBorder(Color.BLACK, 1);
        Border textFieldBorder = BorderFactory.createLineBorder(Color.BLACK, 2);
        JButton button;

        JLabel textField = new JLabel("");
        textField.setBorder(textFieldBorder);
        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = 8;
        textField.setPreferredSize(new Dimension(0,35));
        southPanel.add(textField, c);

        button = new JButton("Submit");
        c.gridx = 0;
        c.gridy = 1;
        c.gridwidth = 1;
        button.setBackground(Color.GREEN);
        button.setPreferredSize(new Dimension(80, 35));
        southPanel.add(button, c);

        button = new JButton("Cancel");
        c.gridx = 2;
        c.gridy = 1;
        c.gridwidth = 1;
        button.setBackground(Color.RED);
        button.setPreferredSize(new Dimension(80, 35));
        southPanel.add(button, c);

        button = new JButton("Restart");
        c.gridx = 4;
        c.gridy = 1;
        c.gridwidth = 1;
        button.setBackground(Color.CYAN);
        button.setPreferredSize(new Dimension(80, 35));
        southPanel.add(button, c);

        button = new JButton("Info");
        c.gridx = 6;
        c.gridy = 1;
        c.gridwidth = 1;
        button.setBackground(Color.CYAN);
        button.setPreferredSize(new Dimension(80, 35));
        southPanel.add(button, c);

        JLabel wordListTitle = new JLabel("<html><font size = 5>Recent Words</font></html>");
        c.gridx = 0;
        c.gridy = 2;
        c.gridwidth = 3;
        c.insets = new Insets(0,5,0,0);
        southPanel.add(wordListTitle, c);


        // Bottom South Panel
        southPanelBottom.setLayout (new GridBagLayout());
        GridBagConstraints d = new GridBagConstraints();
        d.fill = GridBagConstraints.HORIZONTAL;
        d.insets = new Insets(0,0,0,0);

        JLabel word  = new JLabel("<html><font size = 5>HAT</font></html>");
        word.setBorder(wordBorder);
        d.gridx = 0;
        d.gridy = 3;
        d.gridwidth = 2;
        southPanelBottom.add(word, d);

        JLabel word2 = new JLabel("<html><font size = 5>1</font></html>");
        word2.setBorder(wordBorder);
        d.gridx = 2;
        d.gridy = 3;
        d.gridwidth = 1;
        southPanelBottom.add(word2, d);

        getContentPane().add(southPanel, BorderLayout.SOUTH);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }
}

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

используйте новую вспомогательную панель с макетом Borderlayout.

поместите вашу новую панель GridBagLayout на юг этой новой вспомогательной панели и поместите существующую панель GridBagLayout (в настоящее время на ЮГ) на север этой панели.

затем поместите эту новую вспомогательную панель на юг, заменив старую панель GridBagLayout.

    JPanel southHelperPanel = new JPanel(new BorderLayout());
    southHelperPanel.add(southPanel, BorderLayout.NORTH); 
    southHelperPanel.add(southPanelBottom, BorderLayout.SOUTH); 

    getContentPane().add(southHelperPanel, BorderLayout.SOUTH);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    pack();
    setVisible(true);
0 голосов
/ 30 августа 2018

Вы можете просто комбинировать макеты по мере необходимости. Пожалуйста, посмотрите на приведенный ниже пример. В этом примере основная панель имеет BorderLayout. В разные стороны этой панели я добавляю новые панели с другими макетами.

public class Test extends JFrame {

    public static void main(String[] args) {
        Test test = new Test();
        test.setVisible(true);
    }

    public Test() {

        JPanel main = new JPanel(new BorderLayout());

        JPanel top = new JPanel(new FlowLayout());
        JPanel center = new JPanel(new GridBagLayout());
        JPanel bottom = new JPanel(new BorderLayout());

        main.add(top, BorderLayout.PAGE_START);
        main.add(center, BorderLayout.CENTER);
        main.add(bottom, BorderLayout.PAGE_END);

        this.getContentPane().add(main);
        this.setSize(800, 500);
    }
}

Вы также можете назначить основной панели другой макет (например, GridBagLayout), если вам нужно больше «указаний» в начале.

0 голосов
/ 30 августа 2018

BorderLayout не может сам сделать это; он может только выложить 3 вещи по вертикали. Переключите контейнер (window.getContentPane(), предположительно) на другой макет.

Что-то похожее на BorderLayout - использовать BoxLayout; Мне нужно знать немного больше о том, что именно находится в этих подкомпонентах, чтобы быть уверенным, что это правильная замена здесь.

...