JLabelになら分かるのですがJTableのほうがよく分からないのです。

また、どのように記述すればよいのでしょうか?
参考までにJLabelの方を乗せておきます。
すべては自分の勉強不足が原因なのですが、お分かりになる方はお知恵をお貸し下さい。

private void displayData(){
try {
MainMenu mainMenu = new MainMenu();
sqlStr = mainMenu.getSendsqlstr();
System.out.println(sqlStr);
//ドライバクラスをロードする
Class.forName("com.mysql.jdbc.Driver");//org.gjt.mm.mysql.Driverこっちの可能性もあり
//MySQLに接続
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/nelfsystem", "root", "root");
//ステートメント生成
pstmt = (PreparedStatement) con.prepareStatement(sqlStr);
//SQL文実行
rs = pstmt.executeQuery(sqlStr);
rs.first(); // 最初の行に移動

jLabel30.setText("" + rs.getInt("member_id"));
jLabel31.setText(rs.getString("member_name"));
jLabel32.setText(rs.getString("member_furigana"));
jLabel33.setText(rs.getString("birth_day"));
jLabel34.setText(rs.getString("sex"));
jLabel36.setText(rs.getString("telephone"));
jLabel37.setText(rs.getString("telephone_2"));
jLabel29.setText(rs.getString("zipcode"));
jLabel38.setText(rs.getString("address"));
jLabel39.setText(rs.getString("address_2"));
jLabel41.setText(rs.getString("douki"));
jLabel40.setText(rs.getString("e_mail"));
jTextArea2.setText(rs.getString("remarks"));

}
catch(Exception ex){
System.out.println("Error:" + ex.toString() + ex.getMessage());
}
}

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

A 回答 (1件)

MySQLからレコードを取得する方法は既にわかっていて、JTableに値を表示する方法がわからない、ってことだろうか。



JTableに値を表示する場合は、一番簡単なのは表示する値を配列にまとめてnew JTableする際に渡す、というやり方。値を取り出して、二次元配列にまとめてnew JTableのときに引数で渡す。

が、一般的なのは、モデルクラスを定義して、そいつをJTableに設定するやり方だろう。後々を考えると、こっちを採用したほうがいいな。参考URLの記事を参照のこと。

参考URL:http://allabout.co.jp/internet/java/closeup/CU20 …
    • good
    • 0

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

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

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

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

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

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

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

Qデータベースから取得したデータを配列に格納できません。

jTableにSQL文の結果を表示させようとして結果を以下のように配列に
格納しようとしました。

