0

これは、Javaアプレットのコードです。この場合、コンボボックスはAccessデータベースからコンテンツを取得し、アイテムを選択するときに、選択したコンボボックスアイテムとして「composition」フィールドを持つテーブルの行を表示する必要があります。私の問題は、これを初めて選択したときに正常に機能することです。最初の選択の結果(表)が表示されているときに、コンボボックスで2番目の選択を行うと、パネルが空白になります。連続して選択した場合にも、対応する出力を繰り返し表示したい。エラーの診断にご協力ください。前もって感謝します!

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 gc implements ActionListener
{
JComboBox cc=new JComboBox();
JFrame frame=new JFrame();
JTable table;
DefaultTableModel model;
String query;
int i;
JPanel panel=new JPanel();

public gc()
{
frame.setTitle("Composition Check");
frame.setSize(500,500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
JPanel p1=new JPanel();
p1.setLayout(new FlowLayout());

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

while(rs.next())
{
 cc.addItem(rs.getString("composition"));
}

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

p1.add(cc);
cc.addActionListener(this);
frame.add(p1,BorderLayout.NORTH);

frame.setVisible(true);
}
public void addTable(String query)
{
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn=DriverManager.getConnection("jdbc:odbc:vasantham","","");
Statement st=conn.createStatement();
System.out.println(query);
ResultSet rs=st.executeQuery(query);
ResultSetMetaData md=rs.getMetaData();
int cols=md.getColumnCount();
model=new DefaultTableModel();

model.addColumn("Purpose");
model.addColumn("Name");
model.addColumn("Manu");
model.addColumn("Expiry");
model.addColumn("Stock");
model.addColumn("Cost");
model.addColumn("Supplier");
model.addColumn("Supplier Number");
model.addColumn("Rack");

table=new JTable(model);

String[] tabledata=new String[cols];
int i=0;

while(rs.next())
{
for(i=0;i<cols;i++)
{
 tabledata[i]=rs.getObject(i+1).toString();

}
model.addRow(tabledata);

}
JScrollPane scroll = new JScrollPane(table); 
panel.setLayout(new BorderLayout());

panel.add(scroll,BorderLayout.CENTER);
frame.add(panel,BorderLayout.CENTER);
conn.close();
}
catch(Exception e)
{
}
}

public void actionPerformed(ActionEvent evt)
{
String ac=(String)cc.getSelectedItem();
System.out.println(ac);

addTable("select * from try where composition='"+ac+"'");
frame.setVisible(true);
}

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

}
4

1 に答える 1

3

追加

panel.removeAll();

スクロールペインを追加する前。これにより、ペインがクリアされ、次の一連の結果のためのスペースが確保されます...

更新 テーブルのモデルを単純に置き換えるのがより良いアプローチであると私は思います。これにより、実行ごとにスクロールペインとテーブルが置き換えられるため、メモリリークのリスクが軽減されます。

JTableへのクラスレベルの参照を追加し、UIユニットコードに追加します

table = new JTable();
JScrollPane scroll = new JScrollPane(table); 
panel.setLayout(new BorderLayout());

panel.add(scroll,BorderLayout.CENTER);
frame.add(panel,BorderLayout.CENTER);

次に、データ更新コードで、新しいモデルをそのまま作成してから、

table.setModel(model);

これは更新が高速であるはずですが、さらに重要なことに、実行に必要なメモリが少なくて済みます。

日付形式は。2つの選択肢があります。データベースの場合は、出力された値をフォーマットするか、独自のセルレンダラーを提供することができます。

public class SQLDateTableCellRenderer extends DefauktTableCellRenderer {

    public Component getTableCellRendererComponent(JTable table,
                                           Object value,
                                           boolean isSelected,
                                           boolean hasFocus,
                                           int row,
                                           int column) {
        if (value instanceof java.sql.Date) {
            value = new SimpleDateFormat("dd/MM/yyyy").format(value);
        }

        retrun super.getTableCellRenderer(...);
    }

}

速記を許してください、私は私のiPadにいます。日付形式への静的参照またはクラス参照を使用することをお勧めしますが、それにはmeto型を増やす必要があります;)

次に、これをJTableのデフォルトレンダラーとして設定できます。これにより、SQL日付のフォーマットが必要な列を知る必要がなくなります。

table.setDefaultRenderer(java.sql.Date, new SQLDateTableCellRenderer());

もちろん、これは、データベースからオブジェクトを抽出するときにオブジェクトを文字列に変換するのではなく、tatを意味します。単に、オブジェクトを直接抽出する必要があります。

tabledata[i]=rs.getObject(i+1); 

tabledataをStringsではなくObject[]配列に変換してください。

于 2012-07-16T10:48:22.513 に答える