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

最白目*_*最白目 6 java layout user-interface swing

        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);
Run Code Online (Sandbox Code Playgroud)

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

Har*_*Joy 11

通话frame_ref.setVisible(true);frame_ref.add(mainPanel_ref);.

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

  • 或者在添加mainPanel_ref之后调用revalidate()和repaint() (2认同)
  • @StanislavL:这不是正确的解决方案.你应该在它之前完全添加东西之后显示你的框架,然后添加东西然后调用repaint(). (2认同)

And*_*son 9

pack()JFrame添加组件后调用.这样做会使框架呈现显示组件所需的最小尺寸.最后打电话(setLocation()(4)&)setVisible(true).

登录框架

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");
}
Run Code Online (Sandbox Code Playgroud)

其他提示:

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