忙しい現代人の腰&肩のお悩み対策!

JTable の 列幅を個別に設定するには、
どのようにしたらよいのでしょうか?
APIを参照しましたが、個別に列幅を
変えられるようなメソッドは見当たらなかったのですが…

A 回答 (2件)

簡単なサンプルコードを示しました。


ご参考まで。


import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class TableSample {

public static void main(String[] args) {

JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JTable table = new JTable();
table.setModel( new DefaultTableModel(100,30) );
table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
table.getColumnModel().getColumn(3).setPreferredWidth( 150 );
table.setRowHeight( 2, 60 );
table.setValueAt( "<html>ここの列幅を150<br>行高を60にしました", 2, 3 );

frame.add( new JScrollPane(table) );
frame.setSize( 800, 400 );
frame.setVisible( true );

}
}
    • good
    • 0

JTable#getColumn("列名")でTableColumオブジェクトを取得し


TableColum#setPreferredWidth(列の幅)で設定できます。

しかしJTableの幅によって再調整されてしまうので工夫が必要です。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QJTableの列の幅設定

JTableの列の幅設定をしたいのですが、
わかりません。教えて下さい。

setRowHeightのように、setColumnHeightみたいなのって、
ないのでしょうか?

Aベストアンサー

今、テーブルの列が2列で、JTable table;だったとします。


DefaultTableColumnModel cmodel=(DefaultTableColumnModel)table.getColumnModel();
TableColumn column0 = cmodel.getColumn(0);
TableColumn column1 = cmodel.getColumn(1);
column0.setPreferredWidth(40);
column1.setPreferredWidth(250);

という感じで設定できたかと思います。

QSwing 編集不可でも選択可能なJTableセルの設定方法

テーブルデータ編集不可でも行選択可能なJTableの設定方法をお教えいただきたいです。

私が試した方法では一つ問題点があり困っております。
その問題点とは、
セルをダブルクリックするとセルがへこみ、
そのまま別イベントでプログラム内部からテーブルへ書き込みをすると、
上記へこんだセルのみ変更が反映されないのです。

JTableを継承したJTableCustomクラスを作成し、
テーブルセル編集の不可設定を行うsetEditFalseメソッドを作成しました。
(補足:JTableのEnabledをfalseにすると行選択ができなくなってしまうので、
 CellEditerを使用しています)

public class JTableCustom extends JTable {

public JTableCustom() {
super();
this.setModel(new DefaultTableModel());
this.setSize(300,200);
}

/**
* テーブルセルの編集ができないように設定します。<br>
*/
public void setEditFalse(){
JTextField tf = new JTextField("");
tf.setEditable(false);
DefaultCellEditor dce = new DefaultCellEditor(tf);
TableColumnModel tcm = this.getColumnModel();
for (int i = 0; i < tcm.getColumnCount(); i++){
tcm.getColumn(i).setCellEditor(dce);
}
}
}

JTableCostomインスタンス作成後、上記メソッドを呼び設定を行います。

上記メソッドにセルがへこまないように設定する方法、
もしくは別の方法で上記機能を満たすものがあれば教えていただきたいです。
よろしくお願い致します。

テーブルデータ編集不可でも行選択可能なJTableの設定方法をお教えいただきたいです。

私が試した方法では一つ問題点があり困っております。
その問題点とは、
セルをダブルクリックするとセルがへこみ、
そのまま別イベントでプログラム内部からテーブルへ書き込みをすると、
上記へこんだセルのみ変更が反映されないのです。

JTableを継承したJTableCustomクラスを作成し、
テーブルセル編集の不可設定を行うsetEditFalseメソッドを作成しました。
(補足:JTableのEnabledをfalseにすると行選択が...続きを読む

Aベストアンサー

編集を不可にするのなら、TableModel#isCellEditable(int rowIndex, int columnIndex)
を調整してください。

全てのセルを編集不可にするなら、DefaultTableModelのisCellEditable(int rowIndex, int columnIndex)を常にfalseを返すようにオーバーライドすればいいでしょう。

QJtableの特定のセルの背景色や文字色について

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

Aベストアンサー

prepareRenderer()をオーバーライドする例。

JTable table = new JTable(model) {
@Override
public Component prepareRenderer(TableCellRenderer tcr, int row, int column) {
Component c = super.prepareRenderer(tcr, row, column);
if (row == 20 && column == 20) {
c.setForeground(Color.BLUE);
c.setBackground(Color.RED);
} else {
c.setForeground(getForeground());
c.setBackground(getBackground());
}
return c;
}
};

QSwingで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);
}

}

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()...続きを読む

