1

使用可编译的示例进行全面重新编辑,以澄清我的问题。

总体程序: 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)”的位置。

我希望这个描述比我上一个更清楚。

4

0 回答 0