Java Swing JFrame Layout

心不动则不痛 提交于 2019-12-17 18:55:01

问题


I just wrote a simple code where I want a textfield and a button to appear on the main frame, but after running all I see is the textfield.

If I write the code of the button after the textfield then only the button is displayed.

Any idea why?

    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:


Add your components to a JPanel and then add that panel to the ContentPane of 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:


The default layout on a JFrame is a BorderLayout. Calling the add method on a Container with such a layout is equivalent to a call add(..., BorderLayout.CENTER). Each of the locations of the BorderLayout can contain only one element. Hence making two calls

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

results in a CENTER containing the last component you added. If you want to avoid this you can either add it to different locations, or use another layout manager (for example a FlowLayout) by calling JFrame#setLayout




回答3:


Instead of adding directly Components to the JFrame, use a JPanel as container with the desired LayoutManager.

Here you can find several tutorials on layout managers.

Basically in Swing the LayoutManager is responsible for laying out the children Components (establishing their position and their size), so every container component you use inside your app, should be configured with the appropiate LayoutManager.




回答4:


JFrame's default Layout Manager is BorderLayout. If you want the automatic layout, you may use the FlowLayout:

mainframe.setLayout(new FlowLayout());

If you want to specify coordinates by setBounds() method, you have to cancel the setting of layout manager on JFrame:

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



回答5:


if you see BorderLayout Documentation mainframe.add(jb); is equals to mainframe.add(jb,BorderLayout.CENTER); mainframe.add(link); is equals to mainframe.add(jb,BorderLayout.CENTER);

so it just show the last one




回答6:


You can also use something like Flow Layout which is the default layout used by JPanel. It is used to arrange components in a line or a row. For example from left to right or from right to left:

Flow layout arranges components in line and if no space left all remaining components goes to next line. Align property determines alignment of the components as left, right, center etc.

To use it you will need to set JFrame layout by using JFrame.setLayout(layout) and to pass flow layout as a parameter.

Following example shows components arranged in flow 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();
    }
}

Check out to learn more about JFrame layouts.



来源:https://stackoverflow.com/questions/8660751/java-swing-jframe-layout

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!