• ベストアンサー

Swing/JTableのカラム幅が変更されたときのイベントについて

ユーザーからそのJTableのカラム幅が変更されたときに、 特別な処理を行いたいのですが、方法の検討がつきません。 たとえば、ユーザーがカラム幅を変更したとき、それをテーブルに表示する。 ということをしたいのです カラム幅が変更されたときに呼び出されるリスナがあればいいのですが・・・ 方法がわかる方がいらっしゃいましたらよろしくお願いします

  • Java
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • HarukaV49
  • ベストアンサー率53% (48/89)
回答No.1

D列のイベントを所得して、その列幅を2行目の出力しています。 その要点は、 (1)addPropertyChangeListener()で、イベントを取得し、 (2)e.getPropertyName().equals("width")で、当該イベントを識別し、 (3)e.getNewValue()で、列幅を取得する ということです。 下にサンプルコードを示します。 どの程度説明が必要かわかりませんので、より詳細な説明が必要でしたら、具体的にご質問ください。 Actionインターフェース,MVCパターン等について知識がないと、全く不可解かも知れません。 import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; /** * Table幅イベントサンプル */ public class ColumnWidthEventSample { private JTable table; public ColumnWidthEventSample() { table = new JTable(); table.setModel( new DefaultTableModel(50,10) ); table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF ); PropertyChangeListener listener = new ColumnWidthChangeListener(); table.getColumnModel().getColumn(3).addPropertyChangeListener( listener ); table.setValueAt( "列幅は", 0, 3 ); JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add( new JScrollPane( table ) ); frame.setSize( 400, 400 ); frame.setVisible( true ); } private class ColumnWidthChangeListener implements PropertyChangeListener { public void propertyChange(PropertyChangeEvent e) { if( e.getPropertyName().equals("width") ) { table.setValueAt(e.getNewValue(), 1, 3); } } } public static void main(String[] args) { new ColumnWidthEventAample(); } }

foggi47
質問者

お礼

MVCパターンというのはよくわかりませんでしたが、 ソースコードについては理解できました。ありがとうございます。 リスナをJTableに追加することばかり考えていて Columnに追加することを思いつきませんでした。 PropertyChangeListenerを使うのは初めてですがAPIをみたら なんとなくわかりました また質問させていただくこともあるかと思いますが 今回はどうもありがとうございました

関連するQ&A

  • 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のカラム幅を動的に変えるに はどうすれば良いのでしょうか?   例えばアプリケーションの画面内で、あるボタンを 押すといくつかあるカラムの内の1つのカラムサイズ を"0"にし、またボタンを押すと元のサイズに戻す。 といったような処理がしたいのですが、、、 バージョンはj2sdk1.4.2_06です。 どなたか分る方が おられましたらよろしくお願いします。

    • ベストアンサー
    • Java
  • JTableのセルとコラムについて

    以下の(1)、(2)の方法を知っている方がいらしたら教えてください。 (1)JTableではテーブル内のセルをクリックした時に、クリックされたセルを含む行全体が選択状態になりますが、選択状態時にこの選択されているのがどの行なのかを調べる方法はありませんか? (2)WindowsMediaPlayerのように"アーティスト"のコラムを選択すると名前順にソートされますが、それをJTableで実現するために、JTableのコラムを選択したらイベントを発生させてその選択されたコラムを特定する方法はありませんか?

    • ベストアンサー
    • Java
  • JTableのカラム移動の抑止方法

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

    • ベストアンサー
    • Java
  • JTableとJScrollPaneについて

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

    • ベストアンサー
    • Java
  • SwingでJtableのヘッダ行が表示されません

    SwingでJtableのヘッダ行が表示されません 解決方法とどうして表示されなかったのか理由もできればお願いします。 import java.util.Vector; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableModel; public class Table_Calendar extends JFrame{ Vector<String>[] data = new Vector[3]; public static void main(String args[]){ new Table_Calendar(); } public Table_Calendar(){ super(); // ウィンドウサイズ this.setSize(800, 600); // レイアウト this.setLayout(null); // ウィンドウクローズ時の処理 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // セルのデータ作成 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"); // テーブル作成 TableModel tableModel = new AbstractTableModel() { // 行数 public int getRowCount() { return 1; } // 列数 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 ""; } }; JTable table = new JTable(tableModel); table.setLocation(10, 20); table.setSize(600,500); JPanel panel2 = new JPanel(); panel2.setLayout(null); panel2.add(table); /*setBounds(int x,int y,int width,int height)*/ panel2.setBounds(10, 10, 700,700); this.add(panel2); this.setVisible(true); } }

    • ベストアンサー
    • Java
  • JTableに、JConboBoxを入れる

    JTableのcolumn=0に、部署を入れます。 そしてcolumn=5に、JComboBoxを設定し、そのcolumn=5 のデータは、コンボボックスから選択してもらいます。 ただ、このコンボボックスの内容は、column=0に入れた 部署により変更したのです。 いろいろと参考にして、テーブルの指定のcolumnに コンボボックスを入れることは出来たのですが、 全部同じコンボボックスになってしまいます。 以下のようにしました。TableColumn の為、 みな同じになるのはわかるのですが、修正方法が わかりません。宜しくお願いいたします。 public void stepColumn(JTable table, TableColumn stepColumn) {  JComboBox comboBox = new JComboBox();  comboBox.setEditable(true);  comboBox.addItem("step_AAA");  comboBox.addItem("step_BBB");  stepColumn.setCellEditor(new DefaultCellEditor(comboBox)); }

  • SwingのJTableでのsort方法

    JTable上に以下のようなデータを表示してあります。     合計 国語 数学 英語 Aさん  250 100 80 70 Bさん 230 100 90 40 Cさん 200 70 80 50 今、合計の降順に並んでいますが、 これを、コマンドボタンクリックにより、 英語の降順に並びなおそうと考えています。 1度2次元配列にデータを代入し、arrays.sortで、 並び替え、再度、Jtableで表示するつもりです。が、 jTableに、もっと簡単に並び替えて表示させる 方法はないでしょうか? よろしくお願いいたします。

  • JTableについて 急

    皆さまのお知恵をお貸頂けると助かります。  JTableクラスを使ってテーブルの列の幅の値を決めたいのと、 数字をセルに入力したいのですが9までは09のように0をつけて 表示したいのですが、2日間止まってしまって困っています。 いろいろとググったりしたのですが 汗

  • 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

専門家に質問してみよう