Aベストアンサー

No.1様の回答のとおり、JScrollPaneに入れると自動で表示されるようです。

GUI系は正直全然知らないのですが、APIには
>スタンドアロンのビュー (JScrollPane の外側) 内で JTable を使用し、ヘッダーを表示する場合は、getTableHeader() を使用してヘッダーを取得し、個別に表示できます。
とあります。
JscrollPaneの外側でヘッダーを表示するサンプルが、チュートリアルにありました。
http://download.oracle.com/javase/tutorial/uiswing/components/table.html#show
>container.setLayout(new BorderLayout());
>container.add(table.getTableHeader(), BorderLayout.PAGE_START);
>container.add(table, BorderLayout.CENTER);
とすると表示できるようです。

まずはAPIなどを見てみるようにしてみてはいかがでしょうか。

No.1様の回答のとおり、JScrollPaneに入れると自動で表示されるようです。

GUI系は正直全然知らないのですが、APIには
>スタンドアロンのビュー (JScrollPane の外側) 内で JTable を使用し、ヘッダーを表示する場合は、getTableHeader() を使用してヘッダーを取得し、個別に表示できます。
とあります。
JscrollPaneの外側でヘッダーを表示するサンプルが、チュートリアルにありました。
http://download.oracle.com/javase/tutorial/uiswing/components/table.html#show
>container.setLayout(new BorderLayout...続きを読む

Q2列目を右寄せにしたい

今JAVAを勉強しているのですが、
下記のソース上でどうしても
列の右寄せができません。
リファレンスの調べ方が下手なのかもしれませんが
わかる方宜しくお願いします。

----------------------------------------------
import java.awt.*;
import javax.swing.*;

public class Sample3 extends JApplet
{
private JLabel lb;
private JTable tb;
private JScrollPane sp;

public void init()
{
//コンテンツペインの取得
Container cnt = getContentPane();

String colname[] = {"車名","価格","月日"};
String data[][] = {
{"乗用車","1200円","10-01"},
{"トラック","2400円","10-05"},
};

//コンポーネントの作成
lb = new JLabel("いらっしゃいませ");
tb = new JTable(data,colname);
sp = new JScrollPane(tb);

//コンテナへ追加
cnt.add(lb,BorderLayout.NORTH);
cnt.add(sp,BorderLayout.CENTER);
}
}
-------------------------------------------------

今JAVAを勉強しているのですが、
下記のソース上でどうしても
列の右寄せができません。
リファレンスの調べ方が下手なのかもしれませんが
わかる方宜しくお願いします。

----------------------------------------------
import java.awt.*;
import javax.swing.*;

public class Sample3 extends JApplet
{
private JLabel lb;
private JTable tb;
private JScrollPane sp;

public void init()
{
//コンテンツペインの取得
Container cnt = getContentPane();

String c...続きを読む

Aベストアンサー

 こんばんは。

 2列目のコラムに右寄せ用のDefaultCellRendererを設定してやればいいと思います。

 ↓こんな感じでしょうか。

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

public class Sample3 extends JApplet
{
  private JLabel lb;
  private JTable tb;
  private JScrollPane sp;
  
  public void init()
  {
    //コンテンツペインの取得
    Container cnt = getContentPane();
    
    String colname[] = {"車名","価格","月日"};
    String data[][] = {
    {"乗用車","1200円","10-01"},
    {"トラック","2400円","10-05"},
    };
    
    //コンポーネントの作成
    lb = new JLabel("いらっしゃいませ");
    tb = new JTable(data,colname);
    sp = new JScrollPane(tb);
    
    TableColumnModel cm = tb.getColumnModel();
    TableColumn column = cm.getColumn(1);
    DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
    renderer.setHorizontalAlignment(SwingConstants.RIGHT);
    column.setCellRenderer(renderer);
    
    //コンテナへ追加
    cnt.add(lb,BorderLayout.NORTH);
    cnt.add(sp,BorderLayout.CENTER);
  }
}

 こんばんは。

 2列目のコラムに右寄せ用のDefaultCellRendererを設定してやればいいと思います。

 ↓こんな感じでしょうか。

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

public class Sample3 extends JApplet
{
  private JLabel lb;
  private JTable tb;
  private JScrollPane sp;
  
  public void init()
  {
    //コンテンツペインの取得
    Container cnt = getContentPane();
    
    String colname[] = {"車...続きを読む

QJTableのイベント取得方法

お世話になります

JTableにDBからの検索結果を表示させて、そのセルを編集したときに編集したセルに対してアップデート等の処理を行いたいのですが、セルが編集されたときのイベントを取得したいのですがうまくいきません。
具体的なソース等のアドバイスよろしくお願いします。

---ソース---
TableEditListener lisner = new TableEditListener()
tableModel = new AbstractTableModel(vecResult,clmName);
tableModel.addTableModelListener(lisner);
table = new JTable(tableModel);

内部クラス

class TableEditListener implements javax.swing.event.TableModelListener{

 public TableEditListener(){
}
public void tableChanged(TableModelEvent e){
System.out.println("セルの編集をしました。");
}
}

現在以上のようなソースになっています。

よろしくお願いします。

お世話になります

JTableにDBからの検索結果を表示させて、そのセルを編集したときに編集したセルに対してアップデート等の処理を行いたいのですが、セルが編集されたときのイベントを取得したいのですがうまくいきません。
具体的なソース等のアドバイスよろしくお願いします。

---ソース---
TableEditListener lisner = new TableEditListener()
tableModel = new AbstractTableModel(vecResult,clmName);
tableModel.addTableModelListener(lisner);
table = new JTable(tableModel);

...続きを読む

Aベストアンサー

aotakatakaさんはJTable自身のイベントとCellEditorのイベントを混同して
しまっているのかもしれませんね。editingStoppedはCellEditorのイベントです。

/**
* 内部テーブルクラス
*/
class ETable extends JTable{
public ETable( TableModel tableModel ){
super( tableModel );

DefaultTableColumnModel colModel = (DefaultTableColumnModel)getColumnModel();
//0番目のカラムを取得する
TableColumn col0 = colModel.getColumn( 0 );
//0番目のカラムにMyCellEditorをセットする
col0.setCellEditor( new MyCellEditor( new JTextField() ) );

}
}

/**
* CellEditor
*/
class MyCellEditor extends DefaultCellEditor{
MyCellEditor( JTextField tf ){
super( tf );
setClickCountToStart( 1 );
//MyEditorListenerを追加
addCellEditorListener( new MyEditorListener() );
}
}

/**
* CellEditorListener
*/
class MyEditorListener implements CellEditorListener{
//セルの編集が終わった時
public void editingStopped( ChangeEvent e ){
}
public void editingCanceled( ChangeEvent e ){
}
}

>MyEditorListenerをどのようにJTableに組み込んでいいのかわからず困っています。

 MyEditorListenerをJTableに組み込むのではなく、MyEditorListener
 を追加したMyCellEditorをJTableに組み込むというのが正解です。

 CellEditorやここでは関係ありませんがCellRendererなどは覚えてしまうと
 非常に便利なクラスです。是非頑張ってください。
 また不明点がありましたら補足を下さい。

aotakatakaさんはJTable自身のイベントとCellEditorのイベントを混同して
しまっているのかもしれませんね。editingStoppedはCellEditorのイベントです。

/**
* 内部テーブルクラス
*/
class ETable extends JTable{
public ETable( TableModel tableModel ){
super( tableModel );

DefaultTableColumnModel colModel = (DefaultTableColumnModel)getColumnModel();
//0番目のカラムを取得する
TableColum...続きを読む

QJTableの特定セルの背景色を変更

現在swingを勉強中です。
よろしくお願いします。

JTableで例えば、ある列の値が
1行目:10~100
2行目:20~40
3行目:80~120
4行目:150~200
のような範囲を持った値のとき、
範囲が重なっている1行目から3行目のセルの背景色を変更したいのですが、可能でしょうか。
おそらくTableCellRender等を使用するのかとは思うのですが…

Aベストアンサー

 こんにちは。

>範囲が重なっている1行目から3行目のセルの背景色を
>変更したいのですが、可能でしょうか。

 可能です。

 ただし、JTableの内部構造をある程度知っておく必要があります。

 JTableやJListは、描画方法がやや変わっています。
 たとえば、JTabelのディフォルトのTableCellRendererは、DefaultTableCellRendererですが、これは、JLabelを継承して作られているので、実質はJLabelです。
 しかし、10×10の表があった場合、100個のJLabelのインスタンスがあるわけではありません。
 DefaultTableCellRendererのインスタンスは一つで、それを描画時にポンポンとハンコのように押していくことで、描画していきます。

 それを実現しているのが、getTableCellRendererComponentメソッドです。

 ぜひ、DefaultTableCellRendererのソースコードを読んでみてください。

 ここを理解できれば、あとは、DefaultTableCellRendererを継承し、getTableCellRendererComponentメソッドをオーバーライドして、自分の意に沿うRendererを実装することはたやすいと思います。

 こんにちは。

>範囲が重なっている1行目から3行目のセルの背景色を
>変更したいのですが、可能でしょうか。

 可能です。

 ただし、JTableの内部構造をある程度知っておく必要があります。

 JTableやJListは、描画方法がやや変わっています。
 たとえば、JTabelのディフォルトのTableCellRendererは、DefaultTableCellRendererですが、これは、JLabelを継承して作られているので、実質はJLabelです。
 しかし、10×10の表があった場合、100個のJLabelのインスタンスがあるわけではあり...続きを読む

QJTableのヘッダー文字のサイズ変更

JTableにおいて、フォントサイズを全て12にしたいのですが、
どうしてもヘッダー列の文字が変更できません。
ヘッダー列以外は変更できたのですが・・・
お知恵を貸していただけると助かります。

Aベストアンサー

こんにちは

JTableHeader jh = jTable1.getTableHeader();
jh.setFont(new Font(jh.getFont().getFamily(),Font.PLAIN,12));

QJTableの列ヘッダ

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

お手数ですがご教授お願いします。

Aベストアンサー

> テーブルをスクロールパネル⇒パネル⇒フレームと乗せると表示さ
> れるのですが、テーブル⇒パネル⇒フレームとすると表示されない
> ようなのです。
あぁ!。そのことなら、JTableのドキュメンテーションの最初のほうに、相当昔から書いてありますよ。設計者は、テーブル本体を切り離せたほうが便利、と考えたのでしょう。以下はドキュメンテーションからの引用です(日本語のは例によって文章がヘンなので、英語を引用します):

<quote>
Note that if you wish to use a JTable in a standalone view (outside of a JScrollPane) and want the header displayed, you can get it using getTableHeader() and display it separately.
</quote>

以下のプログラムをコンパイルして動かしてみてください:
(全角スペース->半角スペースに)
----------------------------------------------
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import static java.awt.FlowLayout.*;

public class TableRheaders{

 public static void main(String[] args){
  String[][] rowData = {
   {"1-1", "1-2"},
   {"2-1", "2-2"}
  };
  String[] header = {"1列目", "2列目"};

  JFrame frame = new JFrame();
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  JPanel pane = new JPanel();
  pane.setLayout(new FlowLayout(CENTER, 0, 0));
  JTable tbl = new JTable(rowData, header);
  JTableHeader jth = tbl.getTableHeader();

  pane.setPreferredSize(new Dimension(150, 100));
  pane.add(jth);
  pane.add(tbl);

  frame.setSize(200, 150);
  frame.getContentPane().add(pane);
  frame.setVisible(true);
 }
}
-----------------------------------

> テーブルをスクロールパネル⇒パネル⇒フレームと乗せると表示さ
> れるのですが、テーブル⇒パネル⇒フレームとすると表示されない
> ようなのです。
あぁ!。そのことなら、JTableのドキュメンテーションの最初のほうに、相当昔から書いてありますよ。設計者は、テーブル本体を切り離せたほうが便利、と考えたのでしょう。以下はドキュメンテーションからの引用です(日本語のは例によって文章がヘンなので、英語を引用します):

<quote>
Note that if you wish to use a JTable in a standalone view (ou...続きを読む

QJScrollPane上のJTableの再描画

JPanel上で,以下の初期化関数を作って,データが更新されたときに,この初期化関数を再度呼び出して,テーブルを作り直しています.

描画直後は,正しく表示されるのですが,
スクロールバーに触ったり,セルをクリックしたりすると,
初めに作成したテーブルの表示に戻ってしまいます.

何が原因で,どのように対処すれば良いのでしょうか?
ご回答いただけますよう,よろしくお願いいたします.

public void init_table()
{
tablemodel1 = new DefaultTableModel(column_names1, text.keyword_num);
table1 = new JTable(tablemodel1);
scrollt1 = new JScrollPane(table1);
add(scrollt1);

    以下略
}

Aベストアンサー

何にadd()しとんのや?
レイアウトマネージャはちゃんとしとんのか?

ふつうSwingのコンテナなら、
古いコンポーネントを
remove()して
repaint()して
新しいコンポーネントを
add()して
revalidate()するのが基本的な手続きどすえ。


人気Q&Aランキング