- ベストアンサー
JTableで、動的にカラム幅の設定をするには
よろしくおねがいいたします。 質問なのですが、JTableのカラム幅を動的に変えるに はどうすれば良いのでしょうか? 例えばアプリケーションの画面内で、あるボタンを 押すといくつかあるカラムの内の1つのカラムサイズ を"0"にし、またボタンを押すと元のサイズに戻す。 といったような処理がしたいのですが、、、 バージョンはj2sdk1.4.2_06です。 どなたか分る方が おられましたらよろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
簡単なサンプルを作ってみたんで、参考にしてみてください。 import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.*; public class ResiseTable extends JFrame implements ActionListener{ JTable table; JTextField jtf; final String resize="サイズ変更"; String[][] rowData = { {"1","阪神","48","28","19","1",".596","-"}, {"2","巨人","50","28","20","2",".583","0.5"}, {"3","中日","47","26","20","1",".565","1"}, {"4","ヤクルト","48","25","23","0",".521","2"}, {"5","広島","49","20","27","2",".426","4.5"}, {"6","横浜","50","15","33","2",".313","5.5"}, }; String[] columnNames = {"順位","チーム","試合数","勝","負","分","勝率","ゲーム差"}; DefaultTableModel model; int actCount = 0; public static void main(String[] args){ /* コンストラクタ */ ResiseTable test = new ResiseTable(); /* 終了処理を追加 */ test.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){System.exit(0);} }); /* サイズと位置を指定 */ test.setBoundsToCenter(500, 200); /* 実際に表示する */ test.setVisible(true); } ResiseTable(){ JPanel p1 = new JPanel(); model = new DefaultTableModel(rowData, columnNames); table= new JTable(model); JScrollPane scrPane = new JScrollPane(); scrPane.getViewport().setView(table); scrPane.setPreferredSize(new Dimension(450, 115)); p1.add(scrPane); Container content = this.getContentPane(); content.add(p1, BorderLayout.CENTER); JPanel p2 = new JPanel(); jtf=new JTextField("0",5); jtf.setHorizontalAlignment(JTextField.RIGHT); p2.add(jtf); JButton smallButton = new JButton(resize); smallButton.addActionListener(this); p2.add(smallButton); content.add(p2, BorderLayout.SOUTH); } void setBoundsToCenter(int width,int height) { Dimension screen_dim = getToolkit().getScreenSize(); setBounds((int)((screen_dim.getWidth()-width)/2),(int)((screen_dim.getHeight()-height)/2),width,height); } public void actionPerformed(ActionEvent ae){ try { int size=Integer.parseInt(jtf.getText()); TableColumnModel tcm=table.getColumnModel(); int selectedColumn=table.getSelectedColumn(); if(selectedColumn>=0) { TableColumn tc=tcm.getColumn(selectedColumn); tc.setPreferredWidth(size); } } catch(Exception e) { } } }
その他の回答 (3)
- PecoPlus
- ベストアンサー率76% (144/188)
こんばんは。 JTableのオートリサイズモードが邪魔をしているのだと思います。 setAutoResizeModeメソッドでAUTO_RESIZE_OFFに設定し、オートリサイズモードをオフにしてやればいいと思います。 当然ですが、オートリサイズが利かなくなるので、表の見た目に不満が出るかもしれませんが、しょうがないですね。 あと、カラムの幅の最小値を0にしておくのもお忘れなく。
- jun-1
- ベストアンサー率29% (18/61)
うーん、なんででしょう・・・? カラム幅の変更前と変更後のTableColumn#getMaxWidthとTableColumn#getMinWidthの値は同じでしょうか? また、TableColumn#getResizableの値はtrueでしょうか? 一回目はサイズ変更できたのであれば、どこかでそれらの値が変更されていると思うのですが・・・ もしくは、カラムサイズを「0」にしたのであれば発想をかえて、TableModelから対象の列を削除してはどうでしょう。
- jun-1
- ベストアンサー率29% (18/61)
TableColumn#setWidth(int width) TableColumn#setPrefferedWidth(int prefferedWidth) でどうでしょうか? もちろんボタンのActionListener#actionPerformed で(カラムサイズの)フラグの判定などはしないと いけないですが・・・
お礼
早速の回答ありがとうございます。 試したところ、ボタンを押した1回目だけはサイズ変更できるのですが、2回以降は何の変化もありませんでした。 単純にサイズの再設定をするだけではだめなようです、、、
お礼
ご回答ありがとうございます。 サンプルを試させて頂いたところ、私のやりたかった 処理を行うことが出来ました。 どうやらMaxWidthだけでサイズを設定していたのが いけなかったようです。setPreferredWidthでサイズセ ットしたらできる様になりました。 どうもありがとうございました。