所以我发现了在java中实现swing GUI的多种方法,但不知道每个方法做了什么,我的老师也无法帮助我。创建JFrame的一种方法是:
import javax.swing.*;
import java.awt.*;
public class UI extends JFrame{
public UI() {
initaliseGUI();
}
private void initaliseGUI(){
setTitle("My Title");
setBackground(Color.red);
setSize(800,500);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args){
EventQueue.invokeLater(new Runnable(){
@Override
public void run(){
UI M = new UI();
M.setVisible(true);
}
});
}
但另一种实现方式是:
import javax.swing.*;
import java.awt.*;
public class Main{
public static void main(String[] args){
JFrame window = new JFrame();
window.setSize(500,500);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = window.getContentPane();
c.setBackground(Color.red);
window.setBackground(Color.red);
window.setTitle("main");
JLabel message = new JLabel("JLabel");
window.add(message);
window.setVisible(true);
}
}
每个人的工作方式和我应该在何时使用另一个之间有什么区别?在这种情况下,runnable如何工作?
三江源!
答案 0 :(得分:2)
您的第一个示例调用EventQueue invokeLater方法,但扩展了JFrame。
您的第二个示例将所有内容放在静态方法main中,并且不运行invokeLater方法。
这是我启动Swing应用程序的一种方法。
public class TryingProject2 implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new TryingProject2());
}
@Override
public void run() {
JFrame frame = new JFrame("Color Gradient Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(createMainPanel());
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private JPanel createMainPanel() {
JPanel panel = new JPanel();
// Add your Swing components here
return panel;
}
}
我没有扩展Swing组件。我使用Swing组件。扩展Swing组件或任何Java类的唯一时间是要覆盖其中一个类方法。
SwingUtilities invokeLater方法与EventQueue invokeLater方法相同。此方法将所有Swing组件的创建和更新放在Event Dispatch thread。
上我实现了Runnable,因为它使invokeLater方法参数成为类的实例。
我在方法中创建主面板,以使JFrame代码与JPanel代码分开。