• 締切済み

JTableとJScrollPaneの問題

JTableとJScrollPaneを使って、Excelのsheetのような表を作成したいのですが、 列の入れ替えが可能になっています。 列の入れ替えを出来ないようにしたいのですが、どうしたら良いのでしょうか? 教えて下さい。 また、各セルをセンターリングで表示したいです。 (以下の例の場合、Aと×とかです。) テストプログラム import java.awt.*; import javax.swing.JTable; import javax.swing.JPanel; import javax.swing.JFrame; import javax.swing.JScrollPane; public class testTable extends JFrame { public testTable() { Object[][] data = { {"A","B","×","A","A","×","B",}, {"C","C","C","C","C","×","B",}, {"×","×","×","A","A","×","B",}, {"F","F","F","A","A","×","B",}, }; String[] columnNames = {"日", "月", "火", "水", "木", "金", "土"}; JTable tblSchedule = new JTable(data, columnNames); JScrollPane scrollPane = new JScrollPane(tblSchedule); getContentPane().add(scrollPane, BorderLayout.CENTER); } public static void main(String[] args) { testTable frame = new testTable(); frame.pack(); frame.setVisible(true); } }

みんなの回答

  • ct27
  • ベストアンサー率62% (48/77)
回答No.3

セルの入力を制限するためには AbstractTableModel#isCellEditable(int row,int col) というメソッドの戻り値が常にfalseが返るようにオーバーライドしたクラス を作成し、JTable#setModelでそのTableModelをセットすれば大丈夫です。 #No.1は全然試さないで書いたソースだったので抜けてる文字とか結構 #ありますね。失礼しました。(^^ゞ

参考URL:
http://java-house.jp/ml/archive/j-h-b/025066.html#body
pikodon
質問者

お礼

ct27様 いつも、私の質問に解答下さって、本当にありがとうございます。 今回も助かりました。

すると、全ての回答が全文表示されます。
回答No.2

列の入れ替えは、 JTableHeaderクラスのsetReorderingAllowed()メソッドで禁止することが出来ます。  JTableHeader header = tblSchedule.getTableHeader();  header.setReorderingAllowed(false); あと、センタリングは確かTableCellRendererとJLabelを使わないとできなかったような気がします。 次のクラスを作成し、 import java.awt.*; import javax.swing.SwingConstants; import javax.swing.JTable; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.JLabel; public class TestCellRenderer extends DefaultTableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { JLabel label = new JLabel(value.toString()); label.setHorizontalAlignment(SwingConstants.CENTER); return label; } } JTableクラスのsetDefaultRenderer()メソッドを使用し、レンダラーを設定します。 tblSchedule.setDefaultRenderer(Object.class , new TestCellRenderer()); あと、クラス名は大文字から始めるようにした方がいいのではないでしょうか? >class testTable

pikodon
質問者

お礼

ありがとうございます。できました。 追加の質問なのですが、センタリングできたのですが、 入力ができるようになってしまいました。 出来ないようにするには、どうしたらいいのですか? setEnabled(false) などしてみたのですが出来ません。 教えて下さい。

すると、全ての回答が全文表示されます。
  • ct27
  • ベストアンサー率62% (48/77)
回答No.1

まず、列の入れ替えをしないためには下記URLに記載されているように JTable が持っている JTableHeader を取得して、それに対して setReorderingAllowed(boolean)メソッドを呼べば大丈夫です。 →http://java-house.jp/ml/archive/j-h-b/023358.html#body また文字のセンタリングは、テーブルカラムの表示をカスタマイズするための DefaultTableCellRendererというクラスを拡張し、それをテーブルかラムに セットしてやります。下記を参考にして頑張ってみてください。   JTable table = new JTable();   DefaultTableColumnModel cmodel =(DefaultTableColumnModel)table.getColumnModel();   //テーブルカラム全てにCenteringRendererをセットする   for( int i = 0; i < table.getColumnCount(); i++ ){     TableColumn column = cmodel.getColumn( i );     columngetCellRenderer( new CenteringRenderer() );   }   /**DefaultTableCellRendererを拡張して文字をセンタリングしてくれるクラスを作成する*/   class CenteringRenderer extends DefaultTableCellRenderer {    public Component getTableCellRendererComponent( JTable table, Object value,                             boolean isSelected, boolean hasFocus,                             int row, int column ) {       //センタリング       setHorizontalAlignment( SwingConstants.CENTER );       return( this );   }  }

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

関連するQ&A