Java 试图理解GUI Swing和线程
我有以下申请。它是有效的,我只是想更好地理解它。 所以我在主课上打了以下电话Java 试图理解GUI Swing和线程,java,multithreading,swing,swingbuilder,Java,Multithreading,Swing,Swingbuilder,我有以下申请。它是有效的,我只是想更好地理解它。 所以我在主课上打了以下电话 public static void main(String[] args) { Gui gui = new Gui(); gui.startGui(); } 在GUI类中 public Gui() { initialize(); } private void initialize() { mainWinFrm = new JFrame(); mainWinFrm.setTitle("
public static void main(String[] args)
{
Gui gui = new Gui();
gui.startGui();
}
在GUI类中
public Gui()
{
initialize();
}
private void initialize()
{
mainWinFrm = new JFrame();
mainWinFrm.setTitle("Inventory Tool");
JMenuBar menuBar = new JMenuBar();
mainWinFrm.getContentPane().add(menuBar, BorderLayout.NORTH);
.....//allot more GUI staff getting initialize
}
public void startGui()
{
try {UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());}
catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {}
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
Gui window = new Gui();
window.mainWinFrm.setLocationRelativeTo(null);
window.mainWinFrm.setMinimumSize(new Dimension(400, 200));
window.mainWinFrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.mainWinFrm.pack();
window.mainWinFrm.setVisible(true);
}
catch (Exception e)
{e.printStackTrace();}
}
});
}
上面代码的结构是由一个GUI构建器构建的,我想我正在试图理解发生了什么
我不理解的要点是,当我们在main类中构造对象gui时,它初始化所有变量,然后启动线程gui.startGui。该方法还创建一个新的gui对象窗口并初始化所有变量
这对我来说似乎不对。。。但是我不确定我是否遗漏了什么
谢谢你的建议/帮助
亚历克西斯是一个更好的方法:
Gui类:
public class Gui {
private JFrame mainWinFrm;
public Gui() {
initialize();
}
private void initialize() {
mainWinFrm = new JFrame();
mainWinFrm.setTitle("Inventory Tool");
JMenuBar menuBar = new JMenuBar();
mainWinFrm.getContentPane().add(menuBar, BorderLayout.NORTH);
}
public static void startGui() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
}
try {
Gui window = new Gui();
window.mainWinFrm.setLocationRelativeTo(null);
window.mainWinFrm.setMinimumSize(new Dimension(400, 200));
window.mainWinFrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.mainWinFrm.pack();
window.mainWinFrm.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
}
和主要类别:
public class MainClass {
public static void main(String[] args)
{
Gui.startGui();
}
}
这是一种更好的方法,因为它不会创建任何额外的对象。更好的方法:
Gui类:
public class Gui {
private JFrame mainWinFrm;
public Gui() {
initialize();
}
private void initialize() {
mainWinFrm = new JFrame();
mainWinFrm.setTitle("Inventory Tool");
JMenuBar menuBar = new JMenuBar();
mainWinFrm.getContentPane().add(menuBar, BorderLayout.NORTH);
}
public static void startGui() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
}
try {
Gui window = new Gui();
window.mainWinFrm.setLocationRelativeTo(null);
window.mainWinFrm.setMinimumSize(new Dimension(400, 200));
window.mainWinFrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.mainWinFrm.pack();
window.mainWinFrm.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
}
和主要类别:
public class MainClass {
public static void main(String[] args)
{
Gui.startGui();
}
}
这是一种更好的方法,因为它不会创建任何额外的对象。从查看 Gui类有点笨拙…但离可操作性不远 在初始化中,它创建UI的基础,在startUI中,它切换到事件调度线程,创建Gui的新实例,并显示主框架 奇怪的是在startUI中创建了Gui的第二个实例。相反,你可以做一些像
public Gui()
{
// It's arguable, but I'm paranoid, so I prefer to do anything related
// to the UI within the EDT...
}
private void initialize()
{
mainWinFrm = new JFrame();
mainWinFrm.setTitle("Inventory Tool");
JMenuBar menuBar = new JMenuBar();
mainWinFrm.getContentPane().add(menuBar, BorderLayout.NORTH);
.....//allot more GUI staff getting initialize
}
public void startGui()
{
try {UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());}
catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {}
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
// Initialize here instead...
initialize();
window.mainWinFrm.setLocationRelativeTo(null);
window.mainWinFrm.setMinimumSize(new Dimension(400, 200));
window.mainWinFrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.mainWinFrm.pack();
window.mainWinFrm.setVisible(true);
}
catch (Exception e)
{e.printStackTrace();}
}
});
}
这仍然不合适,因为现在可以在初始化之前访问类的某些部分,相反,我更喜欢做一些更像
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
// Initialise the system look and feel...
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex)
{
}
Gui window = new Gui();
window.mainWinFrm.setLocationRelativeTo(null);
window.mainWinFrm.setMinimumSize(new Dimension(400, 200));
window.mainWinFrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.mainWinFrm.pack();
window.mainWinFrm.setVisible(true);
}
});
}
public Gui()
{
initialize();
}
private void initialize()
{
mainWinFrm = new JFrame();
mainWinFrm.setTitle("Inventory Tool");
JMenuBar menuBar = new JMenuBar();
mainWinFrm.getContentPane().add(menuBar, BorderLayout.NORTH);
.....//allot more GUI staff getting initialize
}
首先看一看 Gui类有点笨拙…但离可操作性不远 在初始化中,它创建UI的基础,在startUI中,它切换到事件调度线程,创建Gui的新实例,并显示主框架 奇怪的是在startUI中创建了Gui的第二个实例。相反,你可以做一些像
public Gui()
{
// It's arguable, but I'm paranoid, so I prefer to do anything related
// to the UI within the EDT...
}
private void initialize()
{
mainWinFrm = new JFrame();
mainWinFrm.setTitle("Inventory Tool");
JMenuBar menuBar = new JMenuBar();
mainWinFrm.getContentPane().add(menuBar, BorderLayout.NORTH);
.....//allot more GUI staff getting initialize
}
public void startGui()
{
try {UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());}
catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {}
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
// Initialize here instead...
initialize();
window.mainWinFrm.setLocationRelativeTo(null);
window.mainWinFrm.setMinimumSize(new Dimension(400, 200));
window.mainWinFrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.mainWinFrm.pack();
window.mainWinFrm.setVisible(true);
}
catch (Exception e)
{e.printStackTrace();}
}
});
}
这仍然不合适,因为现在可以在初始化之前访问类的某些部分,相反,我更喜欢做一些更像
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
// Initialise the system look and feel...
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex)
{
}
Gui window = new Gui();
window.mainWinFrm.setLocationRelativeTo(null);
window.mainWinFrm.setMinimumSize(new Dimension(400, 200));
window.mainWinFrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.mainWinFrm.pack();
window.mainWinFrm.setVisible(true);
}
});
}
public Gui()
{
initialize();
}
private void initialize()
{
mainWinFrm = new JFrame();
mainWinFrm.setTitle("Inventory Tool");
JMenuBar menuBar = new JMenuBar();
mainWinFrm.getContentPane().add(menuBar, BorderLayout.NORTH);
.....//allot more GUI staff getting initialize
}
请看一下使用initialize方法和startGui方法是没有意义的。startGui方法是启动Swing UI的正确方法—它似乎不正确—Gui对象创建了两次:第一次在main中,第二次在startGui中。也许startGui应该声明为静态的,并称为Gui.startGui。是什么工具生成了这段代码?实际上,如果您在startGui方法中删除GUI的构造,那么它就更有意义了……removeguiwindow=newgui;图形用户界面也应该在EDT中创建。有很多旧的建议没有遵循这些建议,但建议已经更改,因此最好使用invokeLater将所有内容都封装在main中。看看使用initialize方法和startGui方法是没有意义的。startGui方法是启动Swing UI的正确方法—它似乎不正确—Gui对象创建了两次:第一次在main中,第二次在startGui中。也许startGui应该声明为静态的,并称为Gui.startGui。是什么工具生成了这段代码?实际上,如果您在startGui方法中删除GUI的构造,那么它就更有意义了……removeguiwindow=newgui;GUI也应该在EDT中创建。有很多旧的建议没有遵循,但建议已经改变,所以最好用invokeLater将所有内容都封装在main中。我可能会试图保护构造函数,以防止任何主体意外创建classwell的实例,这只是一个提示,不是最终的代码。开发人员应该始终使用预防措施来提高代码的效率,robustI可能会试图保护构造函数,以防止任何主体意外创建类实例。这只是一个提示,而不是最终的代码。开发人员应始终使用预防措施,以使代码高效和健壮