• ベストアンサー

swingでのテキストを選択の認識

swingでメモ帳のようなものを作っているんですが メモ帳などのコピーや切り取りの機能は メニューバーの表示を見ると 文字が選択されて始めてsetEnabled(false)が 解かれて機能するようなっていると 思うのですが、どのようなメソッドを使い 文字が選択されたなどの有無を認識しすればよいでしょうか?? if(editArea.選択を読み取るメソッド) {      //選択されていれば切り取り      editArea.cut(); } else {    //そうでなければメニューバーは項目無効 cutAction.setEnabled(false); } といううようにしたいのですが、 select()を使うのかなと思うのですが。。 どなたかお願いします☆ ------------------------------------------ select(int selectionStart, int selectionEnd) 指定された始点と終点の間にあるテキストを選択します。 ------------------------------------------ のメソッドなど試したのですがうまくいきませんでした 記述の仕方が解かりません。

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

質問者が選んだベストアンサー

  • ベストアンサー
noname#49664
noname#49664
回答No.2

selectは、テキストを選択するためのメソッドですね。 「テキストが選択されているのかどうか知りたい」ということなら、以下のようなものが使えると思います。 getSelectedText() 選択されているテキストを返します。テキストが空なら選択されていないと考えられます。 getSelectionStart(),getSelectionEnd() 選択されたテキストの開始位置と末尾位置を返します。これで両者が同じならテキストは選択されていないと考えられます。 テキストの選択状態などをリアルタイムに知りたいような場合は、更に、addCaretListenerメソッドで、CaretListenerというイベントリスナーを組み込み、処理するといいでしょう。これはキャレットの位置が変更されるとcaretUpdateメソッドを呼び出します。このへんについてはJavadocのapiを調べてみてください。

nilyannko
質問者

お礼

みなさんありがとうございます!! 2つも使えるメソッドがあったんですね。 勉強になります!!

その他の回答 (1)

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.1

JTextComponent#getSelectionStart()と JTextComponent#getSelectionEnd() の戻り値で判断できると思います。

関連するQ&A

  • プログラムを補って下さい(swing)

    下記のプログラムで実装できない所がありますので補える方は教えてください 1.チェックボックスで削除を選択した、行番号をコンソールに表示したい。 2.コンボボックスで選択されたコンボボックスの文字列と選択されたコンボボックス   のインデックス番号が知りたい 以上です。 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.lang.Class; import javax.swing.DefaultCellEditor; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellEditor; import javax.swing.table.TableModel; public class JTableSample1 implements ActionListener{ JComboBox comboBox; public static void main(String[] args) { new JTableSample1().init(); } public void init() { String[] title = { "削除", "String", "Integer", "JComboBox" }; String prompt = "選んで下さい"; Object[][] records = { { Boolean.FALSE, "Rachel Green", new Integer(1970), prompt }, { Boolean.FALSE, "Monica Geller", new Integer(1969), prompt }, { Boolean.FALSE, "Phoebe Buffay", new Integer(1967), prompt }, { Boolean.FALSE, "Joey Tribbiani", new Integer(1967), prompt }, { Boolean.FALSE, "Chandler Bing", new Integer(1968), prompt }, { Boolean.FALSE, "Ross Geller", new Integer(1967), prompt } }; TableModel model = new DefaultTableModel(records, title) { public Class<?> getColumnClass(int column) { return getValueAt(0, column).getClass(); } }; JTable table = new JTable(model); comboBox = new JComboBox(); comboBox.addItem("ごはん食べてる"); comboBox.addItem("テレビみてる"); comboBox.addItem("仕事してる"); comboBox.addItem("寝てる"); TableCellEditor editor = new DefaultCellEditor(comboBox); table.getColumnModel().getColumn(3).setCellEditor(editor); JFrame frame = new JFrame("Joey Table"); frame.getContentPane().add(new JScrollPane(table)); frame.setSize(640, 240); frame.setVisible(true); } public void actionPerformed(ActionEvent e) { System.out.println("選択されたコンボボックス:"+(String)comboBox.getSelectedItem()); System.out.println("選択されたコンボボックスのインデックス番号:"+comboBox.getSelectedIndex()); } }

    • ベストアンサー
    • Java
  • SwingのJTableについて

    swingなのですが下記のプログラムで実現できない点があります。 1.isCellEditableメソッドを使ってセルを編集可能にしたのですが 編集した文字が消えてしまいます。 2.また、ボタンを配置してボタンを押下時に編集したセルの   行のデータをコンソールに表示したいのですがどうすればいいかわかりません。 3.画面レイアウトがsetLocation(x, y)した位置に表示されません。 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Vector; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableModel; public class JTableSample4 implements ActionListener { static Vector<String>[] data = new Vector[3]; static JFrame frame; public static void main(String[] args) { frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(null); JPanel panel1 = new JPanel(); // セルのデータ作成 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"); data[0].addElement("佐藤花子"); data[1].addElement("千葉県"); data[2].addElement("yyyyyyyyyy"); data[0].addElement("田中浩二"); data[1].addElement("埼玉県"); data[2].addElement("zzzzzzzzzz"); data[0].addElement("小川伸介"); data[1].addElement("新潟県"); data[2].addElement("aaaaaaa"); data[0].addElement("佐藤和也"); data[1].addElement("群馬県"); data[2].addElement("bbbbbbb"); data[0].addElement("渡辺悟"); data[1].addElement("愛知県"); data[2].addElement("ccccccc"); data[0].addElement("橋本智也"); data[1].addElement("愛媛県"); data[2].addElement("ddddddd"); data[0].addElement("永井祐二"); data[1].addElement("栃木県"); data[2].addElement("eeeeeee"); data[0].addElement("細貝昭二"); data[1].addElement("福岡県"); data[2].addElement("fffffff"); data[0].addElement("堀野友光"); data[1].addElement("長野県"); data[2].addElement("gggggggg"); // テーブル作成 TableModel tableModel = new AbstractTableModel() { // 行数 public int getRowCount() { return 10; } // 列数 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 ""; } /******************セルの編集 可/不可を操作するメソッド**********************/ public boolean isCellEditable(int rowIndex, int columnIndex) { /*0が1カラム目 1が2カラム目なのでこの場合電話番号だけ編集可*/ if (columnIndex == 0 || columnIndex ==1) { /*falseは編集不可*/ return false; } else /*trueは編集可*/ return true; } }; JLabel label = new JLabel("電話番号だけがセルを編集することができます"); label.setLocation(10, 10); label.setSize(300, 20); JButton button = new JButton("Click Me!"); button.setLocation(10, 400); button.setSize(20, 20); //button.addActionListener(); JTable table = new JTable(tableModel); JScrollPane scrollPane = new JScrollPane(table); scrollPane.setLocation(10, 40); scrollPane.setSize(750, 180); panel1.add(button); panel1.add(label); panel1.add(scrollPane); panel1.setBounds(10, 10, 800, 230); frame.add(panel1); frame.setSize(800, 600); frame.setVisible(true); } public void actionPerformed(ActionEvent e) { System.out.println("test"); } }

    • ベストアンサー
    • Java
  • SWTとSwingの違い

    Java初心者ですが、質問させてください。 SWTとSwingという二つのGUIを作るための手法(?)があるのを学習しました。そこで「SWTがOSネイティブのAPIを呼び出す」「Eclipse自体がSWTで組まれてる」「Swingより高速」「でも、SwingもPC環境の向上などで早い」などとどこかに書いてあった気がするのですが、疑問があります。 ・SwingでのGUIというのは、なんていうか、何年ぐらい前と具体的には言えないのですが、昔のJavaアプリっぽい、『浮いた感じ』のGUIになるのでしょうか。「Cabos」のGUIがちょうど、その「浮いた感じ」に相当するんですか? ・逆に、Eclipseで見られるように、Windows付属ソフトのようなメニューバーを持つ(マウスカーソルを合わせたときの色の変化や、選択したときのポップアップの仕方なども含め)ソフトで、Javaで作成されたものというのが、SWTで作られたソフトということでしょうか? ・Javaの特性と、SWTの特性を合わせて、「OSネイティブのAPIを呼び出すのにもかかわらず、同じ実行ファイルで、Windows・Mac両方ともで実行できるソフト」というのを作れるということでしょうか? ・Swing=「Cabosのような、あの浮いた感じ」ではあるのもの、高速化が十分なされているということですが、実際のところどうなのでしょうか。何か速度差の具体例があれば教えていただきたいのですが・・。何か「たとえ話」でもかまいません。 以上駄文で読みにくいかと思いますが、回答の程よろしくお願いします。

    • ベストアンサー
    • Java
  • Swing 編集不可でも選択可能な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インスタンス作成後、上記メソッドを呼び設定を行います。 上記メソッドにセルがへこまないように設定する方法、 もしくは別の方法で上記機能を満たすものがあれば教えていただきたいです。 よろしくお願い致します。

    • ベストアンサー
    • Java
  • テキストボックスとセレクトボックスの選択肢の連携

    この度はお世話になります。 1個のテキストボックスに入力された文字列により、その後の1個の セレクトメニューの選択肢を変更することってできるのでしょうか? 具体的には以下のような動作です。 ・デフォルトではテキストボックスに文字列が入力された場合は、  その後のセレクトボックスには「トマト、きゅうり、ほうれんそう」  の選択肢が入る。 ・テキストボックスに「あいうえお」と入力された時のみ、その後の  セレクトボックスが「りんご、みかん、ぶどう」の選択肢に変わる。 ・テキストボックスに「かきくけこ」と入力された時のみ、その後の  セレクトボックスに「あじ、さば、かつお」の選択肢に変わる。 こんな感じですが、よろしくお願い致します。 当方、只今javascriptを勉強しており、条件式に苦戦しております。 サンプルプログラムを見せていただけるとありがたく思います。

  • メニューバーから選択できる全てのメニュー項目の一覧表示

    ご存知の方、教えてください。 メニューバーから選択できる全てのメニュー項目を、一覧表示表示したいと思っています。 例えば、メニューバーには、「ファイル」「編集」という2つのメニューがあり、「ファイル」メニューのサブメニューには、  開く  閉じる  終了 というメニュー項目が、「編集」メニューのサブメニューには、  切り取り  コピー  貼り付け というメニュー項目があるとします。 そして、「メニューの一覧表示」というボタンをクリックしたら、上記のメニュー項目を、  開く      切り取り  閉じる     コピー  終了      貼り付け というように、サブメニュー毎に、表示列を分けて表示させたいと思っています。 GetSubMenu関数で、メニューバーから各々のサブメニューのハンドルを取得し、TrackPopupMenu関数で各々のサブメニューを同時に、かつ、重ならないよう位置をずらしながら表示させようとしましたが、うまくいきませんでした。 上記以外に、各々のサブメニューを、同時に表示させる方法はあるのでしょうか? それとも、各々のサブメニューは同時に表示させることはできないのでしょうか? 以上、申し訳ありませんが、ご返答くださいますよう、よろしくお願いいたします。

  • 「語句を選択」

    Gingerbread 「語句を選択」が使いにくくて困っています。特に、選択範囲の始点や終点を画面の右端や左端にしたいとき。 慣れればどうにかなるかなあと思っていたけど、ぜんぜん慣れません。 アプリを導入するとかして、「語句を選択」を使いやすくする方法はないでしょうか? たとえば、スライダーが半透明で標準の2倍くらいのサイズになると便利そう。 あと、「語句を選択」をしてからのコピーができないことがあって、、、 (例1)「ソフトバンクメール」で開いた受信メール。「全文コピー」はできるんですが、、、 (例2)「画面メモ」でHTML保存したページ。これは「全文コピー」もできない、、、 これはもう文字入力の問題じゃないから、「そういうもの」ってことであきらめるしかないんでしょうか? 他の方々は「語句を選択」に不自由していないのかなぁ?

  • 【ExcelVBA】空白ではないセルを選択する

    こちらで、Sheetをcsv出力する際、 空白のセルを区切る「,」が入ってしまう件を質問いたしました。 http://okwave.jp/qa/q8886514.html 計算結果が空白でも、そのセルは「文字数が0の文字列としてデータ」がある状態 という事は理解ができました。 そこで、A~C列の「文字数が0の文字列」ではないセルを選択して、 その範囲をSheet2にペースト、そのSheet2をcsvで保存すればよいと思いました。 この部分をマクロに組み込みたいのですが、 A~B列で「文字数が0の文字列」ではないセルを選択という指示をする部分がわかりません。 以下は、マクロの記録を使って作成しました。 Sub csv送信用() ' ' csv送信用 Macro ' ' Sheets("Sheet2").Select Selection.QueryTable.Delete Selection.ClearContents With ActiveSheet.QueryTables.Add(Connection:="TEXT;C:\Documents and Settings\***\My Documents\***.csv" _ , Destination:=Range("$A$1")) .Name = "***_2" .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .TextFilePromptOnRefresh = False .TextFilePlatform = 932 .TextFileStartRow = 1 .TextFileParseType = xlDelimited .TextFileTextQualifier = xlTextQualifierDoubleQuote .TextFileConsecutiveDelimiter = False .TextFileTabDelimiter = True .TextFileSemicolonDelimiter = False .TextFileCommaDelimiter = True .TextFileSpaceDelimiter = False .TextFileColumnDataTypes = Array(2, 2, 2, 2, 2, 2, 2, 2, 2) .TextFileTrailingMinusNumbers = True .Refresh BackgroundQuery:=False End With Sheets("Sheet1").Select Columns("A:C").Select Selection.Copy Sheets("csv_copy").Select ActiveSheet.Paste Application.DisplayAlerts = False ActiveWorkbook.SaveAs Filename:="C:\Documents and Settings\***\My Documents\csv_copy.csv", FileFormat:= _ xlCSV, CreateBackup:=False Application.DisplayAlerts = True Sheets("Sheet1").Select End Sub この Columns("A:C").Select Selection.Copy の、部分を「A~B列で「文字数が0の文字列」ではないセルを選択」してコピーにするとよいのだと思うのですが、 どのように書いたらよいでしょうか。 Excel2007です。 宜しくお願いいたします。

  • コンパイル時にエラーが出てしまいます・・・

    btn2.setEnabled(false); btn3.setEnabled(false); btn1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int t0 = 0; if (txt1.getText().length() == 4 ){ try{ String drv = "org.postgresql.Driver"; String url = "jdbc:postgresql:postgres"; String usr = "postgres"; Class.forName(drv); Connection cn = DriverManager.getConnection(url, usr); Statement st = cn.createStatement(); String qry1 = "SELECT * FROM getuji WHERE 年度 = '1984';"; ResultSet rs = st.executeQuery ( qry1 ); while(rs.next()){ t0 = rs.getInt("年度"); } st.close(); cn.close(); } catch(Exception f){f.printStackTrace();} } else{ btn3.setEnabled(true); } if (t0 != 0 ){ btn2.setEnabled(true); } else{ btn3.setEnabled(true); } } }); btn1を押すとDBへ問合せ、データが有る場合はbtn2が使えるようになり、データがない場合はbtn3が使えるようになる、という風にしたいのですが、コンパイル時に intは間接参照できません。 if (t0 != 0 ){ とエラーた出てしまいます。何がいけないのでしょうか? 以前、聞いたやり方でやったのですがうまくいきませんでした。 http://okwave.jp/qa4452155.html 同じ質問をするのは申し訳なく思うのですが、よろしくお願いします。

    • ベストアンサー
    • Java
  • 進捗バーが更新されません。

    プログレスバーの更新についてですが 下記のサンプルで動作させても プログレスバーの進捗状況が更新されなくて困っています。 タイマーなどを使用すれば更新されるようですが 各種状況に応じて自ら更新させたいのです。 以下のサンプルはどのように修正すれば 更新されるようになるでしょうか? 宜しくお願いします。 public class SampleProgressBar extends JFrame implements ActionListener { private static final long serialVersionUID = 1L; private JPanel jContentPane = null; JButton startButton; JButton stopButton; JProgressBar bar; JLabel label; int count; public void actionPerformed(ActionEvent arg0) { String cmd = arg0.getActionCommand(); if (cmd.equals("start")){ startButton.setEnabled(false); stopButton.setEnabled(true); for(int i=0, count=0; i<20000; i++ ) { label.setText(count + " count"); count++; bar.setValue(count); int per = (int)(bar.getPercentComplete() * 100); bar.setString(per + "% 完了"); try { Thread.sleep(1); } catch(Exception err) {} } }else if (cmd.equals("stop")){ startButton.setEnabled(true); stopButton.setEnabled(false); bar.setValue(0); int per = (int)(bar.getPercentComplete() * 100); bar.setString(per + "% 完了"); } } public static void main(String[] args) { SampleProgressBar frame = new SampleProgressBar(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 300, 200); frame.setTitle("Sample"); frame.setVisible(true); } public SampleProgressBar() { super(); initialize(); } private void initialize() { this.setSize(300, 200); this.setContentPane(getJContentPane()); this.setTitle("JFrame"); count = 0; label = new JLabel("Not Start"); JPanel labelPanel = new JPanel(); labelPanel.add(label); startButton = new JButton("start"); startButton.addActionListener(this); startButton.setActionCommand("start"); stopButton = new JButton("stop"); stopButton.addActionListener(this); stopButton.setActionCommand("stop"); stopButton.setEnabled(false); JPanel buttonPanel = new JPanel(); buttonPanel.add(startButton); buttonPanel.add(stopButton); bar = new JProgressBar(0, 20000); bar.setStringPainted(true); bar.setString(""); bar.setValue(0); JPanel barPanel = new JPanel(); barPanel.add(bar); getContentPane().add(labelPanel, BorderLayout.PAGE_START); getContentPane().add(buttonPanel, BorderLayout.PAGE_END); getContentPane().add(barPanel, BorderLayout.CENTER); } private JPanel getJContentPane() { if (jContentPane == null) { jContentPane = new JPanel(); jContentPane.setLayout(new BorderLayout()); } return jContentPane; } }

    • ベストアンサー
    • Java

専門家に質問してみよう