我使用windowbuilder创建了3个GUI框架,按此顺序加载和显示。
显然可以首先加载Home.java,但是2个正在进行的GUI与Home.java同时加载。我可以验证它,因为我在方法中插入了一个打印语法,我初始化了GUI的元素。在Home.java上按下按钮后,我可以显示最后2个GUI,但内容已经加载。因此,当我需要将变量传递给这两个GUI时,该值变为null。有什么想法吗?
Home.Java按钮被按下。
//Compare Button
btnCompare.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(lbl_filecontainer1.getText() != "No File" && lbl_filecontainer2.getText() != "No File")
{
r1.setFileName1(lbl_filecontainer1.getText());
r1.Launch();
}
else if (lbl_filecontainer1.getText() == "No File" && lbl_filecontainer2.getText() != "No File")
{
JOptionPane.showMessageDialog(null, "No file 1 selected");
}
else if (lbl_filecontainer1.getText() != "No File" && lbl_filecontainer2.getText() == "No File")
{
JOptionPane.showMessageDialog(null, "No file 2 selected");
}
else
JOptionPane.showMessageDialog(null, "No files selected");
}
}
);
Results1.java
public class Results1 {
private JFrame frmFileOverall;
String FileName1;
//Instances
Database db = new Database();
/**
* Launch the application.
*/
public void Launch(String FileName) {
try {
setFileName1(FileName);
Results1 window = new Results1();
window.frmFileOverall.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Create the application.
*/
public Results1() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frmFileOverall = new JFrame();
frmFileOverall.setResizable(false);
frmFileOverall.setTitle("File 1 overall result");
frmFileOverall.setBounds(100, 100, 550, 450);
JLabel lblNewLabel = new JLabel("Number of words: ");
lblNewLabel.setFont(new Font("Verdana", Font.BOLD, 11));
JLabel lblNumberOfSentences = new JLabel("Number of sentences: ");
lblNumberOfSentences.setFont(new Font("Verdana", Font.BOLD, 11));
JLabel label_1 = new JLabel("Number of paragraphs: ");
label_1.setFont(new Font("Verdana", Font.BOLD, 11));
JTextArea txtAreaFile1 = new JTextArea();
txtAreaFile1.setEditable(false);
JLabel wordsContainerFile1 = new JLabel("New label");
JLabel sentencesContainerFile1 = new JLabel("New label");
JLabel paragraphsContainerFile1 = new JLabel("New label");
GroupLayout groupLayout = new GroupLayout(frmFileOverall.getContentPane());
groupLayout.setHorizontalGroup(
groupLayout.createParallelGroup(Alignment.LEADING)
.addGroup(groupLayout.createSequentialGroup()
.addContainerGap()
.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
.addComponent(txtAreaFile1, GroupLayout.DEFAULT_SIZE, 514, Short.MAX_VALUE)
.addGroup(groupLayout.createSequentialGroup()
.addComponent(lblNewLabel, GroupLayout.PREFERRED_SIZE, 124, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(wordsContainerFile1))
.addGroup(groupLayout.createSequentialGroup()
.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
.addComponent(label_1)
.addComponent(lblNumberOfSentences, GroupLayout.PREFERRED_SIZE, 151, GroupLayout.PREFERRED_SIZE))
.addPreferredGap(ComponentPlacement.RELATED)
.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
.addComponent(paragraphsContainerFile1)
.addComponent(sentencesContainerFile1))))
.addContainerGap())
);
groupLayout.setVerticalGroup(
groupLayout.createParallelGroup(Alignment.LEADING)
.addGroup(groupLayout.createSequentialGroup()
.addContainerGap()
.addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
.addComponent(lblNewLabel)
.addComponent(wordsContainerFile1))
.addPreferredGap(ComponentPlacement.RELATED)
.addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
.addComponent(lblNumberOfSentences)
.addComponent(sentencesContainerFile1))
.addPreferredGap(ComponentPlacement.RELATED)
.addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
.addComponent(label_1)
.addComponent(paragraphsContainerFile1))
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(txtAreaFile1, GroupLayout.DEFAULT_SIZE, 322, Short.MAX_VALUE)
.addContainerGap())
);
frmFileOverall.getContentPane().setLayout(groupLayout);
System.out.print(getFileName1());
//txtAreaFile1.setText(db.loadFile(getFileName()));
}
public void setFileName1(String fileName)
{
this.FileName1 = fileName;
}
public String getFileName1()
{
return this.FileName1;
}
}
答案 0 :(得分:3)
不仅仅是在按钮按下时显示已经创建的结果GUI,为什么不仅仅在按下按钮时创建结果GUI,即从Home JButton的ActionListener调用结果创建代码?总而言之,关键似乎是你何时以及如何创建结果GUI,而你似乎是在程序启动时这样做,当你应该这样做以回应来自用户的事件。
请注意,此处的许多人(包括我自己)建议您不要在用户处拍摄不同的窗口,而只使用一个JFrame作为GUI的视图,并使用CardLayout在此视图中更改JPanel。此外,许多人建议在使用代码生成工具(如Window Builder)之前先学习手动编写Swing GUI代码。这样,如果您以后使用它们,您将更好地了解代码生成工具正在做什么,并且将更容易使用它们 。
编辑1
请注意,我不确定你的意思是:
已经尝试使用普通类创建gui。仍然遇到同样的问题。
你是什么意思"使用正常的班级创建gui"?他们都是正常的班级。
编辑2
您的代码有点精神分裂,因为您有一个Results1对象创建 新 Results1对象,这就是您要搞砸的地方。让我们调用第一个Results1对象r1A和第二个r1B。我认为这就是发生的事情:
我的建议:
编辑3
关于你的代码:
if(lbl_filecontainer1.getText() != "No File" &&
lbl_filecontainer2.getText() != "No File") {
// ....
您不想使用!=
或==
来比较字符串,因为这会检查一个String 对象是否与另一个String 对象相同,可能会导致误导性结果。您想要知道两个String对象是否包含相同的文本,为此您要使用String方法equals(...)
或equalsIgnoreCase(...)
:
if(!"No File".equalsIgnoreCase(lbl_filecontainer1.getText()) &&
!"No File".equalsIgnoreCase(lbl_filecontainer2.getText())) {
// ....