0

Javaスイングでテーブルを使用して、テーブルを作成し、SQLに値を追加しようとしています。しかし、 for ループではまったくインクリメントしません。それが原因だと思います。while(rs2.next())for ループの外に配置すると、「結果セットの開始前」というエラーが発生します。私は助けが必要です!

編集:上記の問題は処理されましたが、新しい問題が発生しました。JTable 自体が更新されていないようです。コンボボックス テーブル アプリケーションでテーブル名を選択すると、アプリケーションがクラッシュし、範囲外の配列インデックスが発生します。

私のコードはここにあります:

public class DBC extends JFrame{

static String tablo;
static JTextField tf = new JTextField(20);
static int columnCount;
static JPanel tfPanel = new JPanel();
static String[] sutunlar;
static JLabel sutunLabel;
static JPanel sutunPanel = new JPanel(new BorderLayout());
static JTable table;
static JScrollPane scrollPane;

public static void main(String[] args) throws Exception {

    Class.forName("com.mysql.jdbc.Driver");
    Connection connect = DriverManager.getConnection("jdbc:mysql://localhost:3306/project"
              ,"root","123456789");

    final Statement statement = connect.createStatement();

    JLabel tabloSec = new JLabel("Tablo Seçin:");
    final JComboBox<String> tablolar = new JComboBox<String>();
    final DatabaseMetaData md = connect.getMetaData();
    final ResultSet rs = md.getTables(null, null, "%", null);

    while (rs.next()) {
        tablolar.addItem(rs.getString(3));
    }

    tablolar.addActionListener(new ActionListener(){

        @Override
        public void actionPerformed(ActionEvent arg0) {

            tablo = tablolar.getSelectedItem().toString();

            try {

                 ResultSet rs2 = statement.executeQuery("SELECT * FROM "+tablo);
                 ResultSetMetaData rsmd = rs2.getMetaData();
                 columnCount = rsmd.getColumnCount();

                 sutunlar = new String[columnCount];
                 table = new JTable(1,columnCount);
                 Object columnNames[] = new Object[columnCount];
                 Object rowData[][] = {{""}};

                     for(int i=0;i<columnCount;i++){

                         sutunlar[i] = rsmd.getColumnLabel(i+1);
                         columnNames[i] = sutunlar[i];

                         }

                     table = new JTable(rowData, columnNames);
                     table.repaint();
                     scrollPane = new JScrollPane(table);
                     sutunPanel.add(scrollPane);
                     sutunPanel.revalidate();

            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });

    JButton ekle = new JButton("Ekle");
    ekle.addActionListener(new ActionListener(){

        @Override
        public void actionPerformed(ActionEvent e) {

            try {
                switch(tablo){
                case "department":

                    statement.executeUpdate("INSERT INTO department(Name,Location) VALUES('"+tf.getText()+"')");
                case "employee":

                    statement.executeUpdate("INSERT INTO employee(Id,FirstName,LastName,Sex,Address,Email,Salary,BirthDate,JoinDate) VALUES('"+tf.getText()+"')");
                case "engineer":

                    statement.executeUpdate("INSERT INTO engineer(EngineerType) VALUES('"+tf.getText()+"')");
                case "manager":

                    statement.executeUpdate("INSERT INTO manager(Department) VALUES('"+tf.getText()+"')");
                case "project":

                    statement.executeUpdate("INSERT INTO project(Name,Number,Value) VALUES('"+tf.getText()+"')");
                case "secretary":

                    statement.executeUpdate("INSERT INTO secretary(TypingSpeed) VALUES('"+tf.getText()+"')");
                }

            } catch (SQLException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
    });

    JButton cik = new JButton("Çık");
    cik.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {

            System.exit(0);
        }
    });

    JPanel panel = new JPanel(new FlowLayout());

    panel.add(tabloSec);
    panel.add(tablolar);
    panel.add(sutunPanel);
    panel.revalidate();
    panel.add(ekle);
    panel.add(cik);

    JFrame frame = new JFrame("Deneme");
    frame.setSize(600,600);
    frame.setLocationRelativeTo(null);
    frame.add(panel);
    frame.setVisible(true);
  }
}
4

2 に答える 2

0

私はあなたが何かを混ぜたと思います。定義すると

columnCount = rsmd.getColumnCount();

columnCountテーブルの列数を保持していると思われるようです。しかし、そうではありません。これは、メタデータが提供する列の数です。

選択したテーブルの列の名前を取得する場合は、これをtry/catchブロックに入れます。

ResultSet rs2 = md.getColumns(null, null, tablo, null);

Set<String> columnNames = new HashSet<String>();
while (rs2.next()) {
  columnNames.add(rs2.getString(4));
}

Object[][] rowData = { null };
table = new JTable({ null }, columnNames.toArray());
scrollPane = new JScrollPane(table);
sutunPanel.add(scrollPane);

そして、静的フィールドの使用について本当に考える必要があります;)

于 2013-03-25T15:36:26.010 に答える
0

forループに問題があるとは思わない。

while(rs2.next()){

}

これが実行されると、条件が i の他の反復に対して false になり、while ループに入らない。

テストしたい場合は、次のことができます。

for(int i=0;i<columnCount;i++){  

    while(rs2.next()){              

       sutunlar[i] = rs2.getString(4);
       Set<String> setSutunlar = new HashSet<>(Arrays.asList(sutunlar[i]));
       Object rowData[][] = {null};
       Object columnNames[] = setSutunlar;
       table = new JTable(rowData, columnNames);
       scrollPane = new JScrollPane(table);
       sutunPanel.add(scrollPane);
    }

    System.out.println("Value of i is " + i);// Add this line to check iteration of i.
}
于 2013-03-25T14:31:25.583 に答える