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

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

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

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

Java

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

1回答

1023閲覧

JListの内容を更新したい

0sksksk

総合スコア17

FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

Java

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

1グッド

0クリップ

投稿2020/06/01 04:25

作成しているもの

 Javaで簡易FTPソフトを作成しています。FFFTPのような画面設計にし、画面左側に自分のPCディレクトリを、右側にFTPサーバーのファイルディレクトリをそれぞれJList表示し、ファイルを選択した状態で画面中央の送信(受信)ボタンを押すという簡単な仕組みです。

問題

現在JListにファイル検索機能を使用し、ダイアログで選択されたディレクトリ下のファイル名を、一覧表示する機能を作っています。コンソール上では選択されたディレクトリ下のファイル名は取得できているのですが、JListを更新することができません。何が原因なのでしょうか。
よろしくお願い致します。

import

1import java.awt.Font; 2import java.awt.event.ActionEvent; 3import java.awt.event.ActionListener; 4import java.io.File; 5 6import javax.swing.JButton; 7import javax.swing.JFileChooser; 8import javax.swing.JFrame; 9import javax.swing.JLabel; 10import javax.swing.JList; 11import javax.swing.JPanel; 12import javax.swing.JScrollPane; 13import javax.swing.JTable; 14 15class myftp extends JFrame{ 16 JButton Upload_Button, Download_Button, File_Search_Button; 17 JLabel Label1, Label2, Label3; 18 JList<String> PC_File_List; 19 JTable Pc_File_Table, FTP_File_Table; 20 JPanel Panel1; 21 JFileChooser filechooser = new JFileChooser("C:"); 22 JScrollPane ScrollPane; 23 24 25 26 public static void main(String args[]){ 27 myftp frame = new myftp("test"); 28 frame.setVisible(true); 29 frame.setTitle("MyFTP"); 30 frame.setSize(1000, 600); 31 frame.setLocationRelativeTo(null); 32 frame.setResizable(false); 33 frame.setVisible(true); 34 frame.setLayout(null); 35 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 36 37 } 38 39 myftp(String title){ 40 41 JPanel p = new JPanel(); 42 p.setLayout(null); 43 44 45 // 送信ボタン 46 Upload_Button = new JButton("送信→"); 47 Upload_Button.setBounds(425, 85, 140, 100); 48 Upload_Button.setFont(new Font("メイリオ", Font.BOLD, 32)); 49 Upload_Button.setForeground(new java.awt.Color(89, 89, 89)); 50 51 52 // 受信ボタン 53 Download_Button = new JButton("←受信"); 54 Download_Button.setBounds(425, 250, 140, 100); 55 Download_Button.setFont(new Font("メイリオ", Font.BOLD, 32)); 56 Download_Button.setForeground(new java.awt.Color(89, 89, 89)); 57 58 59 // ファイル選択ボタン 60 File_Search_Button = new JButton("ファイルを選択"); 61 File_Search_Button.setBounds(285, 40, 120, 35); 62 File_Search_Button.setFont(new Font("メイリオ", Font.BOLD, 12)); 63 File_Search_Button.setForeground(new java.awt.Color(89, 89,89)); 64 65 66 // 選択ボタンを押したとき 67 File_Search_Button.addActionListener(new ActionListener(){ 68 public void actionPerformed(ActionEvent e){ 69 PC_File_Show_Button(); 70 } 71 }); 72 73 74 PC_BaseList(); 75 FTP_BaseList(); 76 add(Upload_Button); 77 add(Download_Button); 78 add(File_Search_Button); 79 80 81 82 83 getContentPane().add(p, BorderLayout.CENTER); 84 85 // Container contentPane = getContentPane(); 86 // contentPane.add(p, BorderLayout.CENTER); 87 88 } 89 90 public void PC_BaseList(){ 91 String directory = ("C:"); 92 93 // Fileクラスをインスタンス化 94 File file = new File(directory); 95 96 // 選択ディレクトリ下のファイルを表示 97 String File_Directory[] = file.list(); 98 99 PC_File_List = new JList<String>(File_Directory); 100 101 ScrollPane = new JScrollPane(); 102 ScrollPane.getViewport().setView(PC_File_List); 103 ScrollPane.setBounds(10,85,395,265); 104 add(ScrollPane); 105 } 106 107 public void FTP_BaseList(){ 108 String directory = ("C:"); 109 110 // Fileクラスをインスタンス化 111 File file = new File(directory); 112 113 // 選択ディレクトリ下のファイルを表示 114 String File_Directory[] = file.list(); 115 116 PC_File_List = new JList<String>(File_Directory); 117 118 ScrollPane = new JScrollPane(); 119 ScrollPane.getViewport().setView(PC_File_List); 120 ScrollPane.setBounds(585,85,395,265); 121 add(ScrollPane); 122 } 123 124 125 public void PC_File_Show_Button(){ 126 Label1 = new JLabel(); 127 128 filechooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 129 filechooser.setMultiSelectionEnabled(true); 130 131 132 int selected = filechooser.showOpenDialog(File_Search_Button); 133 if (selected == JFileChooser.APPROVE_OPTION){ 134 135 // 選択されたディレクトリを格納 136 String directory = String.valueOf(filechooser.getSelectedFile()); 137 138 // Fileクラスをインスタンス化 139 File file = new File(directory); 140 141 // 選択ディレクトリ下のファイルを表示 142 String File_Directory[] = file.list(); 143 144 PC_File_List = new JList<String>(File_Directory); 145 146 147 ScrollPane = new JScrollPane(); 148 ScrollPane.getViewport().setView(PC_File_List); 149 ScrollPane.setBounds(50,50,200,200); 150 add(ScrollPane); 151 152 for(String ShowFiles: File_Directory){ 153 System.out.println(ShowFiles); 154 } 155 156 }else if (selected == JFileChooser.CANCEL_OPTION){ 157 Label1.setText("キャンセルされました"); 158 }else if (selected == JFileChooser.ERROR_OPTION){ 159 Label1.setText("エラー又は取消しがありました"); 160 } 161 } 162 163}
TN8001👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

今は「ファイルを選択(フォルダの選択ですよね?)」のたびにJListがどんどん増えていきます。これはいけません。
DefaultListModelを作成し、それを操作するとJListも自動的に更新されます(詳細は調べてください^^;

ほか気になった点を勝手に変えさせていただきました。

  • できる限りfinalをつける
  • 後から参照することがないものはローカル変数にする
  • フルパスはどうせ必要になるので、JList<String>からJList<File>に(ついでにアイコン表示)
  • 命名やケース(大文字小文字)

Java

1import java.awt.Component; 2import java.awt.Font; 3import java.io.File; 4import java.util.List; 5import javax.swing.DefaultListCellRenderer; 6import javax.swing.DefaultListModel; 7import javax.swing.JButton; 8import javax.swing.JFileChooser; 9import javax.swing.JFrame; 10import javax.swing.JLabel; 11import javax.swing.JList; 12import javax.swing.JScrollPane; 13import javax.swing.filechooser.FileSystemView; 14 15class MyFtp extends JFrame { 16 private final JLabel messageLabel = new JLabel(); 17 private final JFileChooser fileChooser = new JFileChooser("C:"); 18 private final DefaultListModel<File> pcFileListModel = new DefaultListModel<>(); 19 private final DefaultListModel<File> ftpFileListModel = new DefaultListModel<>(); 20 private final JList<File> pcFileList = new JList<>(); 21 private final JList<File> ftpFileList = new JList<>(); 22 23 public static void main(String[] args) { 24 MyFtp frame = new MyFtp("MyFTP"); 25 frame.setVisible(true); 26 } 27 28 private MyFtp(String title) { 29 super(title); 30 setSize(1000, 600); 31 setLocationRelativeTo(null); 32 setResizable(false); 33 setLayout(null); 34 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 35 36 37 JButton upload = new JButton("送信→"); 38 upload.setBounds(425, 85, 140, 100); 39 upload.setFont(new Font("メイリオ", Font.BOLD, 32)); 40 upload.setForeground(new java.awt.Color(89, 89, 89)); 41 // 暫定的に選択ファイルをprintln 42 upload.addActionListener(e -> { 43 List<File> selectedFiles = pcFileList.getSelectedValuesList(); 44 System.out.println("送信"); 45 for (File f : selectedFiles) { 46 System.out.println(f); 47 } 48 }); 49 add(upload); 50 51 JButton download = new JButton("←受信"); 52 download.setBounds(425, 250, 140, 100); 53 download.setFont(new Font("メイリオ", Font.BOLD, 32)); 54 download.setForeground(new java.awt.Color(89, 89, 89)); 55 download.addActionListener(e -> { 56 List<File> selectedFiles = ftpFileList.getSelectedValuesList(); 57 System.out.println("受信"); 58 for (File f : selectedFiles) { 59 System.out.println(f); 60 } 61 }); 62 add(download); 63 64 JButton folder = new JButton("フォルダを選択"); 65 folder.setBounds(285, 40, 120, 35); 66 folder.setFont(new Font("メイリオ", Font.BOLD, 12)); 67 folder.setForeground(new java.awt.Color(89, 89, 89)); 68 folder.addActionListener(e -> selectFolder()); 69 add(folder); 70 71 messageLabel.setBounds(10, 520, 120, 35); 72 add(messageLabel); 73 74 pcFileListInit(); 75 ftpFileListInit(); 76 77 fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 78 } 79 80 private void pcFileListInit() { 81 File file = new File("C:\"); 82 setFiles(file, pcFileListModel); 83 pcFileList.setModel(pcFileListModel); // ListModelをJListにセット 以降ListModelの操作が自動反映 84 pcFileList.setCellRenderer(new FileListCellRenderer()); // 行の表示カスタマイズ Fileをアイコン付きで表示 85 JScrollPane pane = new JScrollPane(); 86 pane.getViewport().setView(pcFileList); 87 pane.setBounds(10, 85, 395, 265); 88 add(pane); 89 } 90 91 private void ftpFileListInit() { 92 File file = new File("C:\"); 93 setFiles(file, ftpFileListModel); 94 ftpFileList.setModel(ftpFileListModel); 95 ftpFileList.setCellRenderer(new FileListCellRenderer()); 96 JScrollPane pane = new JScrollPane(); 97 pane.getViewport().setView(ftpFileList); 98 pane.setBounds(585, 85, 395, 265); 99 add(pane); 100 } 101 102 private void setFiles(File file, DefaultListModel<File> listModel) { 103 listModel.removeAllElements(); // 全クリア 104 File[] files = file.listFiles(); 105 if (files == null) return; 106 107 for (File f : files) { 108 if (f.isDirectory()) listModel.addElement(f); // フォルダを追加 109 } 110 for (File f : files) { 111 if (f.isFile()) listModel.addElement(f); // ファイルを追加 112 } 113 } 114 115 private void selectFolder() { 116 int selected = fileChooser.showOpenDialog(this); 117 118 if (selected == JFileChooser.APPROVE_OPTION) { 119 File file = fileChooser.getSelectedFile(); 120 setFiles(file, pcFileListModel); 121 } else if (selected == JFileChooser.CANCEL_OPTION) { 122 messageLabel.setText("キャンセルされました"); 123 } else if (selected == JFileChooser.ERROR_OPTION) { 124 messageLabel.setText("エラー又は取消しがありました"); 125 } 126 } 127 128 // https://w.atwiki.jp/chapati4it/pages/72.html 129 private static class FileListCellRenderer extends DefaultListCellRenderer { 130 private final FileSystemView fs = FileSystemView.getFileSystemView(); 131 132 public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 133 super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 134 135 if (value instanceof File) { 136 File f = (File) value; 137 setText(fs.getSystemDisplayName(f)); 138 setIcon(fs.getSystemIcon(f)); 139 } 140 return this; 141 } 142 } 143}

投稿2020/06/01 11:30

TN8001

総合スコア9862

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

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

0sksksk

2020/06/03 05:58 編集

とてもわかりやすい回答ありがとうございます。 プログラミングにあまり慣れておらず、その都度思いつきで変数などを作ってしまう自分の癖を反省します。 ファイルのアイコンに関しては自分でも見えるようにしたいと思っていながらもどうしていいのかわからず、諦めてしまっていました。本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問