GUI仅在拖动窗口后显示元素

时间:2011-08-09 11:44:45

标签: java swing user-interface layout

        frame_ref = new Frame("Login");
        mainPanel_ref = new Panel();
        buttonPanel_ref = new Panel();
        grid_ref = new GridLayout(4,2);
        frame_ref.setSize(300,120);
        frame_ref.setVisible(true);

        email_ref = new TextField();
        password_ref = new JPasswordField();

        mainPanel_ref.setLayout(grid_ref);
        mainPanel_ref.add(new Label("E-Mail"));
        mainPanel_ref.add(email_ref);
        mainPanel_ref.add(new Label("Passwort"));
        mainPanel_ref.add(password_ref);

        mainPanel_ref.add(submitLogin_ref);
        mainPanel_ref.add(fehlerMeldung_ref);

        frame_ref.add(mainPanel_ref);

我在上面用Java设置了一个视图。窗口完全为空,但在拖放其大小后,将显示所有元素。有人知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:11)

frame_ref.setVisible(true);之后致电frame_ref.add(mainPanel_ref);

这里发生的是:您通过调用frame_ref.setVisible(true);来显示框架,然后在其中添加元素。所以你得到一个空框架。然后当你拖动或调整大小时,它会被重新绘制,你可以看到元素。

答案 1 :(得分:9)

添加组件后,在pack()上致电JFrame。这样做会使框架呈现显示组件所需的最小尺寸。最后致电(setLocation()(4)&)setVisible(true)

Login Frame

import java.awt.GridLayout;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

class FrameTest {

    public void init() {
        frame_ref = new JFrame("Login");
        frame_ref.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainPanel_ref = new JPanel(new GridLayout(4,2,6,3));
        mainPanel_ref.setBorder(new EmptyBorder(5,5,5,5));

        email_ref = new JTextField();
        password_ref = new JPasswordField();
        mainPanel_ref.add(new JLabel("E-Mail"));
        mainPanel_ref.add(email_ref);
        mainPanel_ref.add(new JLabel("Passwort"));
        mainPanel_ref.add(password_ref);

        mainPanel_ref.add(new JLabel(""));
        mainPanel_ref.add(new JLabel(""));
        mainPanel_ref.add(submitLogin_ref);
        mainPanel_ref.add(fehlerMeldung_ref);

        frame_ref.add(mainPanel_ref);

        //frame_ref.setSize(300,120);
        frame_ref.pack();
        frame_ref.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new FrameTest().init();
            }
        });
    }

    private JFrame frame_ref;
    private JPanel mainPanel_ref;
    private JTextField email_ref;
    private JPasswordField password_ref;
    private JButton submitLogin_ref = new JButton("Submit Login");
    private JButton fehlerMeldung_ref = new JButton("Fehler Meldung");
}

其他提示:

  1. 不要将Swing与AWT混合使用。在定位Java 7 +之前,至少不是组件。
  2. 登录组件通常更适合放入JDialogJOptionPane而不是JFrame
  3. 这可能更适合嵌套布局或除GridLayout
  4. 之外的其他布局
  5. setLocation()可能会被换出:
    • 如果登录有“父”组件setLocationRelativeTo(Component)
    • 如果登录是第一个可见的屏幕,setLocationByPlatform(true)(1.6 +)。
  6. 仔细检查来源以获取其他提示。
  7. 为了更好地提供帮助,请发布SSCCE