无法在Eclipse Mac中打开JFrame

时间:2019-04-11 04:30:14

标签: java swing

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

我使用的是Mac Mojave和Eclipse版本:Oxygen.2版本(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);
    }
}

3 个答案:

答案 0 :(得分:3)

请参阅以下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);
    }
}

enter image description here

答案 1 :(得分:2)

先进行setSize调用再进行pack调用是没有意义的。 pack的作用:

  

使此窗口的大小适合其子组件的首选大小和布局。如果任意一个尺寸小于上一次调用setMinimumSize方法指定的最小尺寸,则窗口的宽度和高度将自动放大。 [...]

如果您严格希望从调用setSize中获取大小,请不要pack,或者不要setSize并为您的组件中的组件选择合适的首选大小(如果需要的话,请选择最小大小)窗口。

答案 2 :(得分:0)

问题出在类加载中。

我有一些使用SWT依赖项的类,它们在类路径中。 SWT和Swing似乎存在一些问题并存。

一旦我删除了SWT依赖项,Frame就会出现在屏幕上。

相关问题