GUI показывает элементы только после перетаскивания окна - PullRequest
6 голосов
/ 09 августа 2011
        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 ]

11 голосов
/ 09 августа 2011

Позвоните frame_ref.setVisible(true); после frame_ref.add(mainPanel_ref);.

. Здесь происходит следующее: вы показываете фрейм, вызывая frame_ref.setVisible(true);, а затем добавляете в него элементы.Таким образом, вы получите пустую рамку.Впоследствии, когда вы перетаскиваете или изменяете размер, он перерисовывается, и вы видите элементы.

9 голосов
/ 09 августа 2011

Позвоните 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. Компонент входа в систему часто лучше подходит для ввода JDialog или JOptionPane, чем JFrame.
  3. Это может быть лучше подходит для вложенного макета или другого макета, чем GridLayout
  4. setLocation() может быть заменено на:
    • Если вход в систему имеет родительский компонент, setLocationRelativeTo(Component).
    • Если вход в систему - первый видимый экран, setLocationByPlatform(true) (1.6 +).
  5. Проверьте источник на предмет других советов.
  6. Для более быстрой помощи, опубликуйте SSCCE .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...