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

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

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

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

Q&A

解決済

1回答

1675閲覧

JAVA リストボックスの文字色の設定について

qwxpc243

総合スコア15

Java

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

0グッド

0クリップ

投稿2019/01/31 08:45

編集2019/02/01 00:04

JAVA

1public class TEST1 extends JFrame implements ListSelectionListener { 2 3 JList lst0; 4 5 public TEST1() throws Exception { 6 7 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 8 9 setSize(1300, 750); 10 setLayout(null); 11 12 // ボタンの設置 13 button_sakusei(); 14 15 // 画面作成 16 gamen_sakusei(); 17 18 // 空のリストボックスの作成 19 list_sakusei(); 20 21 // 表示する 22 setVisible(true); 23 24 } 25 26 27 //空のリストボックス作成 28 public void list_sakusei() { 29 30 lst0 = new JList(file_name2); 31 lst0.addListSelectionListener(this); 32 lst0.setCellRenderer(new StripedListCellRenderer()); 33 JScrollPane lst1 = new JScrollPane(lst0); 34 lst1.setBounds(240, 150, 470,400); 35 getContentPane().add(lst1); 36 setVisible(true); 37 38 } 39 40 41 public void valueChanged(ListSelectionEvent e) { 42 43 // 初期化 44 for(int i=0;i<5000;i++) { 45 new_flag[i]=0; 46 } 47 48 JList lst0 = (JList)e.getSource(); 49 50 if(lst0.getSelectedValue()!="") { 51 if(lst0.getSelectedValue()!=null) { 52 53 Object lst = lst0.getSelectedValue() ; 54 sentaku_str = lst.toString(); 55 56 //フォルダの一覧を抽出する 57 File file2 = new File(str_saki2); 58 if(!file2.isDirectory()) return; 59 File files[] = file2.listFiles(); 60 file_name = new String[files.length]; 61 for (int i=0; i<files.length; i++) { 62 file_name[i] = files[i].getName(); 63 File item = files[i]; 64 if(item.isDirectory()) { 65 folder[i] = item.getName(); 66 //System.out.println("folder[i]:" + folder[i]); 67 } 68 if (item.isFile()) { 69 name[i] = item.getName(); 70 } 71 } 72 //lst0.setListData(file_name); 73 74 75 for (int i=0; i<files.length; i++) { 76 // フォルダだったら下位フォルダを表示する 77 //ファイルだったら開く 78 } 79 80 //フォルダの一覧を抽出する 81 File file22 = new File(str_saki2); 82 if(!file22.isDirectory()) return; 83 File files23[] = file22.listFiles(); 84 file_name = new String[files23.length]; 85 for (int i=0; i<files23.length; i++) { 86 file_name[i] = files23[i].getName(); 87 File item = files23[i]; 88 if(item.isDirectory()) { 89 folder[i] = item.getName(); 90 //System.out.println("folder[i]:" + folder[i]); 91 } 92 if (item.isFile()) { 93 name[i] = item.getName(); 94 //System.out.println("name[i]:" + name[i]); 95 } 96 } 97 lst0.setListData(file_name); 98 99 try { 100 folder_new_check(); 101 } catch (Exception e2) { 102 e2.printStackTrace(); 103 } 104 } 105 } 106 lst0.clearSelection(); 107 lst0.getSelectionModel().setAnchorSelectionIndex(-1); 108 lst0.getSelectionModel().setLeadSelectionIndex(-1); 109 } 110 111 112 // 画面作成メソッド 113 public void gamen_sakusei() { 114 //背景色の設定 115} 116 117 118 119 // リストボックスのNEWファイルを赤で表示する 120 public class StripedListCellRenderer extends DefaultListCellRenderer { 121 public Component getListCellRendererComponent(JList list, Object value, 122 int index, boolean isSelected, boolean cellHasFocus) { 123 JLabel label = (JLabel) super.getListCellRendererComponent(list, value,index, isSelected, cellHasFocus); 124 if (new_flag[index] == 1) { 125 label.setForeground(Color.red); 126 } 127 return label; 128 } 129 } 130 131 132 public void folder_new_check() throws Exception { 133 134 //フォルダの一覧を抽出する 135 File file22 = new File(str_pass[1]); 136 File files23[] = file22.listFiles(); 137 file_name = new String[files23.length]; 138 for (int i=0; i<files23.length; i++) { 139 file_name[i] = files23[i].getName(); 140 File item = files23[i]; 141 if(item.isDirectory()) { 142 folder[i] = item.getName(); 143 //System.out.println("folder[i]:" + folder[i]); 144 } 145 if (item.isFile()) { 146 name[i] = item.getName(); 147 //System.out.println("name[i]:" + name[i]); 148 } 149 } 150 151 for(int i=0;i<new_cou[0];i++) { 152 file_name3[i] = new_file[i].substring(5); 153 String sarch2 = "\"; 154 int result = file_name3[i].indexOf(sarch2); 155 if (result != -1) { 156 kiridashi = file_name3[i].substring(0,result); 157 } 158 for(int j=0;j<files23.length; j++) { 159 if(folder[j].equals(kiridashi)) { 160 new_flag[j]=1; 161 } 162 } 163 } 164 } 165 166 // 初期化 167 public static void initialaize() { 168 } 169 170 171 public static void main(String[] args) throws Exception { 172 173 NEW_FILE_SEARCH.new_file_search(new_file,koushinbi,new_cou,cou_folde,cou_file,str_pass,folde_name_new,file_name_new); 174 new DMSZUMEN(); 175 } 176 177} 178 179 180 181public class NEW_FILE_SEARCH{ 182 183 184 public static void new_file_search(String new_file[],int koushinbi[],int new_cou[],int cou_folde[],int cou_file[],String str_pass[],String folde_name_new[][],String file_name_new[][]) throws Exception { 185 186 String format2; 187 String format3; 188 189 // 初期化 190 for(int i=1;i<=5;i++) { 191 cou_folde[i] = 0; 192 cou_file[i] = 0; 193 } 194 195 String strmoto = str_pass[2] + "\"; 196 197 198 // 1階層目チェック 199 File file_1 = new File(strmoto); 200 File files_1[] = file_1.listFiles(); 201 for (int i=0; i<files_1.length; i++) { 202 File item = files_1[i]; 203 // 階層のフォルダ名を取得 204 if(item.isDirectory()) { 205 folde_name_new[1][cou_folde[1]] = item.getName(); 206 //System.out.println("folde_name_new[1][cou_folde[1]]:" + folde_name_new[1][cou_folde[1]]); 207 cou_folde[1] = cou_folde[1] + 1; 208 } 209 // 階層のファイル名を取得 210 if (item.isFile()) { 211 file_name_new[1][cou_file[1]] = item.getName(); 212 cou_file[1] = cou_file[1] + 1; 213 } 214 } 215 216 217 // 2階層目以降チェック 218 for(int k=1;k<6;k++) { 219 for (int i = 0;i<cou_folde[k];i++) { 220 File file_2 = new File(strmoto + folde_name_new[k][i]); 221 File files_2[] = file_2.listFiles(); 222 for (int j=0; j<files_2.length; j++) { 223 File item = files_2[j]; 224 // 階層のフォルダ名を取得 225 if(item.isDirectory()) { 226 folde_name_new[k+1][cou_folde[k+1]] = folde_name_new[k][i] + "\" + item.getName(); 227 //System.out.println("folde_name_new[k+1][cou_folde[k+1]]:" + folde_name_new[k+1][cou_folde[k+1]]); 228 cou_folde[k+1] = cou_folde[k+1] + 1; 229 } 230 // 階層のファイル名を取得 231 if (item.isFile()) { 232 file_name_new[k+1][cou_file[k+1]] = folde_name_new[k][i] + "\" + item.getName(); 233 //System.out.println("file_name_new[k+1][cou_file[k+1]]:" + file_name_new[k+1][cou_file[k+1]]); 234 cou_file[k+1] = cou_file[k+1] + 1; 235 } 236 } 237 } 238 } // 2階層目以降チェック終わり 239 240 new_cou[0] = 0; 241 242 for(int i=2;i<6;i++) { 243 for(int j=0;j<cou_file[i];j++) { 244 File file200 = new File(strmoto + file_name_new[i][j]); 245 long lastModified = file200.lastModified(); 246 Date date = new Date(lastModified); 247 SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); 248 format2 = sdf.format(date.getTime()); 249 Calendar calendar = Calendar.getInstance(); 250 calendar.setTime(date); 251 calendar.add(Calendar.DAY_OF_MONTH, +koushinbi[0]);// 直近1ヶ月 252 //calendar.add(Calendar.MONTH, +koushinbi[0]);// 直近1ヶ月 253 Date d1 = calendar.getTime(); 254 Date date2 = new Date(); 255 SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy/MM/dd"); 256 format3 = sdf2.format(date2.getTime()); 257 Calendar calendar2 = Calendar.getInstance(); 258 calendar2.setTime(date2); 259 if(d1.compareTo(date2) == -1){ 260 }else { 261 new_file[new_cou[0]] = file_name_new[i][j]; 262 new_cou[0] = new_cou[0] + 1; 263 } 264 } 265 } 266 }ファイルの最終更新日確認処理 267 268} 269 270 271 272```![イメージ説明](c689c5b6a6d23aad7f9258c5c5cee590.jpeg) 273 274社内のサーバーのファイルを閲覧し、リストボックスに表示するようにしました。 275ファイルの更新日が直近30日以内のフォルダ/ファイルはリストボックスで赤字になるように設定しましたが、 276「テスト2」フォルダが黒字になってしまいます。(テスト2はテストをそのままコピーしてます。) 277文字数制限があるため、一部消去&他classのコードは入れておりませんが、今回の件とは関係ないと思います。 278 279リストボックス上でクリックしたままだと赤字ですが、クリックを離すと黒字になるため、indexが上手く 280操作出来ていないと思いますが、どのように修正すればよいか分かりません。 281 282宜しくお願い致します。 283 284 285```JAVAコード

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

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

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

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

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

azuapricot

2019/01/31 08:50

マークダウンがきちんと適用されていません もう一度 <code>を押して、Javaコードではなく Javaと直して コードを貼りつけなおしてください。
qwxpc243

2019/02/01 00:04

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

2019/02/01 00:26

いやコードないけど...
jimbe

2019/02/01 09:12

大分コードが煩雑になっています. ぱっと見て「フォルダの一覧を抽出する」というコメントが3つもあります. 修正をする前にコードの整理をされたほうが良いように思います. 「そんなことより修正しないと…」と思われるかもしれませんが, このコードでは, どこに副作用が出るかもしれない状態です. 処理毎にメソッドを分け, 名前を適切に付けて頂きたいです. 変数名に番号が入っている時は, 変数名の付け方・スコープ(変数の使える範囲)が間違っているという客観的な印となります. テキトウにコードを書いていると, ここでは使えません的なことがあり, それが面倒だからとプログラム全体で見えるスコープにしてしまったりします. すると, 同じような機能が必要だけどもコピペすると既にあると言われるので, 名前に番号を付けてしまうようになります. また, ご質問のようにコードを提示する場合に, サイズ的な問題で一部だけの提示となってしまった場合に, 各変数が見えない所で変更されている可能性が捨てられず, 結局全部を見ないと分からないことになります. for(int i=0;i<5000;i++) { new_flag[i]=0; } というコードがありますが, この 5000 という数字は int new_flag[5000]; という宣言をしている所からと思います. ですが, この new_flag 配列は使われ方を見る限りフォルダ下のファイル/フォルダ数だけ必要なものであり, 一般にフォルダ下にファイル/フォルダ数が幾つあるのかは決まっておりません. file_name = new String[files23.length]; と同様, このような性質の変数は, 大きさが分かった時点で作成するようにしてください.
guest

回答1

0

ベストアンサー

ご提示されたコードだけでは実行には解読と修正がそれなりに必要な為, ご質問と画面から推測した機能のプログラムを書きました.
コンソールから実行する場合は, パラメータとしてHOMEとなるフォルダを指定してください.
パラメータ無しで実行すると, 内部で定義している DEFAULT_HOME_PATH = "T:"(私の環境でのテンポラリ) が指定されたものとして動きますので, 必要に応じて DEFAULT_HOME_PATH を変えてください.

日付のチェックは getListCellRendererComponent 内で fileItem.lastModified.after(condition) として行っています.

java

1lastModified = Calendar.getInstance(); 2lastModified.setTimeInMillis(file.lastModified());

としてファイルの lastModified から作った Calendar と, FolderFrame のコンストラクタで

java

1Calendar conditions = Calendar.getInstance(); 2conditions.add(Calendar.DATE, -30);

として現在日時から 30日を引いた Calendar を比較しています.
このように表示の度にチェックしている為, フラグ等は要らなくなっています.

表示する名前やフラグ等を全て配列に準備して, 後は表示だけを行う形のほうが速いとお考えかも知れませんが, 速さはメモリの使用量とほぼトレードオフです. 巨大な配列等は好ましくないと思います.
また, 全ての動作が記述できていない状態で速度を考えるのは, 最近の開発ではしないほうが良いという認識が広まっていると思います.
機能が整い, コードを整理し, 後は性能の問題だけとなってから, 何処が遅いのかを計測して修正していく形です.
まぁ, これは理想論であって, 実際は時間や人員等の関係でそうも言っていられないとなってしまいますが.
逸れました.

ご提示のコードの中で問題視される new_flag の設定は, folder_new_check メソッドの二重 for ループの奥底で行われており, 一方日付の比較は NEW_FILE_SEARCH クラスの new_file_search メソッドの最期のほうの '直近1ヶ月' というコメントの辺りと思われますが...この二つのメソッドがどう関係しているのか, 省略されてコンパイルも大変なコードでは追いきれません.
下のコードでしたらご説明出来ますので, どこか意味が分からない箇所がありましたらコメントにてご質問ください.

java

1import java.awt.BorderLayout; 2import java.awt.Color; 3import java.awt.Component; 4import java.awt.event.ActionEvent; 5import java.awt.event.ActionListener; 6import java.io.File; 7import java.text.SimpleDateFormat; 8import java.util.Calendar; 9import java.util.Date; 10 11import javax.swing.Box; 12import javax.swing.BoxLayout; 13import javax.swing.DefaultListCellRenderer; 14import javax.swing.DefaultListModel; 15import javax.swing.JButton; 16import javax.swing.JFrame; 17import javax.swing.JLabel; 18import javax.swing.JList; 19import javax.swing.JPanel; 20import javax.swing.JScrollPane; 21import javax.swing.JTextField; 22import javax.swing.ListSelectionModel; 23import javax.swing.event.ListSelectionEvent; 24import javax.swing.event.ListSelectionListener; 25 26public class FolderFrame extends JFrame { 27 28 private static final String DEFAULT_HOME_PATH = "T:\"; 29 30 public static void main(String[] args) { 31 File homeFolder = null; 32 if(args.length == 0) { 33 homeFolder = new File(DEFAULT_HOME_PATH); 34 } else if(args.length == 1) { 35 homeFolder = new File(args[0]); 36 if(!homeFolder.isDirectory()) { 37 System.out.println("'"+args[0]+"' はフォルダではありません"); 38 printUsage(); 39 System.exit(2); 40 } 41 } else { 42 printUsage(); 43 System.exit(1); 44 } 45 46 JFrame folderFrame = new FolderFrame(homeFolder); 47 folderFrame.setSize(500, 500); 48 folderFrame.setLocationRelativeTo(null);//画面の真ん中 49 folderFrame.setVisible(true); 50 } 51 52 private static void printUsage() { 53 System.out.println("Usage: java FolderView [HomeFolderPath]"); 54 System.out.println(" HomeFolderPath default '"+DEFAULT_HOME_PATH+"'"); 55 } 56 57 FolderFrame(File homeFolder) { 58 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 59 60 fileListModel = new DefaultListModel<FileItem>(); 61 62 //現在時刻から30日以内のファイル/フォルダを赤文字で表示するレンダラ 63 Calendar conditions = Calendar.getInstance(); 64 conditions.add(Calendar.DATE, -30); 65 DefaultListCellRenderer listCellRenderer = new StripedListCellRenderer(conditions, Color.RED); 66 67 JList<FileItem> fileListView = new JList<FileItem>(fileListModel); 68 fileListView.setPrototypeCellValue(new FileItem(new File("----+----1----+----2----+----3----+----4"))); 69 fileListView.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 70 fileListView.setCellRenderer(listCellRenderer); 71 fileListView.addListSelectionListener(new ListSelectionListener() { 72 @Override 73 public void valueChanged(ListSelectionEvent e) { 74 if(e.getFirstIndex() != fileListView.getSelectedIndex()) return;//解除通知は無視 75 FileItem selectedFileItem = fileListView.getSelectedValue(); 76 if(selectedFileItem.isDirectory()) {//フォルダなら 77 fileListView.clearSelection(); 78 fileListView.ensureIndexIsVisible(0);//先頭を表示する位置に移動 79 setFolder(selectedFileItem.file); 80 } else { //ファイルなら 81 //表示(略) 82 } 83 } 84 }); 85 86 add(createBreadcrumbsPane(), BorderLayout.NORTH); 87 add(new JScrollPane(fileListView), BorderLayout.CENTER); 88 add(createButtonsPane(homeFolder), BorderLayout.SOUTH); 89 90 setFolder(homeFolder); 91 } 92 93 private Component createBreadcrumbsPane() { 94 currentFolderView = new JTextField(30);//テキトウに30文字分 95 currentFolderView.setEditable(false); 96 return currentFolderView; 97 } 98 99 private Component createButtonsPane(File homeFolder) { 100 JButton toHomeButton = new JButton("HOME"); 101 toHomeButton.addActionListener(new ActionListener() { 102 @Override 103 public void actionPerformed(ActionEvent e) { 104 setFolder(homeFolder); 105 } 106 }); 107 108 toParentButton = new JButton("戻る"); 109 toParentButton.addActionListener(new ActionListener() { 110 @Override 111 public void actionPerformed(ActionEvent e) { 112 File file = new File(currentFolderView.getText()); 113 setFolder(file.getParentFile()); 114 } 115 }); 116 117 //BoxLayout で右寄せ 118 JPanel panel = new JPanel(null); 119 panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); 120 panel.add(Box.createGlue()); 121 panel.add(toHomeButton); 122 panel.add(toParentButton); 123 124 return panel; 125 } 126 127 private DefaultListModel<FileItem> fileListModel; 128 private JTextField currentFolderView; 129 private JButton toParentButton; 130 131 private void setFolder(File folder) { 132 if(folder.listFiles() == null) return; //システム系の,中身を見せてもらえないフォルダ? 133 currentFolderView.setText(folder.getAbsolutePath()); 134 fileListModel.removeAllElements(); 135 for(File file : folder.listFiles()) fileListModel.addElement(new FileItem(file));//フォルダ下のファイル/フォルダを収集 136 toParentButton.setEnabled(folder.getParentFile() != null); 137 } 138 139 //JListのアイテム(データ) 140 private class FileItem { 141 final File file; 142 final Calendar lastModified; 143 FileItem(File file) { 144 this.file = file; 145 lastModified = Calendar.getInstance(); 146 lastModified.setTimeInMillis(file.lastModified()); 147 } 148 boolean isDirectory() { return file.isDirectory(); } 149 @Override 150 public String toString() { 151 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd"); 152 String iconDummy = (isDirectory() ? "■" : " "); 153 return iconDummy + " "+ file.getName() + " (" + dateFormat.format(new Date(file.lastModified())) + ")"; 154 } 155 } 156 157 //JListのレンダラ 158 public class StripedListCellRenderer extends DefaultListCellRenderer { 159 private Calendar condition; 160 private Color foreground; 161 StripedListCellRenderer(Calendar condition, Color foreground) { 162 setCondition(condition, foreground); 163 } 164 public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 165 JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 166 FileItem fileItem = (FileItem)value; 167 if(condition != null && fileItem.lastModified.after(condition)) { //更新日チェック 168 label.setForeground(foreground); 169 } 170 return label; 171 } 172 /** 173 * 指定した conditions 以降の更新日付のファイル/フォルダーは文字色を foreground にする 174 * @param conditions 175 * @param foreground 176 */ 177 void setCondition(Calendar condition, Color foreground) { 178 if(condition == null || foreground == null) throw new NullPointerException(); 179 this.condition = condition; 180 this.foreground = foreground; 181 } 182 } 183}

投稿2019/02/01 15:16

編集2019/02/01 15:35
jimbe

総合スコア12616

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

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

qwxpc243

2019/02/05 02:45

jimbeさん 作成していただいたコードを参考にして解決出来ました。 (最初にご指摘頂いたとおりフラグの設定の仕方が悪かったです。) 本当に助かりました。 ありがとうございました。
jimbe

2019/02/05 04:14

全く違うコードとなってしまって, 逆に参考にするにも大変だったと思います. すみませんでした.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問