首页 > 解决方案 > JFrame 未在 Eclipse Mac 中打开

问题描述

我正在尝试在我的 Mac 中通过 Eclipse 运行一个简单的 Swing 程序。应用程序运行,但我无法看到 UI 出现。

我在 Mac Mojave 和 Eclipse 版本:Oxygen.2 Release (4.7.2)

如果我通过命令行运行程序,这工作正常

下面是我的代码

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import org.saurav.simpletests.io.HttpClientTester;

public class HelloWorldSwing {

    public static void main (String[] args) {

        JFrame  frame  = new JFrame("Swing");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JLabel usernameLabel = new JLabel("Username");
        frame.getContentPane().add(usernameLabel);

        JTextField userText = new JTextField();
        frame.getContentPane().add(userText);


        JLabel passwordLabel = new JLabel("password");
        frame.getContentPane().add(passwordLabel);

        JTextField passwordText = new JTextField();
        frame.getContentPane().add(passwordText);

        JButton button = new JButton("Submit");
        frame.getContentPane().add(button);
        button.addActionListener(e -> {
            // TODO Auto-generated method stub
            String userName = userText.getText();

            String password = passwordText.getText();

            HttpClientTester httpClientTester = new HttpClientTester();
            httpClientTester.executeHttp(Constants.URL, userName, password);
        });
        frame.setSize(100,100);
        frame.pack();
        frame.setVisible(true);
    }
}

标签: javaswing

解决方案


请参阅以下 MCVE 中的注释:

import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class HelloWorldSwing {

    public static void main (String[] args) {

        JFrame  frame  = new JFrame("Swing");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        /*
         * JFrame (content pane) uses BorderLayout as default.
         * getContentPane().add(c) adds c to BorderLayout.CENTER location which
         * can hold only one component, so each add() overwrite the previous one.
         * One solution is to use another layout manager like FlowLayout
         */
        frame.getContentPane().setLayout(new FlowLayout());

        JLabel usernameLabel = new JLabel("Username");
        frame.getContentPane().add(usernameLabel);

        JTextField userText = new JTextField(10); //set text field size
        frame.getContentPane().add(userText);

        JLabel passwordLabel = new JLabel("password");
        frame.getContentPane().add(passwordLabel);

        JTextField passwordText = new JTextField(10); //set text field size
        frame.getContentPane().add(passwordText);

        JButton button = new JButton("Submit");
        frame.getContentPane().add(button);
        button.addActionListener(e -> {});//this is not needed to demonstrate the problem
        //frame.setSize(100,100); do not set size. Let pack set the size 
        frame.pack();
        frame.setVisible(true);
    }
}

在此处输入图像描述


推荐阅读