Java Swing JFrame Layout

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

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

Любая идея, почему?

    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);

Ответ 1

Добавьте ваши компоненты в 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);

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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

mainframe.setLayout(new FlowLayout());

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

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

Ответ 5

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

поэтому он просто показывает последний

Ответ 6

Вы также можете использовать что-то вроде 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.