我正在为一个确认项目制作一个简单的圣经阅读器,我有一个UI类。该类在主类调用时打开一个窗口。我只是对静态关键字的多个错误感到满意,但还有一件事 - 我的prepareGUI方法。它应该被声明为静态吗?无论如何,我的IDE都不会出错。
package input;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class UI extends JFrame {
private static final long serialVersionUID = 4226151097999382106L;
private static JFrame mainFrame;
private static JLabel headerLabel;
private static JLabel statusLabel;
private static JPanel controlPanel;
public UI() {
prepareGUI();
}
private static/* Should that be there? */ void prepareGUI() {
mainFrame = new JFrame("Holy Bible");
mainFrame.setSize(700, 500);
mainFrame.setLayout(new GridLayout(3, 1));
mainFrame.setLocationRelativeTo(null);
mainFrame.getContentPane().setBackground(Color.WHITE);
mainFrame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent windowEvent) {
System.exit(0);
}
});
headerLabel = new JLabel("", JLabel.CENTER);
statusLabel = new JLabel("", JLabel.CENTER);
statusLabel.setSize(350, 100);
controlPanel = new JPanel();
controlPanel.setBackground(Color.WHITE);
controlPanel.setLayout(new FlowLayout());
mainFrame.add(headerLabel);
mainFrame.add(controlPanel);
mainFrame.add(statusLabel);
headerLabel.setText((String) ReadFile.currentBookData[0]);
JLabel label = new JLabel("", JLabel.CENTER);
label.setText((String) ReadFile.currentBookData[2]);
label.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 12));
controlPanel.add(label);
mainFrame.setVisible(true);
}
public void updateText() {
headerLabel.setText((String) ReadFile.currentBookData[4]);
statusLabel.setText((String) ReadFile.currentBookData[4]);
}
}
答案 0 :(得分:2)
您的UI
课程中包含所有static
个字段,这就是您需要将prepareGUI()
方法标记为static
的原因。谨防!每次创建UI
类的对象时,只需覆盖现有的mainFrame
。
如果您只创建UI
类的单个实例,那么最好使用Singleton
模式以避免混淆。
答案 1 :(得分:1)
你正在以错误的方式解决问题。解决方案不是让一切都是静态的,而是要解决初始代码问题,以便开始时不需要静态。请理解,开发面向对象编程的原因是为了提供代码结构,降低代码复杂性并增加代码重用。通过使所有这些保持静止,你将所有的好处抛到了一边。
答案 2 :(得分:1)
对于像这样的swing代码,使成员静态似乎不是一个好的选择。这些成员是与类的一个实例相关联的事物,而不是与整个类相关联的事物。初始化构造函数中的组件是合理的,即使它们是实例成员也是如此。
Oracle教程中的示例很难实现,教程坚持使用NetBeans。但是examples for the O'Reilly Swing book很容易找到,并且它们在构造函数中初始化组件。这比使用静态字段更好。
答案 3 :(得分:1)
“修复”错误的方式违背了OOP的概念。 static
方法和字段是类本身的“属性”,其中非静态方法和字段是所述类的实例(对象)的“属性”。
您应该从字段和static
方法中删除prepareGUI()
关键字:
//private JFrame mainFrame; you only have one instance, so no point in having a global field
private JLabel headerLabel;
private JLabel statusLabel;
private JPanel controlPanel;
private /*static Should that be there? answer is no. */ void prepareGUI() {
JFrame mainFrame = new JFrame("Holy Bible");
(...)
}
答案 4 :(得分:0)
构造函数方法应该只初始化类成员,就是这样。最佳做法是在之后调用静态方法。
答案 5 :(得分:0)
static是必要的。我的意思是没有从类创建一个对象 静态方法或属性可以在其他类中调用而无需像这样创建Object - > Classname.staticMethod();