Невозможно оставить вертикальный разрыв - PullRequest
0 голосов
/ 04 мая 2011
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.net.URI;

class MainPageTypo {
    JFrame fr;
    JButton easy, medium, tough;
    JLabel Contact;

    MainPageTypo() {
        buildGUI();
        hookUpEvents();
    }

    public void buildGUI() {
        fr = new JFrame("TypoMaster");
        JPanel mainP = new JPanel();
        mainP.setLayout(new FlowLayout());
        JPanel LevelPanel = new JPanel();
        LevelPanel.setLayout(new GridLayout(3, 0, 50, 50));
        easy = new JButton("Easy");
        medium = new JButton("Medium");
        tough = new JButton("Tough");
        Contact = new JLabel("Visit my Blog");
        fr.add(mainP);
        LevelPanel.add(easy);
        LevelPanel.add(medium);
        LevelPanel.add(tough);
        LevelPanel.setBackground(Color.magenta);
        LevelPanel.setBorder(BorderFactory.createEmptyBorder(50, 50, 50, 50));
        mainP.add(LevelPanel);
        mainP.setBackground(Color.lightGray);
        fr.setSize(500, 500);
        fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fr.setVisible(true);
        // fr.setResizable(false);
    }

    public void hookUpEvents() {

    }

    public static void main(String args[]) {
        new MainPageTypo();
    }
}

Это мой полный код. Я хочу оставить вертикальное пространство сверху JPanel (). Я использую LevelPanel.setBorder(BorderFactory.createEmptyBorder(50,50,50,50)); , но не могу получить вертикальный разрыв. Как я могу получить это?

Ответы [ 2 ]

4 голосов
/ 04 мая 2011

Из того, что вы говорите, я только догадываюсь, что вы, возможно, захотите получить что-то, установив границу на главной панели:

mainP.setBorder(BorderFactory.createEmptyBorder(50, 50, 50, 50));

Пожалуйста, дайте нам больше подробностей.Потому что вы получаете разрыв.Возможно, нарисуйте быструю и неприятную картину.:)

Рекомендация Пожалуйста, следуйте соглашениям об именах Java, т. Е. Имена переменных должны начинаться со строчной буквы.

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

По сути, вы должны понять, какая часть головоломки отвечает за то, что

  • устанавливает границу для контейнера (здесь levelPanel) добавляет пространство-требованиек самому контейнеру (как уже объяснил @Boro): LayoutManager, применяемый к этому контейнеру, будет размещать дочерние элементы контейнера только внутри вставок, как того требует граница.Это то, что вы видите в levelPanel, красный над первой кнопкой, под последней кнопкой (по бокам от всех кнопок)

  • установка свойств разрыва x / y в LayoutManager, которыйподдерживать это, имеет эффекты, которые полностью решаются самим менеджером, и никак не могут прочитать приложение конкретного менеджера.

Документ API для GridLayout:

 * In addition, the horizontal and vertical gaps are set to the 
 * specified values. Horizontal gaps are placed between each
 * of the columns. Vertical gaps are placed between each of
 * the rows. 

Документ API для FlowLayout:

 * @param      hgap    the horizontal gap between components
 *                     and between the components and the 
 *                     borders of the <code>Container</code>
 * @param      vgap    the vertical gap between components
 *                     and between the components and the 
 *                     borders of the <code>Container</code>

Исходя из вашего кода, вы ожидаете достичьGridLayout будет иметь такое же поведение гэпа, что и FlowLayout: -)

Поскольку LayoutManager родительского уровня levelPanel (parent == mainP) - FlowLayout, вы можете - в качестве альтернативы для установки Border в mainP- установить разрыв FlowLayout:

 mainP.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 50));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...