私の問題を明確にするコンパイル可能な例で完全に再編集します。
プログラム全体: クラス 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
とてもシンプルです。1 つの JTextArea を持つ 1 つのパネルを持つ 1 つのフレーム。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 の 3 つのフィールドに注意してください (お粗末な名前付けをお許しください)。new MainFrame2() が最初にインスタンス化されるとき、これら 3 つのフィールドは .setVisible(False) です。updateButt をクリックすると、それらが表示されます。
クリック submitUpdButt は 5 つのアクションを実行します。最初に、新しい UpdateFrame2() をインスタンス化します。次に、UpdateTA からテキストをクリアします。最後に、3 つのフィールドを非表示にします。これらの 5 つのアクションは問題なく完了します。
ここで奇妙な点があります。「submitUpdButt.setVisible(false)」を 2 回リストしたことに注意してください。「new UpdateFrame2()」の前に 1 回、その後に 1 回。1 つをコメントアウトし、もう 1 つを残します。「submitUpdButt.setVisible(false)」が「new UpdateFrame2()」の前にある場合、UpdateFrame が表示され、そのテキスト領域が編集可能になります。
上記のように、「new UpdateFrame2()」の後に「submitUpdButt.setVisible(false)」が表示されると、UpdateFrame が表示されます。ただし、そのテキスト領域は編集できません。
明確にするために:プログラムの他のすべての要素はまったく同じように動作します。3 つのフィールドが表示され、期待どおりに消えます。窓は正しく開閉します。「これはテキスト領域です」というテキストが本来あるべき場所に表示されます。エラーは発生しません。しかし、UpdateFrame2 のテキスト領域は、「submitUpdButt.setVisible(false)」を配置した場所に基づいて編集可能かどうかに基づいています。
この説明が前回の説明よりも明確であることを願っています。