Java Swing JFrame Layout - PullRequest
       85

Java Swing JFrame Layout

11 голосов
/ 29 декабря 2011

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

Если я напишу код кнопки послетекстовое поле, тогда отображается только кнопка.

Есть идеи почему?

    JFrame mainframe=new JFrame();
    mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    mainframe.setBounds(0,0,200,200);
    JButton jb=new JButton();
    jb.setText("Leech");
    mainframe.add(jb);
    JTextField link=new JTextField(50);
    mainframe.add(link);
    mainframe.pack();
    mainframe.setVisible(true);

Ответы [ 6 ]

11 голосов
/ 29 декабря 2011

Макет по умолчанию для JFrame - BorderLayout. Вызов метода add на Container с такой раскладкой эквивалентен вызову add(..., BorderLayout.CENTER). Каждое из местоположений BorderLayout может содержать только один элемент. Следовательно, сделав два звонка

mainframe.add(jb);
mainframe.add(link);

приводит к центру, содержащему последний добавленный вами компонент. Если вы хотите избежать этого, вы можете добавить его в другое место или использовать другой менеджер макета (например, FlowLayout), позвонив по номеру JFrame#setLayout

9 голосов
/ 29 декабря 2011

Вместо непосредственного добавления компонентов в JFrame, используйте JPanel в качестве контейнера с нужным LayoutManager .

Здесь вы можете найти несколько руководств по менеджерам компоновки.

В основном в Swing LayoutManager отвечает за разметку дочерних Компонентов (установление их положения и размера), поэтому каждый компонент контейнера, который вы используете в своем приложении, должен быть настроен с соответствующим LayoutManager.

5 голосов
/ 29 декабря 2011

Добавьте ваши компоненты в JPanel, а затем добавьте эту панель в ContentPane JFrame.

JFrame window = new JFrame();
JPanel mainframe = new JPanel();

window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setBounds(0,0,200,200);

JButton jb = new JButton();
jb.setText("Leech");

mainframe.add(jb);

JTextField link = new JTextField(50);
mainframe.add(link);

window.getContentPane().add(mainframe);
window.pack();
window.setVisible(true);
0 голосов
/ 04 мая 2019

Вы также можете использовать что-то вроде Flow Layout , который является макетом по умолчанию, используемым JPanel.Используется для размещения компонентов в строке или ряду.Например, слева направо или справа налево:

enter image description here

Компоновка потока размещает компоненты в линию, а если свободного места не осталось, все остальные компоненты переходят к следующемулиния.Свойство Align определяет выравнивание компонентов по левому, правому краю, центру и т. Д.

Чтобы использовать его, вам нужно установить макет JFrame с помощью JFrame.setLayout (layout) и передать макет потока в качестве параметра.

В следующем примере показаны компоненты, расположенные в макете потока:

package example.com;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;

public class FlowLayoutExample {

    FlowLayoutExample(){
        JFrame frame = new JFrame("Flow Layout");
        JButton button, button1, button2, button3, button4;
        button = new JButton("button 1");
        button1 = new JButton("button 2");
        button2 = new JButton("button 3");
        button3 = new JButton("button 4");
        button4 = new JButton("button 5");
        frame.add(button);
        frame.add(button1);
        frame.add(button2);
        frame.add(button3);
        frame.add(button4);
        frame.setLayout(new FlowLayout());
        frame.setSize(300,300);  
        frame.setVisible(true);  

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

Ознакомьтесь с , чтобы узнать больше о макетах JFrame .

0 голосов
/ 06 июня 2017

если вы видите документацию BorderLayout mainframe.add (ДБ); равно mainframe.add (jb, BorderLayout.CENTER); mainframe.add (ссылка); равно mainframe.add (jb, BorderLayout.CENTER);

так что просто покажи последний

0 голосов
/ 27 сентября 2014

Диспетчером макетов JFrame по умолчанию является BorderLayout. Если вам нужна автоматическая разметка, вы можете использовать FlowLayout:

mainframe.setLayout(new FlowLayout());

Если вы хотите указать координаты методом setBounds (), вам нужно отменить настройку менеджера компоновки в JFrame:

mainframe.setLayout(null);
jb.setBounds(10,10,100,50);
link.setBounds(10,70,180,100);
...