• 締切済み

データ取得後、JTABLE列幅を変更できませんか

データベースからデータを取得して(ResultSetMetaData)、Jtableに表示したのですが、列幅を項目ごとに変更したいのですが、できるのでしょうか? 項目ヘッダーはできたのですが。。。 ResultSetMetaData rm = rs.getMetaData(); int cnum = rm.getColumnCount(); colname = new ArrayList<String>(cnum); //列名の取得 String[] hder = {"月日","区分","コード","商品"}; for(int i=1; i<=cnum; i++){ colname.add(hder[i-1]); } //行の取得 data = new ArrayList<ArrayList>(); while(rs.next()){ ArrayList<String> rowdata = new ArrayList<String>(); for(int i=1; i<=cnum; i++){ if (rs.getObject(i)==null){ rowdata.add("");} else{ rowdata.add(rs.getObject(i).toString());} } data.add(rowdata); } 表示はできるのですが、各項目ごとに列幅が、しようとMaxsizeとかsetPreferredWidth などを行ってもうまくでいきません。

みんなの回答

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.1

私の記憶が確かならこんな感じで、、、 public void initialyzeJTable(JTable jtable){ jtable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); TableColumnModel tcm = jtable.getColumnModel(); initialyzeTableColumn(tcm, 0, 50); initialyzeTableColumn(tcm, 1, 200); initialyzeTableColumn(tcm, 2, 80); initialyzeTableColumn(tcm, 3, 300); } private void initialyzeTableColumn(TableColumnModel tcm, int columnIndex, int width){ TableColumn tc = tcm.getColumn(columnIndex); tc.setResizable(true); tc.setPreferredWidth(size); } 必要であればレンダラーなども一緒に設定してしまうのがいいかもしれません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Javaでデータに登録する度にIDを振る

    下記のコードはSQLにテーブルを作成し、データを登録するコードですが コードを少し足すことで、ついでにIDを自動的に割り振る方法はあるのでしょうか? import java.sql.*; public class Sample1 { public static void main(String args[]) { try{ //接続の準備 String url = "jdbc:derby:cardb;create=true"; String usr = ""; String pw = ""; //データベースへの接続 Connection cn = DriverManager.getConnection(url, usr, pw); //問い合わせの準備 DatabaseMetaData dm = cn.getMetaData(); ResultSet tb = dm.getTables(null, null, "車表", null); Statement st = cn.createStatement(); String qry1 = "CREATE TABLE 車表(番号 int, 名前 varchar(50))"; String[] qry2 = {"INSERT INTO 車表 VALUES ('伊藤', '男性')", "INSERT INTO 車表 VALUES ('佐藤', '女性')", "INSERT INTO 車表 VALUES ('山田', '男性')"}; String qry3 = "SELECT * FROM 車表"; if(!tb.next()){ st.executeUpdate(qry1); for(int i=0; i<qry2.length; i++){ st.executeUpdate(qry2[i]); } } //問い合わせ ResultSet rs = st.executeQuery(qry3); //データの取得 ResultSetMetaData rm = rs.getMetaData(); int cnum = rm.getColumnCount(); while(rs.next()){ for(int i=1; i<=cnum; i++){ System.out.print(rm.getColumnName(i) + ":"+ rs.getObject(i) + " "); } System.out.println(""); } //接続のクローズ rs.close(); st.close(); cn.close(); } catch(Exception e){ e.printStackTrace(); } } 000001 伊藤 男性 000002 佐藤 女性 000003 山田 男性

    • ベストアンサー
    • Java
  • JavaでDBを作りたい

    一応自分で出来る限りコードは書いたのですが、上手くいきません。 実行すると一応テーブルは表示されるのですが、更新や削除をしようとすると「java.sql.SQLException: executeQuery メソッドを更新用に使用することはできません」などというエラーが出てしまいます。 また、検索機能をつけるとすればどのようにすればいいでしょうか? (文字数の関係上import文など一部割愛しています) public class test extends BaseFrame implements MouseListener { static int KETU; private JLabel l_code, l_title, l_price; private JTextField tf_code, tf_title, tf_price; private String s_code, s_title, s_price; private JButton b_add, b_cha, b_del; private JTable tb; private JScrollPane sp; private JPanel pn; // パネル分割 private ResultSet rs = null; public static void main(String[] args) { new test("データの挿入"); } public test(String title) { super(title); Container cp = getContentPane(); // テーブル表示エリアの設定(省略)// tb = new JTable(new DefaultTableModel()); // テーブル初期は空の状態 sqlTable("select * from USERS"); // 起動と同時にテーブルを表示 } public void mouseClicked(MouseEvent evt) { Object src = evt.getSource(); s_code = tf_code.getText(); s_title = tf_title.getText(); s_price = tf_price.getText(); if (src == b_add) { sqlTable("insert into USERS values(" + (KETU + 1) + ",'" + s_title+ "'," + s_price + ")"); sqlTable("select * from USERS"); } else if (src == b_cha) { sqlTable("update USERS set title= '" + s_title + "', price= " + s_price + " WHERE code= " + s_code); sqlTable("select * from USERS"); } else if (src == b_del) { sqlTable("delete from USERS where code= " + s_code); sqlTable("select * from USERS"); } tf_code.setText(""); tf_title.setText(""); tf_price.setText(""); } public void mouseEntered(MouseEvent evt) { Object src = evt.getSource(); if (src == b_add) { tf_code.setBackground(Color.black); } else if (src == b_cha) { } else if (src == b_del) { tf_title.setBackground(Color.black); tf_price.setBackground(Color.black); } } public void mouseExited(MouseEvent evt) { Object src = evt.getSource(); if (src == b_add) { tf_code.setBackground(Color.white); } else if (src == b_cha) { } else if (src == b_del) { tf_title.setBackground(Color.white); tf_price.setBackground(Color.white); } } @Override public void mousePressed(MouseEvent evt) { } public void mouseReleased(MouseEvent evt) { } public void sqlTable(String sql) { // SQLテーブル表示用 System.out.println(sql); try { String drv = "org.apache.derby.jdbc.ClientDriver"; String url = "jdbc:derby://localhost:1527/jad2011"; Class.forName(drv); Connection cn = DriverManager.getConnection(url); Statement st = cn.createStatement(); rs = st.executeQuery(sql); //SQLの実行 ResultSet rs = st.executeQuery(sql); tb.setModel(new MyTableModel(rs)); rs.close(); st.close(); cn.close(); } catch (Exception e) { e.printStackTrace(); } } // テーブルモデルクラス class MyTableModel extends AbstractTableModel { private Vector<Object> colname; private Vector<Object> data; public MyTableModel(ResultSet rs) { try { // 列数の取得 ResultSetMetaData rm = rs.getMetaData(); int cnum = rm.getColumnCount(); colname = new Vector<Object>(cnum); // 列名の取得 for (int i = 1; i <= cnum; i++) { colname.addElement(rm.getColumnName(i)); } data = new Vector<Object>(); KETU = 0; while (rs.next()) { Vector<Object> rowdata = new Vector<Object>(); for (int i = 1; i <= cnum; i++) { rowdata.addElement(rs.getObject(i)); if (i == 1) { if (KETU < ((Integer) rs.getObject(i))) { KETU = ((Integer) rs.getObject(i)); } } } data.addElement(rowdata); } } catch (Exception e) { e.printStackTrace(); } } public int getRowCount() { return data.size(); } public int getColumnCount() { return colname.size(); } public Object getValueAt(int row, int column) { Vector rowdata = (Vector) data.elementAt(row); return rowdata.elementAt(column); } public String getColumnName(int column) { return (String) colname.elementAt(column); } }

    • ベストアンサー
    • Java
  • ソートについて

    以下のプログラムを実行すると整数のソート結果が "1","12","3"となってしまいます。 整数と文字列を分離させてそれぞれソートさせたいのですが 方法がわかりません。 import java.util.*; import java.io.*; class StrArray{ ArrayList list = new ArrayList(); //最下行に要素を追加 public void add(String data){ list.add(data); } //全ての要素を配列で所得 public String[] getAll(){ String[] all = new String[list.size()]; for(int i=0; i<list.size(); i++){ all[i] = super.get(i); } return all; } public static final int ASC_SORT = 0; public void sort(int mode){ ArrayList al = this.qsort(mode, list); al = list; } //クイックソート public ArrayList qsort(int mode, ArrayList data){ ArrayList result = new ArrayList(); if(data.size()<1){ return new ArrayList(); } String middle = (String)data.get(data.size()/2); ArrayList left = new ArrayList(); ArrayList right = new ArrayList(); for(int i=0; i<data.size(); i++){ if(i != data.size()/2){ if(mode == 0){ if(((String)data.get(i)).compareTo(middle)<=0){ left.add(data.get(i)); } else{ right.add(data.get(i)); } result.addAll(qsort(0, left)); result.add(middle); result.addAll(qsort(0, right)); return result; } return result; } } } } class Sample{ public static void main(String args[]){ StrArray alist = new StrArray(); alist.add("bbb"); alist.add("aaa"); alist.add("ddd"); alist.add("ccc"); alist.add("3"); alist.add("1"); alist.add("12"); alist.sort(0); String[] info = alist.getAll(); for(int i = 0; i < info.length; i++){ System.out.println(info[i]); } } }

  • ArrayListを使った多次元配列の作成について

    ArrayListで可変長配列を扱っているのですが、 2次元可変長配列を用いる必要が出てきたので、 下記のように変更したのですがうまくいきません。 何が悪いのか教えていただけませんでしょうか? ----------------------------------------- ArrayList cars=new ArrayList(); cars.add("フェラーリ"); cars.add("ポルシェ"); cars.add("メルセデスベンツ"); for(int i=0;i<cars.size();i++){  String str=(String)cars.get(i);  System.out.println(str);} ----------------------------------------- 上記から下記のように変更しました。 ----------------------------------------- ArrayList[] cars=new ArrayList[3]; cars[0].add("フェラーリ"); cars[0].add("ポルシェ"); cars[0].add("メルセデスベンツ"); for(int i=0;i<cars[0].size();i++){  String str=(String)cars[0].get(i);  System.out.println(str);} ----------------------------------------- エラーは「Exception in thread "main" java.lang.NullPointerException」です。 どうやら初期配列が10ではなく3となってしまっているようです。

    • ベストアンサー
    • Java
  • データベースから取得したデータを配列に格納できません。

    jTableにSQL文の結果を表示させようとして結果を以下のように配列に 格納しようとしました。 public String[][] Serch(){ int i=0; String[][] rowData; String str = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=helloTable.mdb"; try { // ドライバクラスをロード Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // データベースへ接続 Connection con = DriverManager.getConnection(str, "", ""); // ステートメントオブジェクトを生成 Statement stmt = con.createStatement(); String sql = "SELECT * FROM ハローテーブル"; ResultSet rs = stmt.executeQuery(sql); while(rs.next()){ // NOを取得 String no = String.valueOf(rs.getInt("NO")); // 言語を取得 String lang = rs.getString("言語"); // メッセージを取得 String msg = rs.getString("メッセージ"); rowData[i][0] = no; rowData[i][1] = lang; rowData[i][2] = msg; i++; } stmt.close(); con.close(); } catch (Exception e) { e.printStackTrace(); } return rowData; } このメソッドで得た配列を表示させようとすると以下の結果が表示されます。 java.lang.NullPointerException 正常なSQL文の結果は以下の通りです。 1 日本語 こんにちは世界 2 英語 Hello World 3 ドイツ語 Hallo Welt 配列の行数はSQL文の結果の行数に合わせたかったのですがうまくいきません。 どのように直せばSQL文の結果を配列にすべて格納できるでしょうか?

    • ベストアンサー
    • Java
  • ArrayList で配列を扱う場合の記述方法について

    ArrayList で配列を扱う場合の記述方法について、 探しきれないのでご教授お願いします。 ArrayList list = new ArrayList(); list.add("AAA"); list.add("BBB"); list.add("CCC"); for (int i = 0; i < list.size(); i++) { System.out.println(i+"は"+list.get(i)); } という箇所をArrayList<Date>listを使って書き直すのはどのようになるでしょうか。 ArrayList<Date>list= new ArrayList<Date>(); list.add("AAA"); list.add("BBB"); list.add("CCC"); for (int i = 0; i < list.size(); i++) { System.out.println(i+"は"+list.get(i)); } とすると、 型 ArrayList<Date> のメソッド add(Date) は引数 (String) に適用できません。 というエラーになってしまいました。

    • ベストアンサー
    • Java
  • JAVAでの、clone() 参照渡し?について

    ArrayListで文字列の配列(String[ ])の配列を作りました。 そして、listにaddするときに *・・・ list.add(item)だと上手くいきません。      繰り返して異なる値のはずなのですが、      例えば、listget(0)[0] , list.get(1)[0] , list.get(2)[0]が全て同じ値になってしまいます。     しかし、     list.add(item.clone())だと上手くいきます、よくわかりませんが参照渡しというのでしょうか? 前者で何故上手くいかないのかがわからないのです。 この二つの違いは何なのでしょうか。 【プログラム】 ArrayList<String[]> list = new ArrayList<String[]>(); String[] item = new String[6]; //このwhileは数回繰り返されますが、下記の値は毎度異なります。 while(rs.next()) { item[0] = rs.getString("Field"); item[1] = rs.getString("Type"); item[2] = rs.getString("Null"); item[3] = rs.getString("Key"); item[4] = rs.getString("Default"); item[5] = rs.getString("Extra"); list.add(item); ・・・・・・・・・・・・・・・・・・・・*       }

    • ベストアンサー
    • Java
  • JSPとJavaBeansについて

    JSPとJavaBeansを用いて情報を共有したいと考えています。 値を取得した後に配列に入れています。 ArrayList list = new ArrayList(); while(rs.next()){ int op = rs.getInt("op"); list.add(new Integer(op)); } int[] in = new int[list.size()]; for (int i = 0; i < list.size(); i++) { in[i] = ((Integer)list.get(i)).intValue(); この後に、in[i]の要素をBeansに送り、別のJSPでその値を使いたいと考えています。 ただ、Beansで配列のデータを扱う場合にはどのようにすれば宜しいのでしょうか? アドバイスを頂けると助かります。 宜しくお願いします。

  • Javaとエクセルを連携させる

    Sample1.java  ドライバ名にMicrosoft Excel Driver;createと指定しましたが 実行時に、 java.sql.SQLException: No suitable driver found for Microsoft Excel Driver;creat e=true at java.sql.DriverManager.getConnection(Unknown Source) at java.sql.DriverManager.getConnection(Unknown Source) at Sample1.main(Sample1.java:14) ドライバが適切でないというエラーが出てしまいました。 エクセルのDBはSQL文では扱えないのでしょうか? コードは以下の通りです。 import java.sql.*; public class Sample1 { public static void main(String args[]) { try{ //接続の準備 String url = "Microsoft Excel Driver;create=true"; String usr = ""; String pw = ""; //データベースへの接続 Connection cn = DriverManager.getConnection(url, usr, pw); //問い合わせの準備 DatabaseMetaData dm = cn.getMetaData(); ResultSet tb = dm.getTables(null, null, "車表", null); Statement st = cn.createStatement(); String qry1 = "CREATE TABLE 車表(番号 int, 名前 varchar(50))"; String[] qry2 = {"INSERT INTO 車表 VALUES (2, '乗用車')", "INSERT INTO 車表 VALUES (3, 'オープンカー')", "INSERT INTO 車表 VALUES (4, 'トラック')"}; String qry3 = "SELECT * FROM 車表"; if(!tb.next()){ st.executeUpdate(qry1); for(int i=0; i<qry2.length; i++){ st.executeUpdate(qry2[i]); } } //問い合わせ ResultSet rs = st.executeQuery(qry3); //データの取得 ResultSetMetaData rm = rs.getMetaData(); int cnum = rm.getColumnCount(); while(rs.next()){ for(int i=1; i<=cnum; i++){ System.out.print(rm.getColumnName(i) + ":"+ rs.getObject(i) + " "); } System.out.println(""); } //接続のクローズ rs.close(); st.close(); cn.close(); } catch(Exception e){ e.printStackTrace(); } } }

  • cloneメソッドはシャローコピー?

    質問させてください。 ネットを見ると、cloneメソッドはシャローコピーをするものだと認識できます。 しかし、以下のコードを実行すると、配列cnum[0]とnum[0]の値が異なる結果になり、ディープコピーを行っているように見えます。 public class Hairetu { public static void main(String[] args) { int []num={1,2,3}; int []cnum=new int[3]; int []dnum=new int[3]; cnum=num.clone(); cnum[0]=12; for(int i=0;i<3;i++) { System.out.println(cnum[i]+" "+num[i]); } } } cloneメソッドはディープコピーなのでしょうか。 どなたか教えてください。お願いします。

    • ベストアンサー
    • Java