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

とてもシンプルです。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)」を配置した場所に基づいて編集可能かどうかに基づいています。

この説明が前回の説明よりも明確であることを願っています。

4

0 に答える 0