3

我是新来的,也是 Java 的初学者。这是我的第一个查询。我正在编写这个 java 程序,它将向数据库添加 5 条记录,这样每次我单击“提交”时,数据库中的顶行被删除,最底行向上移动 1 条记录,最后一行添加一条新记录. 我也将数据库中的文本添加为​​框架|窗口上的 JLabels。一切都很好。并且数据库也按预期工作。除了当我连续第二次单击提交按钮(我的意思是不关闭窗口或再次运行程序)时,我在文本框中输入的水(“写你的博客”)只需单击即可添加到数据库的 3 条记录中。当我第三次点击它时,它会在数据库中添加 5 条或更多相同的记录。你能帮我解决我的问题吗?自行运行并单击提交按钮三次以了解主窗口中的值如何变化

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 之外。只需在 actionListener 中使用 setVisible(...) 和 dispose() 即可。

不仅如此,你的程序还有很多错误。不要使用 setBounds(...) 方法。使用 LayoutManager 并使用 pack() 方法添加组件要好得多。

于 2012-06-24T15:21:29.830 回答