我试图在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);
}
}
答案 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);
}
}
答案 1 :(得分:2)
先进行setSize
调用再进行pack
调用是没有意义的。 pack的作用:
使此窗口的大小适合其子组件的首选大小和布局。如果任意一个尺寸小于上一次调用setMinimumSize方法指定的最小尺寸,则窗口的宽度和高度将自动放大。 [...]
如果您严格希望从调用setSize中获取大小,请不要pack
,或者不要setSize
并为您的组件中的组件选择合适的首选大小(如果需要的话,请选择最小大小)窗口。
答案 2 :(得分:0)
问题出在类加载中。
我有一些使用SWT依赖项的类,它们在类路径中。 SWT和Swing似乎存在一些问题并存。
一旦我删除了SWT依赖项,Frame就会出现在屏幕上。