使用可编译的示例进行全面重新编辑,以澄清我的问题。
总体程序: MainFrame 类显示一个带有 SQL 查询结果的 JTable。MainFrame 还具有用于刷新、添加、更新和查询表的 JButton。单击更新按钮使文本区域和提交按钮可见。用户可以在文本区域中输入 ID 号。当他们单击提交新框架时,UpdateFrame 会打开记录中与 ID 号相对应的所有数据。
MainFrame 和 UpdateFrame 的精简版本如下。
UpdateFrame2.java
package kft1task4;
import javax.swing.*;
import java.awt.event.*;
import java.sql.SQLException;
import javax.swing.JScrollPane;
public class UpdateFrame2 extends JFrame implements ActionListener {
JPanel pane = new JPanel();
JTextArea jta = new JTextArea("This is a text area");
UpdateFrame2() {
setVisible(true);
setBounds(1000,400,1000,500);
pane.setLayout(null);
add(pane);
jta.setBounds(110,100,100,15);
pane.add(jta);
}
@Override
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
} //End actionListener
} //End class
很简单。一帧一屏一JTextArea。JTextArea 应该是可编辑的;我应该可以输入它。
MainFrame2.java
package kft1task4;
import java.awt.event.*;
import java.sql.SQLException;
import javax.swing.*;
public class MainFrame2 extends JFrame implements ActionListener {
JPanel pane = new JPanel();
JButton closeButt = new JButton("Push me to close the program");
JButton updateButt = new JButton("Push me to update a record");
JButton submitUpdButt = new JButton("Submit");
JLabel updateLabel = new JLabel("Select student id to update");
JTextArea updateTA = new JTextArea();
MainFrame2(){
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(1000,200,1500,1000);
pane.setLayout(null);
add(pane);
updateButt.setBounds(620,550,200,100);
updateButt.addActionListener(this);
pane.add(updateButt);
closeButt.setBounds(1290,550,200,100);
closeButt.addActionListener(this);
pane.add(closeButt);
submitUpdButt.setBounds(820,735,200,25);
submitUpdButt.addActionListener(this);
submitUpdButt.setVisible(false);
pane.add(submitUpdButt);
updateLabel.setBounds(620,700,200,15);
updateLabel.setVisible(false);
pane.add(updateLabel);
updateTA.setBounds(820,700,200,15);
updateTA.setVisible(false);
pane.add(updateTA);
}
@Override
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
if(source == closeButt){
System.exit(0);
}
if(source == updateButt){
updateLabel.setVisible(true);
updateTA.setVisible(true);
submitUpdButt.setVisible(true);
}
if(source == submitUpdButt){
//submitUpdButt.setVisible(false);
new UpdateFrame2();
updateTA.setText(null);
updateTA.setVisible(false);
updateLabel.setVisible(false);
submitUpdButt.setVisible(false);
}
}
}
请注意三个字段:updateLabel、updateTA 和 submitUpdButt(请原谅糟糕的命名)。首次实例化 new MainFrame2() 时,这三个字段为 .setVisible(False)。单击 updateButt 使它们可见。
单击 submitUpdButt 执行五个操作:首先,它实例化一个新的 UpdateFrame2()。其次,它从 UpdateTA 中清除文本。最后,它使三个字段不可见。这5个动作完成没有问题。
现在奇怪的是:请注意,我已经列出了两次“submitUpdButt.setVisible(false)”。一次在“new UpdateFrame2()”之前和一次之后。我注释掉一个并留下另一个。如果“submitUpdButt.setVisible(false)”出现在“new UpdateFrame2()”之前,则出现UpdateFrame,并且其文本区域是可编辑的。
如果“submitUpdButt.setVisible(false)”出现在“new UpdateFrame2()”之后,如上面所写,则出现 UpdateFrame。但其文本区域不可编辑。
澄清一下:程序的每个其他元素的行为完全相同。3 个字段按预期出现和消失。窗口正确打开和关闭。文本“这是一个文本区域”出现在它应该出现的位置。不会产生错误。但是 UpdateFrame2 中的文本区域是否可编辑,取决于我放置“submitUpdButt.setVisible(false)”的位置。
我希望这个描述比我上一个更清楚。