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.