bomberhead@Java初心者です。
WindowsNTでBorland社のJBuilder4を使用して
アプリケーションの開発をしています。

質問ですが、JTableクリック時の処理はどうすれば良いでしょうか?

手元の参考文献では別途ボタンを設けて、ボタンクリック時に
JTableの内容を取得する方法が載っているのですが
JTableクリック時にJTableの内容を取得したいと思っております。

何卒よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

はずした回答だったらすみません。

<(_ _)>
また「JTableの内容を取得する」という意味も取り違えていたらすみません。

とりあえずJTableはaddMouseListenerというメソッドが使えますからそれで
マウスでのイベントを定義できるはずですし、JBuilder4を使用しているなら
設計画面のインスペクタにイベントというタブがありますからそこからmouseClicked
のイベントを自動的にJBuilder4が書いてくれるはずです。
実際書くならこんな感じでしょうか?ちなみに全然試していないので自信は
ありません。(^^ゞ
    jTable1.addMouseListener(new java.awt.event.MouseAdapter() {
      public void mouseClicked(MouseEvent e) {
        //選択行の行番号を取得します
        int ii = jTable1.getSelectedRow();
        //選択行の1番目のカラムの内容を取得します。
        String s1 = (String)jTable1.getValueAt( ii, 1 );
      }
    });
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
イベントタブを見るとmouseClickedがありました。
見落としてたみたいです。よーくチェックしないと駄目ですね(^^;
これならなんとかできそうです。どうもありがとうございました。

お礼日時:2001/05/09 13:10

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

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の特定のセルの背景色や文字色について

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;
}
};

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()するのが基本的な手続きどすえ。

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

QJTableからのデータの取得

列数の多いテーブル (JTableの派生クラス) から
ユーザー定義クラス (各プロパティにはsetterとgetterは実装済み) に
効率的にデータを取得する方法を教えて下さい。

データの取り込みはTableModelクラスを使って行う予定ですが
列数が多いため、列番号でIF分岐してsetterを呼ぶのは
あまりに非効率な気がします。

どのように処理するのが良いのでしょうか?
お知恵をおかしください。宜しくお願い致します。

Aベストアンサー

>それは、引数で「名前」を渡してクラス内部で該当するプロパティを検索して
>値を設定すると言う意味ですか?

「プロパティを検索して」というのが、どのようなものをイメージされているかわかりませんが、
ちょっとニュアンスが違う気がします。

たとえば、


----------------------------------
public class XXXAdapter
{
XXX xxx;

public XXXAdapter(XXX xxx){

this.xxx = xxx;

}


public vod setValueByName(String name, Object value){

if(name.equals("id")){
xxx.setId((String)value);
}


}


}
----------------------------------


といった具合です。

最初の質問に
「列番号でIF分岐してsetterを呼ぶのはあまりに非効率な気がします。」
とありますが、それは仕方のないことです。

JAVAにはたまたまリフレクションと機構がありますが、他の言語ではそのような機構がないものも
たくさんあります。
そのような言語で処理するには、このような方法しかないでしょう。
(そのため個人的にはリフレクションはあまり好きではありません)


「非効率」というのが、コードの作成のことか、処理スピードのことかどちらを指しているのかわかりませんが、処理スピードであれば、さほど問題にはならないはずです。

また、コード作成に関してでしたら、「そういうものだ」と思ってください。


大事なのは、名前と処理の結びつけを、1箇所集中管理すること、このユーティリティクラスを使う側から中身を隠蔽してしまうこと、プログラムの最初の作成時よりもメンテナンスを考えることです。

>それは、引数で「名前」を渡してクラス内部で該当するプロパティを検索して
>値を設定すると言う意味ですか?

「プロパティを検索して」というのが、どのようなものをイメージされているかわかりませんが、
ちょっとニュアンスが違う気がします。

たとえば、


----------------------------------
public class XXXAdapter
{
XXX xxx;

public XXXAdapter(XXX xxx){

this.xxx = xxx;

}


public vod setValueByName(String name, Object value){

if(name.equals("id")){
xxx.setId((String)value);
}


}...続きを読む

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の列ヘッダ(列見出し)を表示する方法で、
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...続きを読む

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);

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

QJTableにチェックBOXの埋め込みは可能?

JTtableで作成したテーブルのセルに、チェックBOXなどのComponentを埋め込むことは可能ですか?

Aベストアンサー

可能です。
JTableは、各コラムのモデル、レンダラー、セルエディタといったものの組み合わせによるMVCモデルにより設計されています。この基本的な働きや使い方などはわかりますか? それがわからないと具体的な説明は難しいのですが・・。
 考え方としては、まずセルの値を編集するためのコンポーネントであるセルエディタ(CellEditor)を作成し、それをColumnModelの指定するコラムに設定をします。

