1

私のコードの概念は、最初にアクセスデータベーステーブル'try'の列'tname'から個別の名前を取得するというものです。それらのアイテムをコンボボックスに追加します。コンボボックスでアイテムを選択すると、選択したアイテムとしてtnameを含む行のデータが取得され、テキストフィールドに表示されます。次に、テキストフィールドの内容にいくつかの変更を加えます。その後、[保存]ボタンをクリックすると、選択したコンボボックス項目としてtnameを含む行のすべてのデータが、テキストフィールドの新しいコンテンツで更新される必要があります。

最後のものを除いて、すべてがうまくいきます。[保存]をクリックすると、前のテキスト(コンボボックスを選択したときにデータベースから最初に取得されたテキスト)のみが考慮され、変更は考慮されません。問題の診断にご協力ください。

前もって感謝します。

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
import java.util.Date;
import java.sql.*;
import java.text.*;

public class gut implements ActionListener
{
JComboBox ctn;
JTextField cm,exd,stk,cst,sup,snum,r;
String stn,scm,sexd,sst,scst,ssup,ssnum,sr,icm,iexd,istk,icst,isup,isnum,ir;
JLabel lt,lc,le,ls,lcs,lsp,lspn,lr;
JButton s;
JFrame gp=new JFrame();

public gut()
{
gp.setSize(500,500);
gp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

gp.setLayout(null);

lt=new JLabel("Tablet Name",JLabel.RIGHT);
lc=new JLabel("Composition",JLabel.RIGHT);
le=new JLabel("Expiry Date (dd/mm/yyyy)",JLabel.RIGHT);
ls=new JLabel("Stock",JLabel.RIGHT);
lcs=new JLabel("Cost",JLabel.RIGHT);
lsp=new JLabel("Supplier",JLabel.RIGHT);
lspn=new JLabel("Supplier Number",JLabel.RIGHT);
lr=new JLabel("Rack",JLabel.RIGHT);

lt.setBounds(100,120,120,20);
lc.setBounds(100,140,120,20);
le.setBounds(60,160,160,20);
ls.setBounds(100,180,120,20);
lcs.setBounds(100,200,120,20);
lsp.setBounds(100,220,120,20);
lspn.setBounds(100,240,120,20);
lr.setBounds(100,260,120,20);

ctn=new JComboBox();
cm=new JTextField();
exd=new JTextField();
stk=new JTextField();
cst=new JTextField();
sup=new JTextField();
snum=new JTextField();
r=new JTextField();


ctn.setBounds(240,120,120,20);
cm.setBounds(240,140,120,20);
exd.setBounds(240,160,120,20);
stk.setBounds(240,180,120,20);
cst.setBounds(240,200,120,20);
sup.setBounds(240,220,120,20);
snum.setBounds(240,240,120,20);
r.setBounds(240,260,120,20);

try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn=DriverManager.getConnection("jdbc:odbc:vasantham","","");
Statement st=conn.createStatement();
ResultSet rs=st.executeQuery("select DISTINCT tname from try");

while(rs.next())
{
 ctn.addItem(rs.getString("tname"));
}

conn.close();
}
catch(Exception e)
{
}

gp.add(lt);gp.add(ctn);
gp.add(lc);gp.add(cm);
gp.add(le);gp.add(exd);
gp.add(ls);gp.add(stk);
gp.add(lcs);gp.add(cst);
gp.add(lsp);gp.add(sup);
gp.add(lspn);gp.add(snum);
gp.add(lr);gp.add(r);

ctn.addActionListener(this);
s=new JButton("Save");
s.setBounds(200,300,100,20);
gp.add(s);
s.addActionListener(this);




gp.setVisible(true);
}
public void actionPerformed(ActionEvent evt)
{
String act=evt.getActionCommand();

String scb=(String)ctn.getSelectedItem();
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn=DriverManager.getConnection("jdbc:odbc:vasantham","","");
Statement st=conn.createStatement();
ResultSet rs=st.executeQuery("select * from try where tname='"+scb+"'");
SimpleDateFormat formatter=new SimpleDateFormat("dd/MM/yyyy");

while(rs.next())
{
icm=rs.getString("composition");
iexd=formatter.format(rs.getDate("exdate"));
istk=Integer.toString(rs.getInt("stock"));
icst=rs.getString("cost");
isup=rs.getString("sup");
isnum=rs.getString("supnum");
ir=rs.getString("rack");
}

cm.setText(icm);
exd.setText(iexd);
stk.setText(istk);
cst.setText(icst);
sup.setText(isup);
snum.setText(isnum);
r.setText(ir);


conn.close();
}
catch(Exception e)
{
System.out.println(e);
}


