【最大10000ポイント】当たる!!質問投稿キャンペーン!

やりたい事はJTableのカラム内の値を右寄せにしたいだけです。
APIマニュアルのJTableの項の「How to use table」を読むと、
その方法は、設定する値をObjectではなく、Integerオブジェクトに
するだけで、右寄せになるとの事。早速やってみたところ、Integer
あるいはFloat(多分Double)オブジェクトでも確かに右寄せになりました。
これはこれでいいのですが、それでは、Stringを右寄せにしたい時は
どうするの?という疑問が湧きました。どなたか、ご存知の方いらっしゃいますか?
また、そういうメソッドが別にあるのならば教えてください。

A 回答 (1件)

TableCellRenderer(またはDefaultTableCellRenderer)を使用します。


参考URLをご覧になるとおわかりいただけるかと思い
ますが、setHorizontalAlignment()で位置を指定して
います。これで好きなように右寄せ/左寄せできますよ。

参考URL:http://java-house.jp/ml/archive/j-h-b/036862.htm …
    • good
    • 0
この回答へのお礼

探し方が悪いっていやそうなんですが、
なんでAPIマニュアルにそういう簡単な方法を書いてくれないんですかね。
どう考えても数値オブジェクトだったら勝手に右寄せになるっていうのは
もしそれだけしか機能がないのであれば、おかしいですもんね。あそうか、JTableクラスの部分に限っての記載だからか。
Javaって敷居高いですね。助かりましたありがとうございました。

