JTableのカラム移動を抑止する方法

このQ&Aのポイント
  • JTableのカラム移動を抑止する方法について教えてください。
  • また、JTableのカラム移動によって背景色を動的に変更する方法も知りたいです。
  • カラム移動の抑止または背景色の動的変更、いずれの方法でも構わないです。
回答を見る
  • ベストアンサー

JTableのカラム移動の抑止方法

現在スクロールペイン(JScrollPane)上にテーブル(JTable)を乗せたGUI構成にしております。 そこで質問なのですが、この構成にすると、画面上でカラムの移動が出来ます。 (カラムヘッダー上でクリックし、そのまま左右に動かすと該当位置にカラム全体が移動します) これを抑止したいのですが、そういう事は可能ですか? または、今現在、そのテーブルのカラム背景色はDefaultTableCellRendererから派生させた独自クラス 内のgetTableCellRendererComponentをオーバーライドしたメソッド内で固定的に5列目だったら 赤みたいな処理を行っていますが、これをカラム移動されたイベントを拾って、動的に変更する事 は可能ですか? 現状、たとえば5列目(赤)を1列目などに移動させると当然、背景色は赤ではなくなって しまっています。 仕様的にカラム移動はマストでは無い為、このオペレーション自体の抑止、あるいは動的に背景色 を切り替えるどちらでも方法は構わないと思っております。 以上、よろしくお願いします。

  • Vargas
  • お礼率85% (174/204)
  • Java
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

JTableのカラム移動禁止であれば以下の文を記述すれば可能です。 JTabel table = new JTable(); table.getTableHeader().setReorderingAllowed(false); 参考になれば幸いです。 参考URLにSwingのコンポーネント関連をつけておきます。

参考URL:
http://www.hcn.zaq.ne.jp/no-ji/lib/swing.txt
Vargas
質問者

お礼

ありがとうございます。希望通りの動作になりました。だいたい、いつもそうなのですが、 APIマニュアルにてJTableならJTableの中だけ参照して、結果「無いなぁ」という感じに なっています。希望通りのメソッドを探すのも経験が必要ですね。参考URLも含めてどうもありがとうございました。

