3

私はここに新しく、Javaの初心者です。これが私の最初のクエリです。「送信」をクリックするたびにデータベースの一番上の行が削除され、一番下の行が1レコード上にシフトされ、新しいレコードが最後の行に追加されるように、データベースに5つのレコードを追加するこのJavaプログラムを書いています. また、フレーム|ウィンドウのJLabelsとしてデータベースにテキストを追加しています。これまではすべて問題ありません。データベースも希望どおりに機能しています.ただし、送信ボタンを2回続けてクリックすると(ウィンドウを閉じたり、プログラムを再度実行したりせずに)、テキストボックスに入力するたびに(「ブログを書いてください」)ワンクリックでデータベースの 3 つのレコードに追加されます。3回目にクリックすると、データベースに5つ以上の同じレコードが追加されます。私の質問を手伝ってくれませんか。自分で実行し、送信ボタンを 3 回クリックして、メイン ウィンドウで値がどのように変化するかを確認します。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class OutLoud {
    Connection con;
    Statement st;
    ResultSet rs;
    JFrame Ba = new JFrame("Shout");
    JButton Bb = new JButton("Shout");
    JFrame Aa = new JFrame("Write Your Blog");
    JTextField Ab = new JTextField(100);
    JButton Ac = new JButton("Submit");
    JLabel Za;
    JLabel Zb;
    JLabel Zc;
    JLabel Zd;
    JLabel Ze;

    public OutLoud() {
        connect();
        BlogPage();
        Submit();
    }

    public void connect() {
        try {
            String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
            Class.forName(driver);
            String db = "jdbc:odbc:db1";
            con = DriverManager.getConnection(db);
            st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
            String sql = "select * from Table1";
            rs = st.executeQuery(sql);
        } catch (Exception ex) {
        }
    }

    public void BlogPage() {
        Ba.setLayout(null);
        Ba.setSize(1024, 768);
        Ba.setVisible(true);
        Bb.setBounds(10, 210, 80, 25);
        Ba.add(Bb);
    }

    public void Submit() {
        try {
            rs.last();
            String s11 = rs.getString("Blog");
            Za = new JLabel(s11);
            Ba.add(Za);
            Za.setBounds(246, 170, 512, 100);
            rs.previous();
            String s12 = rs.getString("Blog");
            Zb = new JLabel(s12);
            Ba.add(Zb);
            Zb.setBounds(246, 275, 512, 100);
            rs.previous();
            String s13 = rs.getString("Blog");
            Zc = new JLabel(s13);
            Ba.add(Zc);
            Zc.setBounds(246, 380, 512, 100);
            rs.previous();
            String s14 = rs.getString("Blog");
            Zd = new JLabel(s14);
            Ba.add(Zd);
            Zd.setBounds(246, 485, 512, 100);
            rs.previous();
            String s15 = rs.getString("Blog");
            Ze = new JLabel(s15);
            Ba.add(Ze);
            Ze.setBounds(246, 590, 512, 100);
        } catch (Exception ex) {
        }
        Bb.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Aa.setLayout(null);
                Aa.setSize(512, 384);
                Aa.setVisible(true);
                Ab.setBounds(21, 64, 450, 200);
                Aa.add(Ab);
                Ac.setBounds(206, 294, 80, 25);
                Aa.add(Ac);
                Ac.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        String s1 = Ab.getText();
                        try {
                            rs.first();
                            rs.deleteRow();
                            rs.updateString("Blog", s1);
                            rs.insertRow();
                        } catch (Exception ex) {
                        }
                        Ba.remove(Za);
                        Ba.remove(Zb);
                        Ba.remove(Zc);
                        Ba.remove(Zd);
                        Ba.remove(Ze);
                        Aa.dispose();
                        Submit();
                    }
                });
            }
        });
    }

    public static void main(String[] args) {
        new OutLoud();
    }
}
4

2 に答える 2

2

「前回よりも多くの値を挿入する」という根本的な問題は、新しいイベント リスナーが他のイベント リスナーの内部に [再] 接続されていることです。したがって、イベントが発生するたびに、より多くの(同じ) イベント リスナーが呼び出されます。

修正:コントロールの作成時に一度リスナーをアタッチし、それで完了します。(実際には、すべての「作成されたコントロール」を一度実行すれば、それで完了です。)

他にも問題がある可能性がありますが、コード読めませんでした(コードの上の段落も解読が非常に困難です)。コードの書式設定と構文の強調表示は、エディター/IDE に任せます。コーディングは、傲慢怠惰に関するものです。

于 2012-06-23T18:27:16.820 に答える
0

Rajan は、既に存在するイベント リスナーにアクション リスナーを追加しています。これにより、複数の実行が発生しています。Ac を初期化した後、Ac.addActionListener(......)を使用します。(つまり、コンストラクターに配置します)。実際には、すべてのフォーマット コード (setBounds(...)、setSize(...)、.add(...) など) を actionListeners の外に配置します。actionListeners 内で setVisible(...) と dispose() を使用するだけです。

これだけでなく、あなたのプログラムには多くのエラーがあります。setBounds(...) メソッドを使用しないでください。LayoutManager と pack() メソッドを使用してコンポーネントを追加する方がはるかに優れています。

于 2012-06-24T15:21:29.830 に答える