- ベストアンサー
開いたファイルをJListに追加したい
最近、Swingを勉強し始めたばかりです。 開くボタンを作りファイルチューザでcsvファイルを開き、1行ずつ引っ張り出してきて全データをJListに表示したいのですがうんともすんともいいません。 知恵をお貸しくださいお願いします(T_T) 鈴木一郎,東京都,渋谷110,1960 松井一郎,大阪府,大阪市119,1928 class SwingTest extends JFrame implements ActionListener{ private static JFrame frame; private JFileChooser chooser = new JFileChooser(); private Container pane = getContentPane(); private DefaultListModel myList = new DefaultListModel(); 略 public void actionPerformed(ActionEvent e){ String s = e.getActionCommand(); if(s.equals("Open")==true){ JFileChooser chooser = new JFileChooser(); int returnval = chooser.showOpenDialog(this); li.setPreferredSize(new Dimension(500,300)); if(returnval == JFileChooser.APPROVE_OPTION){ File file = chooser.getSelectedFile(); FileInputStream fis = new FileInputStream( file ); InputStreamReader isr = new InputStreamReader( fis ); BufferedReader br = new BufferedReader( isr ); String line = br.readLine(); String[] token = line.split(","); String str = token[0] + "\t" + token[3]; myList.addElement(str); li.setModel(myList); }
- akigiri0213
- お礼率70% (22/31)
- Java
- 回答数2
- ありがとう数3
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 どこに問題があるのかよくわからなかったので、似たようなサンプルを作ってみたのですが、ちゃんと動きます。 ↓のコードを試してみるとどうなりますか? (全角スペースを半角スペースに変換してからコンパイルしてください) import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ListTest extends JFrame implements ActionListener { JList list; JButton button; public static void main(String[] args) { ListTest frame = new ListTest(); frame.setSize(400, 300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } public ListTest() { button = new JButton("追加"); button.addActionListener(this); getContentPane().add(button, BorderLayout.SOUTH); list = new JList(); JScrollPane scroll = new JScrollPane(list); getContentPane().add(scroll, BorderLayout.CENTER); } public void actionPerformed(ActionEvent event) { DefaultListModel model = new DefaultListModel(); model.addElement("おはよう"); model.addElement("こんにちは"); model.addElement("こんばんは"); list.setModel(model); } } ------------------------------------------- あと、あらかじめDefaultListModelを使ったJListを作っておき、データを追加したり削除したりするときは、listModelを操作したほうが、すっきりすると思うのですが、どうでしょう? こんな↓感じです。 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ListTest extends JFrame implements ActionListener { JList list; DefaultListModel model; JButton button; public static void main(String[] args) { ListTest frame = new ListTest(); frame.setSize(400, 300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } public ListTest() { button = new JButton("追加"); button.addActionListener(this); getContentPane().add(button, BorderLayout.SOUTH); model = new DefaultListModel(); list = new JList(model); JScrollPane scroll = new JScrollPane(list); getContentPane().add(scroll, BorderLayout.CENTER); } public void actionPerformed(ActionEvent event) { model.clear(); model.addElement("おはよう"); model.addElement("こんにちは"); model.addElement("こんばんは"); } }
その他の回答 (1)
- koki_m
- ベストアンサー率83% (45/54)
こんばんは。 まずはもう少し「うまくいかない箇所」がどこなのかを絞り込む必要がありそうですね。 ボタンのアクションメソッドが呼ばれないのか、ファイル選択まではできるけどリストにデータが表示されないのかも分かりません。 例えば、まずはボタンアクション抜きにして、 myList.addElement(str); のところに適当な文字列を入れて動かしてみて、それが表示されればJListは問題ないことが分かります。 一度に ・ボタンアクション ・ファイル参照取得 ・ファイルオープン ・テキスト処理 ・リストモデル編集 ・JListビューの更新 と多くのことをやろうとしても、何が分からないのかが分からない状態になってしまうと思います。 上から順番に、どこまでできているのかを調査してみてください。
補足
お返事ありがとうございます! 書き方がまずかったようで…(汗) ・ボタンアクション ・ファイル参照取得 ・ファイルオープン ・テキスト処理 ボタンを押すとファイルダイアログが開き、テキストファイルを選択、データの1行分だけを取り出してSystem.out.printlnで表示させることは出来ました。 ・リストモデル編集 ・JListビューの更新 strに1行分を取り出すことは出来たので、 private DefaultListModel myList = new DefaultListModel(); を使い、アクションの部分でmyList.addElement(str); をしたのですが何も表示されませんでした。 エラーが出なかったのでわからなくなり、書き込みさせてもらいました。 お手数ですがヒントをいただけたらと… よろしくお願いします(汗)
関連するQ&A
- ファイル内の1行(レコード)から指定バイト数だけを読込みたい。
ファイル内の1行(レコード)から指定バイト数だけを読込みたい。 // ファイルオープン FileInputStream fis = new FileInputStream(file); InputStreamReader isr; isr = new InputStreamReader(fis); BufferedReader result = new BufferedReader(isr); while (result.readLine() != null) { // 末尾まで移動する } 上記のようにBufferedReaderを使い、ファイルを読み込んでいるのですが、 ファイル内の1行ごとに指定バイト数だけを読み込みたいです。 readLineメソッドでは1行を全部読み込んでしまうため出来ません。 (readLineで一度他の変数へ入れてからというのは無しです。読込む時点で指定バイト数としたいのです。) readメソッドでは、行ごとの指定って出来ないですよね・・・。 ファイル操作系の知識が少ない為、なかなか探せません。 読み込む時点で1行の取得レコード長に制限値を設ける方法はないでしょうか? また、取得レコード長が制限値を超えた場合、エラーメッセージを出したいのですがその判定とかも可能でしょうか? どうかよろしくお願いします。 ロジックとしてはこんな感じにしたいです。 while(ファイルの終端まで行を読み込む){ // 読み込んだ1行が2048バイト未満かを判定 if(読み込んだ1行が2048バイトを超えている場合){ エラーメッセージを出力する(処理はそのまま続行) } 1行から2048バイト未満を取得 }
- ベストアンサー
- Java
- Arraylistを使用し売上集計のコード作成
プログラミング課題で質問です。 売上集計でCSVからデータを読み込み 支店データ 000,沖縄 001,北海道 というデータファイルと 商品データ SE001,テレビ SE002,レンジ というデータファイル 売上データ”.rcd”拡張子ファイル 支店:001 商品:SE001 売上金額:29800 というデータが入っているファイル この3つのファイルをArraylistを使用し作成しています 最後は支店ごとの売上金額と商品ごとの売上金額を 集計しなければなりません。 理想では売上データファイルと商品データファイルの3項目に売上金額の項目を追加する ように作成したいです。 初心者でわかりにくい説明だとは思うのですが ご指導ください。 いきずまってしまって進めません。 考え方などもまだまだなので一応今できているコードを記載します 途中までですが。。。。。。。 解説などで教えてもらいたいです。 *********************************public class UriageSyukei { public static void main (String[] args) { //指定されたディレクトリ File directory = new File(args[0]); /* * 1.支店定義ファイル * */ File branchFile = new File(directory + "\\branch.lst"); //変数を宣言 FileInputStream fis = null; InputStreamReader isr = null; BufferedReader br = null; ArrayList<List<String>> branchData = new ArrayList<List<String>>(); //支店定義ファイル処理 try { if (!branchFile.exists()) { System.out.println("支店定義ファイルが存在しません"); return; } fis = new FileInputStream(branchFile); isr = new InputStreamReader(fis); br = new BufferedReader(isr); String line ; while ((line = br.readLine()) != null) { List<String> branch = line.split(","); //配列の長さ if (branch.length != 2 || branch[0] == null || branch[1] == null) { System.out.println("支店定義ファイルのフォーマットが不正です"); return; } branchData.add(branch); } /* * 2.商品定義ファイル */ File commodityFile = new File(directory + "\\commodity.lst"); ArrayList<String[]> commodityData = new ArrayList<String[]>(); //商品定義ファイルの処理 if (!commodityFile.exists()) { System.out.println("商品定義ファイルが存在しません"); return; } fis = new FileInputStream(commodityFile); isr = new InputStreamReader(fis); br = new BufferedReader(isr); while ((line = br.readLine()) != null) { String[] commodity = line.split(","); //配列の長さ if (commodity.length != 2 || commodity[0] == null || commodity[1] == null) { System.out.println("商品定義ファイルのフォーマットが不正です"); return; } commodityData.add(commodity); } /* * 3.集計 */ //.rcdに該当する拡張子を検索 ArrayList<String[]> salesData = new ArrayList<String[]>(); String[] salesFiles = directory.list(); for (String salesFile : salesFiles) { if (!salesFile.endsWith(".rcd")) { continue; } File rcdFile = new File(directory + "\\" + salesFile); fis = new FileInputStream(rcdFile); isr = new InputStreamReader(fis); br = new BufferedReader(isr); String salesBranch = br.readLine(); String salesCommodity = br.readLine(); String price = br.readLine(); *************************************** できているのはここまでです。 途中修正などたくさんあると思いますが これを元に作成していきたいので教えてください よろしくお願いします。
- ベストアンサー
- Java
- Javaでのカンマで配列を分ける方法
こんにちは。 カンマ区切りで入力されているデータを2次元配列に格納したいのですがよくわかりません。 それとデータをtxtファイルから入力する方法で配列を入力した分だけ作ることはできますでしょうか? 現在のプログラムは最初に配列を1000個用意する形になっているので効率的とは言えないと思うのですが・・・。 以下プログラムを載せます。 public String[] datain(){ String[] data = new String[1000]; String inputFileName; int i = 0; // 読み込むファイルの名前 inputFileName = "D:\\a.txt"; // ファイルオブジェクトの生成 File inputFile = new File(inputFileName); try { // 入力ストリームの生成 FileInputStream fis = new FileInputStream(inputFile); InputStreamReader isr = new InputStreamReader(fis); BufferedReader br = new BufferedReader(isr); // テキストファイルからの読み込み String d; while ( ( d = br.readLine()) != null ) { data[i] = d; i += 1; } br.close(); } catch(Exception e) { e.printStackTrace(); } return data; } というメソッドです。 戻り値を返した後でも前でもいいので、 --データ-- (a.txt) あ,い,う,え,お か,き,く,け,こ さ,し,す,せ,そ ↓このように取り込みたいのです。 --配列-- [0,0] = あ [0,1] = い [0,2] = う [0,3] = え [0,4] = お [1,0] = か [1,1] = き [1,2] = く [1,3] = け [1,4] = こ [2,0] = さ [2,1] = し [2,2] = す [2,3] = せ [2,4] = そ よろしくお願いします。
- ベストアンサー
- Java
- ファイル読み込みLinux対応
JAVAでLinuxの環境でファイルを読み込む処理を行っているのですが、文字化けして上手く読み込めません。 環境はLinux 下記のfileNameは、新JISのファイル FileInputStream fis = new FileInputStream(fileName); BufferedReader br = new BufferedReader(new InputStreamReader(fis, "ISO2022JP")); とコーディングしてJISの文字コードを指定してファイルを読み込もうとしたのですが、 sun.io.MalformedInputException のエラーがでて しまいます。 最終的にJISコードをUTF8に変換してDBに書き込んでいます。この変換処理は、うまく行っておりますのでJISのファイルがJISコードとして読み込めれば実現できそうな気がすのですが・・・ 何かよい方法があれば教えて頂けませんか?
- ベストアンサー
- Java
- Fileから指定した行を読み取りたい
現在、例えば1300行目を読み取りたいとしたときに、今現在の私のやり方では、 FileInputStream fis = new FileInputStream("xxxxxx.txt"); InputStreamReader ir = new InputStreamReader(fis , "SJIS"); BufferedReader br = new BufferedReader(ir); String ch; int count=0; while((ch = br.readLine()) != null){ count++; if(count == 1300) break; } System.out.println("指定行の内容は:"+ch); br.close(); のように、1300回行を読んだらその内容を出力するようにしているのですが、これは、かなり無駄があると思うのです。なので、指定した行に読み込みヘッダを移動して、その指定した行を読み取りたいのですが、指定行を一発で読み取ることはできますか? skip(long numChars)メソッドを使用することを考えましたが、ファイルの各行のバイト数は各行ごとに異なるので、規則性がなく無理であると考えあきらめました。
- 締切済み
- Java
- Javaでよくわからないエラーが出てしまいます。
こんにちは。 Javaでプログラムを作っている途中で ArrayIndexOutOfBoundsException というエラーが出てきました。 調べてみると"配列として確保された領域を 超えた場所アクセスした場合に発生"と書かれていました。 しかし、エラーの部分を見つけることができません。 以下に問題のプログラムを掲載します,問題点を指摘してもらいたいのです。 よろしくお願いします。 ちなみに開発環境はJava7です。 -------------以下プログラム------------- import java.io.*; public class Datain{ public static String[][] datain(){ String inputFileName; String indata_1; String[] indata_2 = new String[12]; String[][] mondata = new String[100][12]; int i = 0; //読み込むファイル名 inputFileName = "H:\\問題データ.txt"; //ファイルオブジェクトの生成 File inputFile = new File(inputFileName); try{ //入力ストリームの生成 FileInputStream fis = new FileInputStream(inputFile); InputStreamReader isr = new InputStreamReader(fis); BufferedReader br = new BufferedReader(isr); //テキストファイルからの読み込み while((indata_1 = br.readLine()) != null){ indata_2 = indata_1.split(","); for(int z = 0;z < indata_2.length;z++){ mondata[i][z] = indata_2[z]; } i++; } br.close(); }catch(Exception e){ e.printStackTrace(); } return mondata; } public static void main(String[] args){ String[][] a; a = datain(); System.out.println(a[0][0]); } } -------------テキストファイル------------- あいう,えおか,きくけ こさし,すせそ,たちつ てとな,にぬね,のはひ ※カンマ区切りの「.txt」ファイル
- ベストアンサー
- Java
- キーボードからの文字列検索
いつもお世話になっております。 文字列検索をするプログラムを作っているのですが、キーボードから検索したい文字を入力して検索する方法がわかりません。コマンドラインからの検索はできたのですが、スペースが入ると思うように検索できないんです。 どなたかご教授頂けると大変うれしいです。 よろしくお願い致します。 import java.io.*; import java.util.*; class Search{ public static void main(String[] args) throws IOException, InterruptedException{ FileInputStream fis = new FileInputStream("input.txt"); InputStreamReader in = new InputStreamReader(fis); BufferedReader br = new BufferedReader(in); String msg = br.readLine(); Camera mySearch = new Camera(); String target = (args[0]); mySearch.setFocus(target.length()); BufferedReader console = new BufferedReader(new InputStreamReader(System.in)); System.out.println(msg); for(int i = 0; i < msg.length(); i++ ){ mySearch.shift(msg.charAt(i)); if(mySearch.compare(target)){ System.out.println("Pattern '" + target + "' is found at index of " + (i - target.length() + 1)); break; } } } }
- 締切済み
- Java
- javaのプログラミングについての質問です
javaのプログラミングについての質問です 任意の複数の数値を入れたファイルを読み取りその数値の場所から次の数値まで線を描画するプログラミングを作成しました ここから発展問題としてタートルグラフィックスを 描画するプログラムを50歩進み右に90度曲がることを4度繰り返すという条件で作ってみようと思ったのですが上手くコンパイルが通りません 取りあえず分かっているのは (100.cos45,100.sin45)で90°曲がる repeat 4,forward 50right 90 end 0 だけです もし分かる方がいらっしゃいましたらご返答宜しくお願いします import java.awt.*; import java.awt.event.*; import java.io.*; public class mondai{ int x[] = new int[100]; int y[] = new int[100]; int len = 0; public static void main(String[] args){ new mondai(args[0]); } public mondai(String mondai2){ ReadFile rf = new ReadFile(mondai2); String line; while( (line = rf.gets()) != null) { String[] date = line.split(","); if(date.length == 2){ x[len] = Integer.parseInt(date[0]); System.out.println(date[0]); y[len]= Integer.parseInt(date[1]); System.out.println(date[1]); len++; } } Frame f = new Frame(); f.setTitle("Line"); f.setSize(640,480); f.setLayout(null); f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); }}); DrawArea da = new DrawArea(); da.setBounds(0,0,640,480); f.add(da); f.setVisible(true); } private class DrawArea extends Canvas{ public void paint(Graphics g){ for(int i=0;i<len-1;i++) g.drawLine(x[i],y[i],x[i+1],y[i+1]); } } private class ReadFile{ FileInputStream fis; InputStreamReader isr; BufferedReader br; public ReadFile(String filename){ try{ fis = new FileInputStream(filename); isr = new InputStreamReader(fis); br = new BufferedReader(isr); }catch(Exception e){ e.printStackTrace(); } } public String gets(){ String line = ""; try{ line = br.readLine(); }catch(Exception e){ e.printStackTrace(); } return line; } } }
- 締切済み
- Java
- プログラミングを始めたばかりの初心者です
プログラミングを始めたばかりの初心者で、行き詰っていることがあります。 Windows環境でjavaのプログラミングをしています。(JDK1.7.0_03) InputFileというファイルを、指定したバイト単位で文字を切り出し、新たなOutputFileという ファイルに書き出したいのですが、以下の例のように、全角マイナスだけが?と表示されて しまい、うまくいきません。 InputFile 田中太郎 tanaka tarou タナカタロウ 田中町1-1-1 06011112222・・・ 吉田花子 yoshida hanako ヨシダハナコ 吉田町2-2-2 01011113333・・・ 山田良子 yamada yoshiko ヤマダヨシコ 山田町3-3-3 02011115555・・・ OutputFile 田中太郎 tanaka tarou タナカタロウ 田中町1?1?1 06011112222・・・ 吉田花子 yoshida hanako ヨシダハナコ 吉田町2?2?2 01011113333・・・ 山田良子 yamada yoshiko ヤマダヨシコ 山田町3?3?3 02011115555・・・ お見せするのも恥ずかしい滅茶苦茶なソースかもしれませんが現状は以下の通りです。 どなたか教えていただけないでしょうか。よろしくお願い致します。 (読み込むInputFileというファイルの文字コードはEUCです。) ソース import java.io.*; class ReadTest{ static LineNumberReader inr; static InputStreamReader isr; static String FN = "InputFile"; static OutputStreamWriter osw; public static void main(String[] args) { String line; try { FileInputStream fis = new FileInputStream(FN); isr = new InputStreamReader(fis,"EUC_JP"); inr = new LineNumberReader(new BufferedReader(isr)); FileOutputStream fos = new FileOutputStream("OutputFile"); osw = new OutputStreamWriter(fos,"EUC_JP"); BufferedWriter bw = new BufferedWriter(osw); while ((line = inr.readLine()) != null) { bw.write(new String(line.getBytes(),0,120)); bw.newLine(); } System.out.println(inr.getLineNumber() + "件読み込み完了"); fis.close(); isr.close(); bw.close(); fos.close(); } catch (IOException e) { System.out.println(e); } } }
- 締切済み
- Java
- javaで大きなファイルを解析できますか?
100MBくらいのアクセスログをjavaを使って解析しようと思うのですが、どうしても、エラーが出ます。 読み込み方が間違っているのでしょうか? まったくわかりません。 教えていただけないでしょうか? また、これを知ったきっかけも教えていただけましたら幸いです。 宜しくお願い致します。 読み込みの部分↓↓↓ class kaiseki { public static void main(String[] args) throws Exception { InputStream is = new FileInputStream("log.txt"); BufferedReader br = new BufferedReader(new InputStreamReader(is));
- ベストアンサー
- Java
お礼
お返事ありがとうございます! サンプルありがとうございます! 参考にさせていただいたおかげで出来ました! DefaultListModelの書き方がまずかったようです(汗) 感謝感激です(*´∀`*)