DefaultCellEditor ce = new DefaultCellEditor(new JCheckBox());
<<JTable>>.getColumnModel().getColumn(0).setCellEditor(ce);

例えば、こんな形で組み込めばいいと思います。
ただし、このCellEditorはコラム単位で設定されますので、そのコラムではすべて設定したコンポーネントがセルエディタとして使用されます。特定のセルだけに表示させたい場合は、編集するセルの行に応じて処理を変えるなどの対処が必要になるように思います。

また、これは値を設定する場合の処理ですが、「セルの表示をチェックボックスにしたい」ということならば、セルのレンダラーを設定すれば良いでしょう。これはTableCellRenderer継承クラスをあらかじめ定義しておき、それをコラムに設定すれば良いでしょう。

// レンダラークラスの定義
class MyRenderer extends DefaultTableCellRenderer {

public Component getTableCellRendereComponent(略){
・・ここにレンダラーコンポーネントをreturnする処理を書く・・
}
}

//その組み込み
MyRenderer mr = new MyRenderer();
<<JTable>>.getColumnModel().getColumn(0).setCellRenderer(mr);

例えば、こんな感じになります。
いずれにしても、JTableの仕組みを理解してないとちょっと難しいと思いますので、まずはそれらから調べてみると良いかと思います。

P.S.
同じ投稿が以前のJava Houseにあったのでリンクをつけておきます。

参考URL:http://java-house.jp/ml/archive/j-h-b/020341.html

可能です。
JTableは、各コラムのモデル、レンダラー、セルエディタといったものの組み合わせによるMVCモデルにより設計されています。この基本的な働きや使い方などはわかりますか? それがわからないと具体的な説明は難しいのですが・・。
 考え方としては、まずセルの値を編集するためのコンポーネントであるセルエディタ(CellEditor)を作成し、それをColumnModelの指定するコラムに設定をします。

DefaultCellEditor ce = new DefaultCellEditor(new JCheckBox());
<<JTable>>.getColumnModel().get...続きを読む

QJTextFieldの入力制限

JAVAをはじめて間もない者です。

JTextFieldに入力制限をかけたいと思ってます。

・半角英数のみ入力可能。
・10バイトまでしか入力できない。

それとフォーカスが失ったときに
例えば「12345」と入力されているときに
「12345.00」と表示したいです。

以上、よろしくお願い致します。

Aベストアンサー

Javaは1.4以降をお使いですか? でしたら、JTextFieldを継承した「JFormattedTextField」クラスを使うのがよろしいかと。これはフォーマットされたテキストを表示するためのフィールドです。だいたい、以下の2つの機能を設定しておけばお望みのものができると思います。

・フォーマッタ
これは、java.textのDecimalFormatterやDateFormatterなどのFormaterクラスか、あるいはjavax.swing.textのMaskFormatterなどを使います。これらのクラスで表示フォーマットを用意し、これをJFormattedTextField作成時に引数で渡します。

・ベリファイア
入力データのベリファイを行うには、InputVerifier継承クラスを用意し、JFormattedTextFieldにsetInputVerifierで設定します。このInputVerifierクラスにはverifyメソッドを用意し、ここで値のベリファイを行ないます。

例えば、10桁の整数+2桁の小数を許可する入力フィールドだと、こんな感じになります。

// import java.text.*; を用意しておく

// JFormattedTextFieldは以下のように作成設定する
DecimalFormat df = new DecimalFormat("##########.00");
final JFormattedTextField field1 = new JFormattedTextField(df);
field1.setInputVerifier(new MyVerifier());

// ベリファイアは内部クラスで以下のように定義
static class MyVerifier extends InputVerifier{
public boolean verify(JComponent input){
boolean flg = true;
JFormattedTextField f = (JFormattedTextField)input;
String s = f.getText();
if (s.length() > 13){
flg = false;
f.setText("0000000000.00");
}
return flg;
}
}

10桁の整数以内だと.00という形で小数点以下2桁まで表示します。その桁を超えると、とりあえず"0000000000.00"に戻るようにしてあります。
 フォーマッタとベリファイアについては、JavaDoc等で調べてみるとよいでしょう。

参考URL:http://java.sun.com/j2se/1.4/ja/docs/ja/api/index.html

Javaは1.4以降をお使いですか? でしたら、JTextFieldを継承した「JFormattedTextField」クラスを使うのがよろしいかと。これはフォーマットされたテキストを表示するためのフィールドです。だいたい、以下の2つの機能を設定しておけばお望みのものができると思います。

・フォーマッタ
これは、java.textのDecimalFormatterやDateFormatterなどのFormaterクラスか、あるいはjavax.swing.textのMaskFormatterなどを使います。これらのクラスで表示フォーマットを用意し、これをJFormattedTextField作成時に...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報