public String[][] Serch(){

int i=0;
String[][] rowData;
String str = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=helloTable.mdb";

try {
// ドライバクラスをロード
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
// データベースへ接続
Connection con = DriverManager.getConnection(str, "", "");
// ステートメントオブジェクトを生成
Statement stmt = con.createStatement();

String sql = "SELECT * FROM ハローテーブル";

ResultSet rs = stmt.executeQuery(sql);

while(rs.next()){

// NOを取得
String no = String.valueOf(rs.getInt("NO"));
// 言語を取得
String lang = rs.getString("言語");
// メッセージを取得
String msg = rs.getString("メッセージ");

rowData[i][0] = no;
rowData[i][1] = lang;
rowData[i][2] = msg;
i++;
}
stmt.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
return rowData;
}
このメソッドで得た配列を表示させようとすると以下の結果が表示されます。

java.lang.NullPointerException

正常なSQL文の結果は以下の通りです。
1 日本語 こんにちは世界
2 英語 Hello World
3 ドイツ語 Hallo Welt

配列の行数はSQL文の結果の行数に合わせたかったのですがうまくいきません。
どのように直せばSQL文の結果を配列にすべて格納できるでしょうか?

jTableにSQL文の結果を表示させようとして結果を以下のように配列に
格納しようとしました。

public String[][] Serch(){

int i=0;
String[][] rowData;
String str = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=helloTable.mdb";

try {
// ドライバクラスをロード
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
// データベースへ接続
Connection con = DriverManager.getConnection(str, "", "");
// ステートメント...続きを読む

Aベストアンサー

rowDataを初期化してください。
VectorやListも使うと楽になるかもしれませんよ。

Qアプリケーションでの画面遷移

JavaJ2SEを使ってアプリケーションを作成しています。
ボタンを押すと画面が遷移するというプログラムがわかりません。
今出ているフレームを閉じて、別のフレームを開きたいと思っているのですが、記述が思いつきません。
よろしくお願いします。

Aベストアンサー

>>jazzy_tさん

JButtonなどのメソッド、setActionCommandを利用します。
setActionCommandを利用して各オブジェクト毎にActionCommand
というものを設定し、イベント発生時にそのイベントから
getActionCommandメソッドで、イベントを発生させたオブジェクト
のActionCommandを取得し、イベントを発生させたオブジェクト毎
に処理を分ける事ができます。

具体的には以下のような感じ

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Frame1 extends JFrame
implements ActionListener{

// コンストラクタ
public Frame1(){

super( "FRAME1" );

// ボタン1を作成
JButton button1 = new JButton( "FRAME2へ" );
// アクションコマンド設定
button1.setActionCommand( "btn1" );

// ボタン2を作成
JButton button2 = new JButton( "FRAME3へ" );
// アクションコマンド設定
button1.setActionCommand( "btn2" );

// アクションリスナークラス登録
button1.addActionListener( this );
button2.addActionListener( this );

......中略.......

}

// メイン
public static void main( String[] args ){

Frame1 frame =
new Frame1();
frame.setVisible( true );

}

public void actionPerformed( ActionEvent ae ){

try{

// アクションイベントから
// アクションコマンドの取得
String command = ae.getActionCommand();

// 押下されたボタンを判別して
// それぞれの処理を行う
if( command.equals( "btn1" ) ){

// ボタン1が押下されたので
// それに対応した処理を記述

}else if( command.equals( "btn2" ) ){

// ボタン2が押下されたので
// それに対応した処理を記述

}

......中略.......

>>jazzy_tさん

JButtonなどのメソッド、setActionCommandを利用します。
setActionCommandを利用して各オブジェクト毎にActionCommand
というものを設定し、イベント発生時にそのイベントから
getActionCommandメソッドで、イベントを発生させたオブジェクト
のActionCommandを取得し、イベントを発生させたオブジェクト毎
に処理を分ける事ができます。

具体的には以下のような感じ

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
i...続きを読む

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

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


}...続きを読む

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作成時に...続きを読む

QEclipseでのJDBCドライバについて

Eclipse3.1でデータベース(mysql)にアクセスするプログラムを作ったのですが下記のエラーが出ます。

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

これはJDBCドライバのセットアップがうまく出来ていないからなのでしょうか?
またEclipseでは、~.jarというファイルをプロジェクトのWEB-INFのlibフォルダに入れれば使える印象があるのですが、参考書(EclipseのではなくJAVAなどの)などにあるようにTomcatのインストールフォルダ以下common/libに入れて環境変数を変更しないといけないのでしょうか?

ご存知の方教えてください、よろしくお願いします。

Aベストアンサー

WEB-INF以下に入れると実行はできるのですが、エクリプスが.javaファイルをコンパイルすることができません。projectの一覧を右クリックしてpropertyを選択し、ダイアログ右側からJava Build Pathを選択し、タグからLibrariesを選び、Add JARsボタンをおして.jarファイルを登録して下さい。
たぶんこれでコンパイルできるはずです。

QJTableのViewの操作に関して

JTableを利用してグラフィカルなテーブル表を作成したいと思っています。
(例)
NAME AGE TEL ADDRESS
------------------------------------
tanaka 30  X-X-X XXX
yamada 23 Y-Y-Y YYY

この際、以下のようなことは実現可能でしょうか?
また可能な場合、どのようなコーティングになるのでしょうか?

(1)特定の列を非表示にする
 例えば"TEL"カラムを非表示にする(ただし内部で内容を保持)
(2)値すべてを非表示にする
 ただし、"NAME"などの列名(ヘッダー)はそのまま表示する

Aベストアンサー

(1)
表示、非表示を司るプロパティはありません。
かわりにViewクラス(この場合はJTable)から列を削除したり追加したりさせます。

TableColumn column table.getColumn("TEL");
table.removeColumn(column);
table.addColumn(column);

一般には表示状態を記憶する変数を用意し、表示/非表示のリクエストがあるたびに
Viewクラスを再構築させるようにすると思います。
ちなみにこの方法で列を消したり追加しても内部のデータに影響は出ません。

自分だったら列の表示・非表示ができるJTableのサブクラスを作りますね。

(2)
こちらも表示・非表示することはできず、表示させたくない場合は
Modelクラスから全ての行を削除することになるでしょう。
削除すると値の保持はされませんので、元のModelのコピーを作っておく必要があるでしょう。

ざっくり書きましたが、この2つを実装するのはおそらく結構しんどいです。


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

人気Q&Aランキング

おすすめ情報