お礼日時:2003/05/16 18:45

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

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

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

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[] = {"車...続きを読む

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に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のインスタンスがあるわけではあり...続きを読む

Q一定のスペースを空けて端を揃えて表示

一定のスペースを空けて端を揃えて表示

お世話になります。
一定のスペースを空けて文字を表示したとき、縦に綺麗に揃えて表示したいのですがやり方がわかりません。
例えば、

apple ここに15個分のスペース (2,8) (3,6)
orange ここに15個分のスペース (3,7) (9,8) (2,10)
dog ここに15個分のスペース (3,0)
fortunately ここに15個分のスペース (6,6)

このように、各行の左側には英単語1つ、そして15個分のスペースを空けて、右側にその単語の座標を表示します。
この時に、座標を縦にきれいに揃えて表示したいのですが、英単語の長さによってバラバラになってしまいます。
どのようにスペースをあけて表示すればよいのでしょうか?宜しくお願いします。

Aベストアンサー

5分遅れで同じ回答をしてしまった(^^;
ついでなので、もう少し文字種の範囲を広げても大丈夫なものを作成してみた。

public static void main(String[] args) {
String[] word = {"りんご", "おranじ", "犬", "fortunately"};
String[] coord = {"(2,8) (3,6)", "(3,7) (9,8) (2,10)", "(3,0)", "(6,6)"};
java.nio.charset.Charset charset = java.nio.charset.Charset.forName("Shift_JIS");
int width = word[0].getBytes(charset).length + 15;
for (int i = 0; i < word.length; i++) {
String format = "%-" + (width - word[i].getBytes(charset).length + word[i].length()) + "s%s%n";
System.out.printf(format, word[i], coord[i]);
}
}

前提として、
与えられた文字がシフトJISで表せるようなもので、
シフトJISで1バイトコードになるものがいわゆる半角(1桁幅)、
2バイトコードになるものがいわゆる全角(2桁幅)となるのなら、
上のようにすることで対処できる。

要点は文字数でなく文字を構成するコードが何バイトかを数えて、
2バイトなら2桁分のスペースを用意する。
これには、getBytesでStringからバイト配列を得てlengthでバイト数を得る。

今度は書式文字列は各行ごとに変わる可能性がある。
widthはword[0]の文字列幅に15スペース分を加えたもの。
"apple"でなく"りんご"なので21になる。
つまり座標の表示は22桁目からということになる。

各行の書式文字列での、
(width - word[i].getBytes(charset).length + word[i].length())
で、バイト数と文字数との差を求めて表示幅から引くことで、
1文字が2桁になる場合に対処している。

書式は使いどころによって便利なもので、
printfで書式出力するところを、
StringクラスのformatメソッドでStringインスタンスにすることもできたりする。

5分遅れで同じ回答をしてしまった(^^;
ついでなので、もう少し文字種の範囲を広げても大丈夫なものを作成してみた。

public static void main(String[] args) {
String[] word = {"りんご", "おranじ", "犬", "fortunately"};
String[] coord = {"(2,8) (3,6)", "(3,7) (9,8) (2,10)", "(3,0)", "(6,6)"};
java.nio.charset.Charset charset = java.nio.charset.Charset.forName("Shift_JIS");
int width = word[0].getBytes(charset).length + 15;
for (int i = 0; i < word.length; i++) {
String format = "%-...続きを読む

Qボタンクリック後パネルを再描画repaintしたい

ボタンをクリック後にstaticで保持していた値にプラス1して
その値をパネルに再描画したいと思っています。
下記のプログラムだとボタンをクリックすると
(<1<2<3<4)となって画像と数字が増えてしまいます
行いたいのは数字の部分だけが再描画されて
カウントされて<3と表示されるだけになってもらいたい


クラス1つ目

import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.event.MouseEvent;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class Sample extends JFrame{
static int value=1;
JPanel work = new JPanel();
public static void main(String[] args) {
Sample frame = new Sample();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(100, 200, 200, 100);
frame.add(frame.createPanel(), BorderLayout.LINE_END);
frame.setVisible(true);
}
public JPanel createPanel() {

ImageIcon icon = new ImageIcon("./img/left.gif");
JLabel label = new JLabel();
Cursor c = new Cursor(Cursor.HAND_CURSOR);
label.setCursor(c);
label.setIcon(icon);
JLabel strLabel = new JLabel();
String str = Integer.toString(value);
strLabel.setText(str);
work.add(label);
work.add(strLabel);
label.addMouseListener(new myListener());
return work;
}
class myListener extends MouseAdapter{
public void mouseClicked(MouseEvent e){
System.out.print(Sample.value++);
createPanel().repaint();
setVisible(true);
}
}
}


クラス2つ目
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class MouseAdapter implements MouseListener{
public void mouseClicked(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mousePressed(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
}

ボタンをクリック後にstaticで保持していた値にプラス1して
その値をパネルに再描画したいと思っています。
下記のプログラムだとボタンをクリックすると
(<1<2<3<4)となって画像と数字が増えてしまいます
行いたいのは数字の部分だけが再描画されて
カウントされて<3と表示されるだけになってもらいたい


クラス1つ目

import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.event.MouseEvent;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing....続きを読む

Aベストアンサー

>class myListener extends MouseAdapter{
>createPanel().repaint();

createPanelでパネルを新規作成してrepaintしていますから、そういった動作になると思います。
labelをクラス変数として保持して、そこに設定するのが簡単だと思います。

QJTableクリック時の処理

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

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

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

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

Aベストアンサー

はずした回答だったらすみません。<(_ _)>
また「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 );
      }
    });

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

とりあえずJTableはaddMouseListenerというメソッドが使えますからそれで
マウスでのイベントを定義できるはずですし、JBuilder4を使用しているなら
設計画面のインスペクタにイベントというタブがありますからそこからmouseClicked
のイベントを自動的にJBuilder4が書いてくれるはずです。
実際書くならこんな感じでしょうか?ちなみに全然試していないので自信は
ありません。(^...続きを読む

Qボタンの複数割り当てについて

public class TestButton extends Applet implements ActionListener
{
     Button bt1,bt2,bt3;

     public void init()
     {
         bt1 = new Button("red");
         add(bt1);
         bt2 = new Button("blue");
         add(bt2);
         bt3 = new Button("yellow");
         add(bt3);
         bt1.addActionListener(this);
      }

java初心者です。アプレットで上のようにボタンを作ります。それぞれが押された時に、red,blue,yellowが表示されるようにしたいのです。ActionListenerをインプリメントしているので、

     public void actionPerformed(ActionEvent ae)

をオーバーライドする必要がありますが、そこで質問です。
ボタンを3種類別々に関連づけるには、actionPerformed内をどのように記述したらよいでしょうか?また、init内はこれだけでいいんでしょうか?
よろしくお願いします。

public class TestButton extends Applet implements ActionListener
{
     Button bt1,bt2,bt3;

     public void init()
     {
         bt1 = new Button("red");
         add(bt1);
         bt2 = new Button("blue");
         add(bt2);
         bt3 = new Button("yellow");
         add(bt3);
         bt1.addActionListener(this);
      }

java初心者です。アプレットで上のようにボタン...続きを読む

Aベストアンサー

これは色々やり方があります。
ボタンをメンバ変数として定義してActionEventの
getSource()メソッドでEventが発生したObjectと
比較するとか、getSource()で取得したオブジェクト
をButtonにキャストしてからgetLabel()でラベルの
文字列を取得し任意の文字列と比較するとか。
他にはアクションコマンドで分岐する方法もあります。

・メンバ変数の例

public class TestButton extends Applet implements ActionListener {
  Button btn1,btn2,bt3;
  public void init(){
    btn1=new Button("red");
    add(btn1);
    btn2=new Button("blue");
    add(btn2);
    btn3=new Button("yellow");
    add(btn3);
  }
  public void actionPerformed(ActionEvent e){
    Object obj=e.getSource();
    if(obj == btn1){
      // "red"の処理
    }
    else if(obj == btn2){
      // "blue"の処理
    }
    else if(obj == btn3){
      // "yellow"の処理
    }
  }
}

・ラベルで比較する例

public void acitonPerformed(ActionEvent e){
  Object obj=e.getSource();
  if(obj instanceof Button){
    Button btn=(Button)obj;
    String labStr=btn.getLabel();
    if("red".equals(labStr)){
      // "red"の処理
    }
    else if("blue".equals(labStr)){
      // "blue"の処理
    }
    else if("yellow".equals(labStr)){
      // "yellow"の処理
    }
  }
}

・アクションコマンドの例

public void actionPerformed(ActionEvent e){
  String cmdName=e.getActionCommand();
  if("red".equals(cmdName)){
    // "red"の処理
  }
  else if("blue".equals(cmdName)){
    // "blue"の処理
  }
  else if("yellow".equals(cmdName)){
    // "yellow"の処理
  }
}

制約が無ければアクションコマンドでの処理が私は好きです。

これは色々やり方があります。
ボタンをメンバ変数として定義してActionEventの
getSource()メソッドでEventが発生したObjectと
比較するとか、getSource()で取得したオブジェクト
をButtonにキャストしてからgetLabel()でラベルの
文字列を取得し任意の文字列と比較するとか。
他にはアクションコマンドで分岐する方法もあります。

・メンバ変数の例

public class TestButton extends Applet implements ActionListener {
  Button btn1,btn2,bt3;
  public void init(){
    btn1=new Bu...続きを読む

Qデータ数をカウントしたいのですが

JAVAのJDBCを使いMySqlを操作しデータ数を取得するプログラムです。自分なりに考えたプログラムは
Connection con = null;
String sql = "select count(*) from テーブル名";

// コネクションを作成する。
con = DriverManager.getConnection(url, user, pass);
Statement st = con.createStatement();

// SQLを実行する。
ResultSet rs = st.executeQuery(sql);
String count = rs.getString("count(*)");

実行した結果上手く出来ないのですが、この部分での間違いはありますか?

Aベストアンサー

どう上手くいかないのかエラーメッセージなどがあると分かりやすいのですが・・・とりあえず、count(*)というカラム名は取得できなかったと思います。

sqlを
select count(*) as cnt from テーブル名
にして、

値を取得する部分を
String coung = rs.getString("cnt");
にしてみてください。
もしくはsqlはそのままで、
rs.getString(1)
で1番目のカラムが取得できます。
(カラム名が固定なら最初のやりかたの方が分かりやすいと思います。)

Q(Swing)JTextFieldを半角のみ入力可能にする方法

JTextField で半角のみ入力可能なチェックを行いたいのですがどうもうまくいきません。
下記のソースは、入力桁数制限チェックと、全角チェックを行っているのですが
半角を入力した後に全角を入力すると、JTextFieldの値が消えてしまいます。
どなたがご指導よろしくお願いします。
もしくは、下記ソースの他によいチェック方法等ありましたら、教えてくださいm(__)m
よろしくお願いいたします。

=======================================
userText.setDocument( new LimitedDocument( 8) );

/**
* 指定文字数・全角チェック
*/
private class LimitedDocument extends PlainDocument {
int limit;
LimitedDocument( int limit ){ this.limit = limit; }

public void insertString( int offset, String str, AttributeSet a ) {
try{

String wholeText = getText( 0, getLength() );
// 文字数チェック
byte[] b = wholeText.getBytes();
if( b.length >= limit ){
return;
}
char c = str.charAt(0);
// 文字が半角だったら挿入する。
if (c < 256 || (c >= 0xff61 && c <= 0xff9f)) {
super.insertString(offset, String.valueOf(c), a);
}
else {
}
}
catch( BadLocationException e ) {
System.out.println( e );
}
}
}

=======================================

JTextField で半角のみ入力可能なチェックを行いたいのですがどうもうまくいきません。
下記のソースは、入力桁数制限チェックと、全角チェックを行っているのですが
半角を入力した後に全角を入力すると、JTextFieldの値が消えてしまいます。
どなたがご指導よろしくお願いします。
もしくは、下記ソースの他によいチェック方法等ありましたら、教えてくださいm(__)m
よろしくお願いいたします。

=======================================
userText.setDocument( new LimitedDocument( 8) );

/**
*...続きを読む

Aベストアンサー

こんばんわ。こんなのはどうでしょう?

public void insertString(int offs, String str, AttributeSet a)
throws BadLocationException {
if (str == null || str.length() == 0)
return;

String strNew = new String();

// 挿入文字数分ループ
char[] strings = str.toCharArray();
for (int i = 0; i < strings.length; i++) {
char ch = strings[i];

// 禁則文字なら挿入しない
if (!isJapanese(ch)) {
ch = changeCharacter(ch);
strNew += String.valueOf(ch);
} else {
continue;
}
}
super.insertString(offs, strNew, a);
}

public static boolean isJapanese(char ch) {
if (((ch < 20) || (ch > 127))
&& ch != '\\'
&& ch != '\t'
&& ch != '\n'
&& ch != '\r'
&& ch != '\f') {
return true;
}
return false;
}

こんばんわ。こんなのはどうでしょう?

public void insertString(int offs, String str, AttributeSet a)
throws BadLocationException {
if (str == null || str.length() == 0)
return;

String strNew = new String();

// 挿入文字数分ループ
char[] strings = str.toCharArray();
for (int i = 0; i < strings.length; i++) {
char ch = strings[i];

// 禁則文字なら挿入しない
if (!isJapanese(ch)) {
ch = changeCharacter(ch);
strNew += String.valueOf(ch);
} else {
continue;
...続きを読む


人気Q&Aランキング