関連するQ&A

  • JTableとJScrollPaneについて

    JTableとJScrollPaneでテーブルを横や縦にスクロールできるようにして いるのですが、テーブルを横にスクロールさせたときに、0行目のカラム は常に左側に表示させるようにしたいのですが、どうやればよいでしょうか? カラムの移動とか編集はできなくてもよいです。 分かりにくい質問の仕方で申し訳ないのですが、回答よろしくお願いします。

    • ベストアンサー
    • Java
  • JTableの列ヘッダ

    JTableの列ヘッダ(列見出し)を表示する方法で、 JScrollPaneを利用せずに表示する方法はありますでしょうか? テーブルに見出しをつけたいのですが、スクロールバーをつけたくないのです。 お手数ですがご教授お願いします。

    • ベストアンサー
    • Java
  • Swing/JTableのカラム幅の変更について

    お世話になります。ついこの前にも質問したのですが、 さらにわからないことがでてきたので質問させていただきます。 AUTO_RESIZE_OFFにしておいてユーザーがテーブルのカラム幅を変更した際や最大化/元に戻す(縮小)した際、セットされているJScrollPaneのViewportがあまっていたら最後の行で調節する(AUTO_RESIZE_LAST_COLUMN相当)ということをしたいのです AUTO_RESIZE_LAST_COLUMNにしないのは最大化/縮小のときにはカラム幅を変更しないためです。 以下のようなコードを組んだのですが幅を変更した際には微妙にずれてしまいます。 また、最大化はできるのですが、縮小するとうまくいきません。 よろしくお願いします。 ****** for(int i=0;i<8;i++){//列は8列です table.getColumnModel().getColumn(i).addPropertyChangeListener(new PropertyChangeListener(){ public void propertyChange(PropertyChangeEvent e) { if (e.getPropertyName().equals("width")) { adjustOnLastColumn(); } } });} jScrollPane1.addComponentListener(new ComponentAdapter(){ @Override public void componentResized(ComponentEvent e){ adjustOnLastColumn(); } }); public void adjustOnLastColumn(){ int widthSum = 0; for(int i = 0;i<8;i++){ widthSum += table.getColumnModel().getColumn(i).getWidth(); } table.getColumnModel().getColumn(8).setMaxWidth( jScrollPane1.getViewport().getSize().width - widthSum); table.getColumnModel().getColumn(8).setMinWidth( jScrollPane1.getViewport().getSize().width - widthSum); }

    • ベストアンサー
    • Java
  • Jtableの特定のセルの背景色や文字色について

    Jtable内部の特定のセルの背景色や文字色、フォントの変更に関して質問があります。25行30列のJtableの20行20列目のセルの背景色だけ赤色にしたい場合、具体的にどの様にプログラミングすれば良いでしょうか? サンプルソースなどを教えてくださるとありがたいです! javaに関して詳しい方、ぜひともお力を貸してください!

    • ベストアンサー
    • Java
  • JScrollPane上のJTableの再描画

    JPanel上で,以下の初期化関数を作って,データが更新されたときに,この初期化関数を再度呼び出して,テーブルを作り直しています. 描画直後は,正しく表示されるのですが, スクロールバーに触ったり,セルをクリックしたりすると, 初めに作成したテーブルの表示に戻ってしまいます. 何が原因で,どのように対処すれば良いのでしょうか? ご回答いただけますよう,よろしくお願いいたします. public void init_table() { tablemodel1 = new DefaultTableModel(column_names1, text.keyword_num); table1 = new JTable(tablemodel1); scrollt1 = new JScrollPane(table1); add(scrollt1);     以下略 }

    • ベストアンサー
    • Java
  • フォーカスのあるセルを中心に表示したい

    こんにちは。 JTable table = new JTable(); JScrollPane sp = new JScrollPane(); sp.getViewport().setView(table); という感じでテーブルを表示しています。 テーブルのカラム数が多く、セルをタブ移動させていくと、 フレームの右側に常にフォーカスを持ったセルが来るようになりますが、フォーカスを持ったセルがフレームの中心に表示されるようにしたいです。 説明が下手で申し訳ございません。 用はスクロールが自動的にされるみたいなイメージです。 宜しくお願いします。

  • JTableからのデータの取得

    列数の多いテーブル (JTableの派生クラス) から ユーザー定義クラス (各プロパティにはsetterとgetterは実装済み) に 効率的にデータを取得する方法を教えて下さい。 データの取り込みはTableModelクラスを使って行う予定ですが 列数が多いため、列番号でIF分岐してsetterを呼ぶのは あまりに非効率な気がします。 どのように処理するのが良いのでしょうか? お知恵をおかしください。宜しくお願い致します。

    • ベストアンサー
    • Java
  • JTableのViewの操作に関して

    JTableを利用してグラフィカルなテーブル表を作成したいと思っています。 (例) NAME AGE TEL ADDRESS ------------------------------------ tanaka 30  X-X-X XXX yamada 23 Y-Y-Y YYY この際、以下のようなことは実現可能でしょうか? また可能な場合、どのようなコーティングになるのでしょうか? (1)特定の列を非表示にする  例えば"TEL"カラムを非表示にする(ただし内部で内容を保持) (2)値すべてを非表示にする  ただし、"NAME"などの列名(ヘッダー)はそのまま表示する

    • ベストアンサー
    • Java
  • SwingのJTableについて

    swingなのですが下記のプログラムで実現できない点があります。 1.isCellEditableメソッドを使ってセルを編集可能にしたのですが 編集した文字が消えてしまいます。 2.また、ボタンを配置してボタンを押下時に編集したセルの   行のデータをコンソールに表示したいのですがどうすればいいかわかりません。 3.画面レイアウトがsetLocation(x, y)した位置に表示されません。 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Vector; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableModel; public class JTableSample4 implements ActionListener { static Vector<String>[] data = new Vector[3]; static JFrame frame; public static void main(String[] args) { frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(null); JPanel panel1 = new JPanel(); // セルのデータ作成 for (int i = 0; i < 3; i++) { data[i] = new Vector<String>(); } // data[0]に名前、data[1]に住所、data[2]に電話番号 data[0].addElement("鈴木一郎"); data[1].addElement("東京都"); data[2].addElement("xxxxxxxxxx"); data[0].addElement("佐藤花子"); data[1].addElement("千葉県"); data[2].addElement("yyyyyyyyyy"); data[0].addElement("田中浩二"); data[1].addElement("埼玉県"); data[2].addElement("zzzzzzzzzz"); data[0].addElement("小川伸介"); data[1].addElement("新潟県"); data[2].addElement("aaaaaaa"); data[0].addElement("佐藤和也"); data[1].addElement("群馬県"); data[2].addElement("bbbbbbb"); data[0].addElement("渡辺悟"); data[1].addElement("愛知県"); data[2].addElement("ccccccc"); data[0].addElement("橋本智也"); data[1].addElement("愛媛県"); data[2].addElement("ddddddd"); data[0].addElement("永井祐二"); data[1].addElement("栃木県"); data[2].addElement("eeeeeee"); data[0].addElement("細貝昭二"); data[1].addElement("福岡県"); data[2].addElement("fffffff"); data[0].addElement("堀野友光"); data[1].addElement("長野県"); data[2].addElement("gggggggg"); // テーブル作成 TableModel tableModel = new AbstractTableModel() { // 行数 public int getRowCount() { return 10; } // 列数 public int getColumnCount() { return 3; } // row行column列の値をセット public Object getValueAt(int row, int column) { return data[column].elementAt(row); } // タイトル部の値をセット public String getColumnName(int column) { switch (column) { case 0: return "名前"; case 1: return "住所"; case 2: return "電話番号"; } return ""; } /******************セルの編集 可/不可を操作するメソッド**********************/ public boolean isCellEditable(int rowIndex, int columnIndex) { /*0が1カラム目 1が2カラム目なのでこの場合電話番号だけ編集可*/ if (columnIndex == 0 || columnIndex ==1) { /*falseは編集不可*/ return false; } else /*trueは編集可*/ return true; } }; JLabel label = new JLabel("電話番号だけがセルを編集することができます"); label.setLocation(10, 10); label.setSize(300, 20); JButton button = new JButton("Click Me!"); button.setLocation(10, 400); button.setSize(20, 20); //button.addActionListener(); JTable table = new JTable(tableModel); JScrollPane scrollPane = new JScrollPane(table); scrollPane.setLocation(10, 40); scrollPane.setSize(750, 180); panel1.add(button); panel1.add(label); panel1.add(scrollPane); panel1.setBounds(10, 10, 800, 230); frame.add(panel1); frame.setSize(800, 600); frame.setVisible(true); } public void actionPerformed(ActionEvent e) { System.out.println("test"); } }

    • ベストアンサー
    • Java
  • JavaのJTableのセル単体の色設定

    今日は JavaのJtableの『マウスで選択したセル』の色を赤色に設定するコードを書きましたが、セル単体でバックグランドの色が変更できまず、行単位で変更されます。 又、変更のタイミングは、他のセルを、マウス選択したときに、以前のセルの行が赤く変更になります。 Q1)セル単体で、バックグランドの変更を行い、その変更タイミングは、クリックと同時に  行う様に改善したく質問いたします。 注)Java暦は、初心者で約2週間ですが。下記にソースを添付いたしますので、宜しくお願いいたします。 //============================== package packageA; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; public class JTableTest2 extends JFrame{ public static void main(String[] args){ JTableTest2 test = new JTableTest2("T"); test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); test.setVisible(true); } JTableTest2(String name){ setBounds( 0, 0, 400, 200); setTitle(name); String d[][] = { {"A","8","7"}, {"B","6","5"}, {"C","7","6"} }; String t[] = {"名","数","英"}; DefaultTableModel tm = new DefaultTableModel(d,t); final JTable tablex = new JTable(tm); /* final JTable tablex = new JTable(tm){ @Override public Component prepareRenderer(TableCellRenderer tcr, int row, int column) { Component c = super.prepareRenderer(tcr, row, column); if (row == 2 && column == 2) { c.setForeground(Color.BLUE); c.setBackground(Color.RED); } else { c.setForeground(getForeground()); c.setBackground(getBackground()); } return c; } }; */ tablex.addMouseListener( new java.awt.event.MouseAdapter() { public void mousePressed(MouseEvent e) { int row=tablex.getSelectedRow(); int col=tablex.getSelectedColumn(); // TableCellRenderer tcr = tablex.getCellRenderer(row,col); // Component c = tablex.prepareRenderer(tcr,row,col); Component c = tablex.getComponentAt(row,col); c.setForeground(Color.BLUE); c.setBackground(Color.RED); System.out.println(" "+row+" "+col); } } ); JPanel p1 = new JPanel(); JScrollPane sp1 = new JScrollPane(tablex); sp1.setPreferredSize(new Dimension(250, 80)); p1.add(sp1); getContentPane().add(p1, BorderLayout.NORTH); } }

    • ベストアンサー
    • Java