if(act.equals("Save"))
{
scm=cm.getText();
sexd=exd.getText();
sst=stk.getText();
scst=cst.getText();
ssup=sup.getText();
ssnum=snum.getText();
sr=r.getText();
System.out.println(scm+","+sexd+","+sst+","+scst+","+ssup+","+ssnum+","+sr);
try
{

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn=DriverManager.getConnection("jdbc:odbc:vasantham","","");
PreparedStatement ps=conn.prepareStatement("UPDATE try set composition=?,exdate=?,stock=?,cost=?,sup=?,supnum=?,rack=? where 

tname=?");

ps.setString(1,scm);
ps.setString(2,sexd);
ps.setString(3,sst);
ps.setString(4,scst);
ps.setString(5,ssup);
ps.setString(6,ssnum);
ps.setString(7,sr);
ps.setString(8,scb);

ps.executeUpdate();

JOptionPane.showMessageDialog(null,"Your entry has been stored successfully!!!");

}
catch(Exception e)
{
JOptionPane.showMessageDialog(null,"Error!Try again!");
System.out.println(e);

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

}
4

4 に答える 4

1

actionPerformed()関数は、毎回データベースから情報を取得します。[保存]ボタンを押すと、最初に情報が取得され、アクションコマンドが[保存]の場合は情報が保存されます。これが、[保存]ボタンを押したときにgetText()から現在データベースにある情報を常に取得する理由です。

[保存]ボタンが押されたときに実行する別の関数/actionListenerを作成するか、他の場所でテキストフィールドを更新するコードの一部を取得します。

代わりに次のようなものを試してください。

JButton saveButton = new JButton( new AbstractAction("save") {
        @Override
        public void actionPerformed( ActionEvent e ) {
            // Save the info here or just call a function that will.
        }
    });
于 2012-07-19T15:26:27.437 に答える
1

問題は、[保存]ボタンを押すたびにデータベースから情報を繰り返し取得するため、TextFieldsを上書きしてから、TexFieldsのコンテンツから読み取ることです。この部分を取り出してみてください:

 try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            Connection conn = DriverManager.getConnection

            ("jdbc:odbc:vasantham", "", "");
            Statement st = conn.createStatement();
            ResultSet rs = st.executeQuery("select * from try where tname='"
                    + scb + "'");
            SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");

            while (rs.next()) {
                icm = rs.getString("composition");
                iexd = formatter.format(rs.getDate("exdate"));
                istk = Integer.toString(rs.getInt("stock"));
                icst = rs.getString("cost");
                isup = rs.getString("sup");
                isnum = rs.getString("supnum");
                ir = rs.getString("rack");
            }

            cm.setText(icm);
            exd.setText(iexd);
            stk.setText(istk);
            cst.setText(icst);
            sup.setText(isup);
            snum.setText(isnum);
            r.setText(ir);

            conn.close();
        } catch (Exception e) {
            System.out.println(e);
        }

アクション実行メソッドから。

于 2012-07-19T15:26:33.327 に答える
1

アクションイベントが発生するたびに、DBからデータを読み取り、テキストフィールドに書き込みます。そのテキストを変更すると、テキストフィールドに正しく表示されます。ただし、[保存]をクリックすると、すべての変更がDB値で再度上書きされます。

したがって、「DBから読み取る」機能と「変更を書き込む」機能を分離する必要があります。

編集:おっと、遅すぎます。

于 2012-07-19T15:27:26.210 に答える
1

他の人がすでに言ったことに加えて、本当に単一のアクションリスナーを使用したい場合は、実際にどのアクションが発生したかを把握する必要があります。

ActionEvent(evt.getSource())のソースを確認するか、より適切には、アクションリスナーを使用して各コンポーネントにアクションコマンドを割り当てることができます。

JComboBox.setActionCommand(...)JButton.setActionCommand(... )をチェックしてください

その後、ActionEvent.getActionCommand()プロパティをチェックして、実行する正しいアクションを決定するという単純なケースです。

于 2012-07-19T20:00:04.313 に答える