質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

1035閲覧

Java リストボックスをクリックしても認識出来ない

qwxpc243

総合スコア15

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/01/28 00:54

編集2019/01/30 23:36
import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JScrollPane; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; public class TEST1 extends JFrame implements ListSelectionListener { static String[] file_name; String[] file_name2 = new String[200]; String[] folder = new String[200]; String[] name = new String[200]; static String url1; String url2; public TEST1() { url1 = "C:\Users\表示テスト\"; setSize(1300, 750); setLayout(null); button1(); list_sakusei(); } //空のリストボックス作成 public void list_sakusei() { JList lst0 = new JList(file_name2); lst0.addListSelectionListener(this); JScrollPane lst1 = new JScrollPane(lst0); lst1.setBounds(240, 150, 470,400); getContentPane().add(lst1); setVisible(true); } public void button1() { JButton button1 = new JButton("ボタン1"); button1.setFont(new Font("Gothic", Font.PLAIN, 13)); button1.setBounds(80,150,150,30); add(button1); button1.addActionListener(new button1()); } public void valueChanged(ListSelectionEvent e) { JList lst1 = (JList)e.getSource(); url2 = url1+lst1.getSelectedValue(); //aフォルダの一覧を抽出する File file2 = new File(url2); if(!file2.isDirectory()) return; File files[] = file2.listFiles(); file_name = new String[files.length]; for (int i=0; i<files.length; i++) { file_name[i] = files[i].getName(); File item = files[i]; if(item.isDirectory()) { folder[i] = item.getName(); } if (item.isFile()) { name[i] = item.getName(); } } lst1.setListData(file_name); } public class button1 implements ActionListener{ public void actionPerformed(ActionEvent e){ File file2 = new File(url1); if(!file2.isDirectory()) return; File files[] = file2.listFiles(); file_name = new String[files.length]; for (int i=0; i<files.length; i++) { file_name[i] = files[i].getName(); } JList lst0 = new JList(file_name); JScrollPane lst1 = new JScrollPane(lst0); lst1.setBounds(240, 150, 470,400); add(lst1); setVisible(true); } } public static void main(String[] args) { new TEST1(); } } ```[リンク内容](https://teratail.com/questions/169859) JAVAを勉強中です。 社内のサーバーのフォルダにあるファイルをリストボックスで表示して、必要に応じてファイルを開く仕様です。 先日こちらでリストボックスがつまってしまうという事象を解決して頂きました。ありがとうございました。その後ボタンを設置してリンク先を指定するように変更したのですが、リストボックスをクリックしても認識?出来ておりません。 どのように修正すれば良いでしょうか? 宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

azuapricot

2019/01/28 01:05

コードはマークダウン<code>を使用して提示してください
m.ts10806

2019/01/28 01:20

質問は編集できます。 タイトルは質問内容に寄せて具体的な要件にしてください。1とか2とかシリーズものにしても必ず横展開で見るとは限らないし内容が伝わりづらいです。 リンク文言はデフォルトの「リンク内容」のままではなく先のタイトルや何か分かるような文章にすべきですね。
azuapricot

2019/01/29 01:36

<code>って<code>をつけろって意味じゃなくてですね・・・・?笑 編集画面にありませんか?<code>ってボタン。 それを押すとコードを入力する用の枠が出てくるはずです。 そこに書いてほしいと言っているのですが・・・。 マークダウン<code>を使用して~と書いて伝わらなかったのは初めてなのでびっくりしました()
azuapricot

2019/01/29 01:37

今度から編集画面のマークダウンボタン(<code>ってやつです)を押して、その出てくる枠の中に改めてコードを入れなおしてくださいと書くようにしますね( ) 言葉足らずですみませんでした
qwxpc243

2019/01/30 23:34

すみません。 修正しました。 宜しくお願い致します。
guest

回答1

0

ベストアンサー

リストのクリックに反応しない原因は, button1 という JButton を押した時に呼ばれる button1 という ActionListener の actionPerformed メソッド内で, 再作成している JList に, addListSelectionListener(this) をしていない為です.

ただし, actionPerformed メソッドで JList 他を再作成する必要はありません. 変わるのは JList の中身だけでしょうから(valueChanged メソッドと同じように) setListData() するだけです.

そして, 変数名クラス名メソッド名の命名を考えてくださいますか.
最初の文でわざわざ書きましたが, button1 というクラスと, button1 というメソッドと, button1 という変数があって, ぱっと見て意味が分かり難いです.

変数は JButton 型なので多少仕方ない部分はありますが, スコープ的に他にボタンは無いので, 逆に button だけでも良いです. 出来れば何のボタンなのか, テキストも"ボタン1"では無く, "初期フォルダに戻る" だとか動作が分かるものにして, それなら変数名も initialFolderButton とすると良いと思います.

メソッドはボタンを作っています. 折角一つ上のメソッドが list_sakusei と明確な名前ですので, こちらも button_sakusei とすると, TEST1 のコンストラクタで

button_sakusei(); list_sakusei();

と並んで, 分かりやすかったと思います.

クラスは, これは button1 を表すクラスではありませんね? button1 は JButton クラスでしたから. これは button1 のアクションリスナーです. ですからクラス名も Button1ActionListener もしくは先の button1 の変数名(の変更)から InitialFolderButtonActionListener と(長いですけど)名前をつけると, これが何なのかが明白になります.
なお, クラス名は各単語の最初を大文字にするというのが Java の命名規則の基本にあります.

投稿2019/01/28 04:01

編集2019/01/29 01:45
jimbe

総合スコア12632

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qwxpc243

2019/01/28 23:27

度々のご回答ありがとうございます。 「addListSelectionListener(this)」を追加しようとすると下記エラーとなってしまいます。 型 JList のメソッド addListSelectionListener(ListSelectionListener) は引数 (TEST1.button) に適用できません どのように追加すれば良いでしょうか? 又、変数等の名前の付け方は改善します。クラス名の最初を大文字はすっかり忘れておりました。 修正したいと思います。ご指摘ありがとうございます。
jimbe

2019/01/29 02:08

あぁ, そうでした. 該当箇所は button1 クラスの中でした. 失礼しました. この場合は lst0.addListSelectionListener(TEST1.this); とする必要があります. が... 出来れば >ただし, actionPerformed メソッドで JList 他を再作成する必要はありません. 変わるのは JList の中身>だけでしょうから(valueChanged メソッドと同じように) setListData() するだけです. の修正をして頂いたほうが良いかと思います. 上記一行でおそらく見た目動作すると思いますが, ボタンを押す毎に JList/JScrollPane/JButton 等を幾つも作ったままになりますので, メモリリーク等が起きている可能性があります. まず, 最初のほうのコンストラクタの前の変数宣言部分に JList 型変数の宣言を追加します. String url2; JList lst0; //追加: 変数名は元のコードから使っています public TEST1() { 次に, リストボックスを作成している所で, 作成したリストボックスを, 追加した変数の方に入れるように修正します. //空のリストボックス作成 public void list_sakusei() { lst0 = new JList(file_name2); //修正: 先頭に付いていた 'JList' を削除すると, 追加した変数の方に入ります. もしこの変数名を変えていた場合は, 上の変数の宣言の名前も変えてください. lst0.addListSelectionListener(this); そして, actionPerformed メソッド内の JList 等を再作成している JList lst0 = new JList(file_name); JScrollPane lst1 = new JScrollPane(lst0); lst1.setBounds(240, 150, 470,400); add(lst1); setVisible(true); の5行を lst0.setListData(file_name); //この変数名 lst0 も, リストボックス作成での JList の変数名を変えていた場合は(以下略) の1行としてください.
qwxpc243

2019/01/30 23:30

jimbeさん ご回答ありがとうございます。上手く表示することが出来ました。 もう1点質問があります。 ファイルの最終更新日が30日以内のフォルダ及びファイルはリストボックス上、赤字で表示するようにしました。 //リストボックスのNEWファイルを赤で表示する public class StripedListCellRenderer extends DefaultListCellRenderer { public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { JLabel label = (JLabel) super.getListCellRendererComponent(list, value,index, isSelected, cellHasFocus); if (new_flag[index] == 1) { label.setForeground(Color.red); } return label; } } フォルダ配下のファイルを全検索して、30日以内であればnew_flag[]という配列に1を入れていきます。 リストボックスのindexと一致した場合、赤字にしているのですが、本来赤字で表示されるべき「下位階層」が黒字になってしまいます。(添付画像参照) ※クリックして離した分がindexとして認識されていると思います。 どのように修正すれば良いでしょうか? 度々で申し訳ございませんが、宜しくお願い致します。
jimbe

2019/01/31 04:15

やろうとされていることはイメージ出来ますが, 元のご質問のコードには new_flag[] はありませんので, 本当にファイル/フォルダの該当new_flagが1になっているのか(なるようにコードされているのか)が, まず心配です. その辺り, 表示してみる等でご確認されましたでしょうか. また, 新たなご質問は, 元のご質問とは大分異なりますので, この回答-コメント欄で続けるのは不適当かと思います. 最新のコードと画像?を使って新たなご質問をされたほうが, 他の方が検索される際にも分かりやすくて良いかと思います.
qwxpc243

2019/01/31 08:06

分かりました。 新たに質問を入れたいと思います。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問