• 締切済み

フォーカスのあるセルを中心に表示したい

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

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

みんなの回答

  • kacchann
  • ベストアンサー率58% (347/594)
回答No.1

import javax.swing.*; import java.awt.*; public class Demo extends JScrollPane{ public Demo(){ MyTbl t=new MyTbl(20,10); t.setAutoResizeMode(t.AUTO_RESIZE_OFF); setViewportView(t); } public static void main(String[] args){ JFrame f=new JFrame(); f.getContentPane().add(new Demo()); f.setSize(new Dimension(300,200)); f.show(); } class MyTbl extends JTable{ public void changeSelection(int r,int c,boolean t,boolean e){ super.changeSelection(r,c,t,e); Rectangle g=getCellRect(r,c,true); getViewport().setViewPosition(new Point(g.x-(getViewportBorderBounds().width-g.width)/2,(int)getViewport().getViewPosition().getY())); Demo.this.repaint(); } MyTbl(int r,int c){super(r,c);} } } http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=21620&forum=12&4 それよりもまず、 「デフォルトの挙動を変えなければならない十分な理由」があるのかを 再考することのほうが重要。

関連するQ&A

  • javaのpanelが表示されません

    下記のプログラムを作ったんですが、eclipseで実行するとフレームは表示されますが、空のフレームのような状態で、panelやボタンなどは表示されません。mainとは別のクラスで作成してるからなんでしょうか?よろしくお願いします。 import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; public class Table0 { public static void main(String[] args) { new Frame0(); } } class Frame0{ JFrame frame; JPanel panel; JScrollPane jsp; JTable table; DefaultTableModel dtm; public Frame0(){ frame=new JFrame("table"); frame.setBounds(30, 30, 300, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); table=new JTable(8,5); jsp=new JScrollPane(table); jsp.setPreferredSize(new Dimension(250, 70)); panel=new JPanel(); panel.add(jsp); Container c=frame.getContentPane(); c.add(panel,BorderLayout.CENTER); } }

    • ベストアンサー
    • 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でスクロールバーが表示されない

    JTableで表を作成しました。 表示はされているのですが、 スクロールバーが表示されません。 コードは下記の通りです。 どうか宜しくお願いいたします。 ■Java import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.*; public class ren32 extends JApplet{ Container c; public void init(){ c = this.getContentPane(); c.setLayout(null); String[] cname = { "name","comment","test1","test2", "(0)","(1)","(2)","(3)","(4)", }; Object[][] cell = { {"","","","","","","","",""}, }; JTable table = new JTable(cell, cname); JScrollPane sp = new JScrollPane(table); sp.setBounds(10,10,750,380); c.add(sp); } } ■html <html> <head> <title>Ren1</title> <body bgcolor=white text=black> <applet code="ren32.class" width="800" height="500"> </applet> </head> </html>

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

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

    • ベストアンサー
    • Java
  • javaで2パネルにテーブルデーターを表示

    今日は! javaの初心者で、初心者なりに、フレームに2個のパネルを作成し、各パネルに同じ テーブルデーターを表示するコードを作ってみましたが、旨く行きません。 下記の添付コードで、不具合点の改造箇所をお教え頂けますと大変助かります。 //================================== package packageA; import java.awt.BorderLayout; import java.awt.Dimension; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; public class JTableTest2 extends JFrame{ public static void main(String[] args){ JTableTest2 test = new JTableTest2("JTableTest2"); test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); test.setVisible(true); } JTableTest2(String name){ setBounds( 0, 0, 300*2, 140*2); setTitle(name); String data[][] = { //テーブルデータを作る {"田辺太郎","89","79","100","100"}, {"山田大助","68","55","72","100"}, {"佐藤恵美","78","69","81","100"} }; //列名の配列 String title[] = {"名前","数学","英語","国語","音楽"}; JTable table = new JTable(data,title); //テーブルデータと列名でテーブルを作る JPanel p1 = new JPanel(); JPanel p2 = new JPanel(); JScrollPane sp = new JScrollPane(table); sp.setPreferredSize(new Dimension(250, 80)); p1.add(sp); //JPanelにJScrollPaneを結合する p2.add(sp); //JPanelにJScrollPaneを結合する getContentPane().add(p1, BorderLayout.WEST); getContentPane().add(p2, BorderLayout.EAST); } } 以上、宜しくお願いします。

    • ベストアンサー
    • Java
  • javaのフレームにサイズがセットされてない?

    前回、http://okwave.jp/qa/q8069621.htmlで質問しました。 回答をもとにframe.setvisible(true)をコンストラクタの最後にするとうまくいき回答を締め切ったんですが・・・。 しかし、mainメソッドにframe.setvisible(true)を書くとフレームのタイトル部分だけとなり、 サイズがセットされないまま実行したときと同じようになってしまいます。 なぜでしょう?よろしくお願いします。 import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; public class Table0{ public static void main(String[] args) { Frame0 test=new Frame0(); test.setVisible(true); } } class Frame0 extends JFrame{ JFrame frame; JPanel panel; JScrollPane jsp; JTable table; DefaultTableModel dtm; public Frame0(){ frame=new JFrame("table"); frame.setBounds(30, 30, 300, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); table=new JTable(8,5); jsp=new JScrollPane(table); jsp.setPreferredSize(new Dimension(250, 70)); panel=new JPanel(); panel.add(jsp); Container c=frame.getContentPane(); c.add(panel,BorderLayout.CENTER); } }

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

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

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

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

    • ベストアンサー
    • 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
  • 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