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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Java

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

Q&A

解決済

3回答

1297閲覧

javaのcsvファイルの読み込みとGUIについて

kusa00001

総合スコア2

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Java

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

0グッド

1クリップ

投稿2023/01/21 14:13

前提

csvファイルを拡張for文を利用して読み込み、中に書かれている内容に応じて描画をするプログラムを書きたいのですが、「描画」ボタンを押しても描画されませんでした。
ちなみにcsvファイルには

四角形 黒 50 50 230 150
塗りつぶし四角形 青 50 50 230 150
塗りつぶし四角形 黄色 110 50 25 150
塗りつぶし四角形 黄色 50 110 230 25

と記載されています。

該当のソースコード

java

1import java.awt.Color; 2import java.awt.Container; 3import java.awt.Graphics; 4import java.io.IOException; 5import java.nio.charset.StandardCharsets; 6import java.nio.file.Files; 7import java.nio.file.Path; 8import java.nio.file.Paths; 9import java.util.List; 10import javax.swing.JButton; 11import javax.swing.JFrame; 12import javax.swing.JPanel; 13import javax.swing.JTextField; 14import javax.swing.WindowConstants; 15import java.awt.BorderLayout; 16import java.awt.FlowLayout; 17import java.awt.event.ActionEvent; 18import java.awt.event.ActionListener; 19 20public class finalReport extends JFrame implements ActionListener{ 21 private JPanel panel1; 22 private JTextField textField1; 23 private JButton button1; 24 private String fileName; 25 public finalReport() { 26 setLayout(new BorderLayout()); 27 panel1 = new JPanel(); 28 textField1 = new JTextField("sec.csv", 10); 29 button1 = new JButton("描画"); 30 button1.addActionListener(this); 31 panel1.setLayout(new FlowLayout()); 32 panel1.add(textField1); 33 panel1.add(button1); 34 Container container = getContentPane(); 35 container.setLayout(new BorderLayout()); 36 add(panel1, BorderLayout.NORTH); 37 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 38 setSize(700, 300); 39 setLocationRelativeTo(null); 40 setVisible(true); 41 } 42 43 class MyPanel extends JPanel { 44 public void paint(Graphics g) { 45 try { 46 Path path = Paths.get(fileName); 47 List<String> list = Files.readAllLines(path, StandardCharsets.UTF_8); 48 for (String s : list) { 49 String[] raw = s.split(","); 50 String shape = raw[0]; 51 String color = raw[1]; 52 int x_axis = Integer.parseInt(raw[2]); 53 int y_axis = Integer.parseInt(raw[3]); 54 int width = Integer.parseInt(raw[4]); 55 int height = Integer.parseInt(raw[5]); 56 if (shape.equals("四角形")) { 57 if (color.equals("黒")) { 58 g.setColor(Color.BLACK); 59 } 60 g.drawRect(x_axis, y_axis, width, height); 61 } else if (shape.equals("塗りつぶし四角形")) { 62 if (color.equals("青")) { 63 g.setColor(Color.BLUE); 64 }else if (color.equals("黄色")) { 65 g.setColor(Color.YELLOW); 66 }g.fillRect(x_axis, y_axis, width, height); 67 } 68 } 69 } catch (IOException e) { 70 e.printStackTrace(); 71 } 72 } 73 } 74 @Override 75 public void actionPerformed(ActionEvent e) { 76 fileName = textField1.getText(); 77 if (fileName.equals("sec.csv")) { 78 MyPanel myPanel = new MyPanel(); 79 add(myPanel, BorderLayout.CENTER); 80 myPanel.repaint(); 81 }} 82 public static void main(String[] args) { 83 new finalReport(); 84 } 85}

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

jimbe

2023/01/21 16:22

paint() はウインドウの重なり等で反映に実行されます。 ですので極力軽くする必要があり、ファイルアクセス等描画以外の(相対的に)重い処理を行ってはいけません。
guest

回答3

0

Swing では paint() では無く paintComponent() を override し、描画以外は極力行わないようにしてください。

FinalReport.java

java

1import java.awt.*; 2import java.io.IOException; 3import java.nio.charset.StandardCharsets; 4import java.nio.file.*; 5import java.util.*; 6import java.util.List; 7 8import javax.swing.*; 9 10public class FinalReport extends JFrame { 11 public static void main(String[] args) { 12 SwingUtilities.invokeLater(() -> new FinalReport().setVisible(true)); 13 } 14 15 public FinalReport() { 16 super("FinalReport"); 17 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 18 setSize(700, 300); 19 setLocationRelativeTo(null); 20 setLayout(new BorderLayout()); 21 22 JTextField textField = new JTextField("sec.csv", 10); 23 JButton button = new JButton("描画"); 24 25 JPanel panel = new JPanel(new FlowLayout()); 26 panel.add(textField); 27 panel.add(button); 28 add(panel, BorderLayout.NORTH); 29 30 MyPanel myPanel = new MyPanel(); 31 add(myPanel, BorderLayout.CENTER); 32 33 button.addActionListener(v -> { 34 String fileName = textField.getText(); 35 try { 36 myPanel.readFile(fileName); 37 } catch(IOException e) { 38 e.printStackTrace(); 39 } 40 }); 41 } 42 43 private class MyPanel extends JPanel { 44 private static final Map<String,Color> colorMap = new HashMap<>(); 45 static { 46 colorMap.put("黒", Color.BLACK); 47 colorMap.put("青", Color.BLUE); 48 colorMap.put("黄色", Color.YELLOW); 49 } 50 51 private enum Shape { 52 四角形 { 53 @Override 54 void draw(Graphics g, int x, int y, int w, int h) { 55 g.drawRect(x, y, w, h); 56 } 57 }, 58 塗りつぶし四角形 { 59 @Override 60 void draw(Graphics g, int x, int y, int w, int h) { 61 g.fillRect(x, y, w, h); 62 } 63 }; 64 abstract void draw(Graphics g, int x, int y, int w, int h); 65 } 66 67 private class DrawingObject { 68 private Shape shape; 69 private Color color; 70 private int x, y, w, h; 71 DrawingObject(Shape shape, Color color, int x, int y, int w, int h) { 72 this.shape = shape; 73 this.color = color; 74 this.x = x; 75 this.y = y; 76 this.w = w; 77 this.h = h; 78 } 79 void draw(Graphics g) { 80 g.setColor(color); 81 shape.draw(g, x, y, w, h); 82 } 83 } 84 85 private List<DrawingObject> doList = new ArrayList<>(); 86 87 MyPanel() { 88 super(null); 89 setBackground(Color.WHITE); 90 } 91 92 void readFile(String fileName) throws IOException { 93 doList.clear(); 94 95 Path path = Paths.get(fileName); 96 List<String> list = Files.readAllLines(path, StandardCharsets.UTF_8); 97 for(String s : list) { 98 String[] raw = s.split(","); 99 String shape = raw[0]; 100 String color = raw[1]; 101 int x = Integer.parseInt(raw[2]); 102 int y = Integer.parseInt(raw[3]); 103 int w = Integer.parseInt(raw[4]); 104 int h = Integer.parseInt(raw[5]); 105 doList.add(new DrawingObject(Shape.valueOf(shape), colorMap.get(color), x, y, w, h)); 106 } 107 repaint(); 108 } 109 110 @Override 111 public void paintComponent(Graphics g) { 112 super.paintComponent(g); 113 for(DrawingObject obj : doList) obj.draw(g); 114 } 115 } 116}

sec.csv

csv

1塗りつぶし四角形,青,50,50,230,150 2塗りつぶし四角形,黄色,110,50,25,150 3塗りつぶし四角形,黄色,50,110,230,25 4四角形,黒,50,50,230,150

描画ボタン押下結果ウインドウ画像

投稿2023/01/21 17:13

編集2023/01/21 17:35
jimbe

総合スコア12644

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

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

0

「描画」ボタンを押しても描画されませんでした。

ウィンドウのサイズを変えたりすると表示されますね。
この辺私もいまだに理解できていないのですが、パネルの追加等レイアウトにかかわる変更の時は、revalidateを呼んだ上でrepaintを呼んでください。

Java

1//myPanel.repaint(); 2revalidate(); 3repaint();

JComponent#revalidate (Java Platform SE 8 )


しかしこのままですと、ボタンを押すたびにMyPanelが増え続けます。
MyPanelを最初から追加しておけば、myPanel.repaint()のままでよかったということになります。

Java

1import javax.swing.*; 2import java.awt.*; 3import java.awt.event.ActionEvent; 4import java.awt.event.ActionListener; 5import java.io.IOException; 6import java.nio.charset.StandardCharsets; 7import java.nio.file.*; 8import java.util.List; 9 10 11public class FinalReport extends JFrame implements ActionListener { 12 public static void main(String[] args) { 13 new FinalReport().setVisible(true); 14 } 15 16 private final JTextField textField1; 17 private final MyPanel myPanel; 18 private String fileName; 19 20 21 public FinalReport() { 22 setDefaultCloseOperation(EXIT_ON_CLOSE); 23 setSize(700, 300); 24 setLocationRelativeTo(null); 25 26 JPanel panel1 = new JPanel(); 27 add(panel1, BorderLayout.NORTH); 28 29 textField1 = new JTextField("sec.csv", 10); 30 panel1.add(textField1); 31 32 JButton button1 = new JButton("描画"); 33 button1.addActionListener(this); 34 panel1.add(button1); 35 36 myPanel = new MyPanel(); 37 add(myPanel, BorderLayout.CENTER); 38 } 39 40 @Override public void actionPerformed(ActionEvent e) { 41 fileName = textField1.getText(); 42 if (fileName.equals("sec.csv")) { 43 myPanel.repaint(); 44 } 45 } 46 47 48 class MyPanel extends JPanel { 49 @Override public void paintComponent(Graphics g) { 50 super.paintComponent(g); 51 if (fileName == null) return; 52 53 try { 54 Path path = Paths.get(fileName); 55 List<String> list = Files.readAllLines(path, StandardCharsets.UTF_8); 56 for (String s : list) { 57 String[] raw = s.split(","); 58 String shape = raw[0]; 59 String color = raw[1]; 60 int x_axis = Integer.parseInt(raw[2]); 61 int y_axis = Integer.parseInt(raw[3]); 62 int width = Integer.parseInt(raw[4]); 63 int height = Integer.parseInt(raw[5]); 64 65 if (color.equals("黒")) { 66 g.setColor(Color.BLACK); 67 } else if (color.equals("青")) { 68 g.setColor(Color.BLUE); 69 } else if (color.equals("黄色")) { 70 g.setColor(Color.YELLOW); 71 } 72 73 if (shape.equals("四角形")) { 74 g.drawRect(x_axis, y_axis, width, height); 75 } else if (shape.equals("塗りつぶし四角形")) { 76 g.fillRect(x_axis, y_axis, width, height); 77 } 78 } 79 } catch (IOException e) { 80 e.printStackTrace(); 81 } 82 } 83 } 84}

投稿2023/01/21 15:33

編集2023/01/21 15:35
TN8001

総合スコア9319

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

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

0

ベストアンサー

diff

1 if (fileName.equals("sec.csv")) { 2 MyPanel myPanel = new MyPanel(); 3+ myPanel.setSize(200, 300); 4 add(myPanel, BorderLayout.CENTER);

投稿2023/01/21 14:59

shiketa

総合スコア3971

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

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

shiketa

2023/01/22 01:53 編集

jimbeさん、TN8001さんご両名の忠告は、きちんとご理解されたほうがいいとおもいますよ。わたしは「描画されませんでした」への対応案を提示しただけですので。
TN8001

2023/01/22 10:28

なかなか難しい問題ですよね...(以下誰かへの意見とかではなく個人の感想です) > jimbeさん、TN8001さんご両名の忠告は、きちんとご理解されたほうがいいとおもいますよ。 ほとんどの質問者は解決後に質問を見ることはなく、次に質問しようとしたときに気が付くかどうかでしょうね(そして次は1年後かもしれないしw メールアドレスを登録しておけば通知は行くはずですが、みなさんSNS登録なんですかね?(あるいは捨てアド?w > わたしは「描画されませんでした」への対応案を提示しただけですので。 説明不足に感じたのとリークが気になったので急いで回答しましたが、言葉足らずでjimbeさんの回答を呼んでしまいました(気にはなっていたんですが一言でも触れておくべきでした^^; teratailでは「質問から15分以内に回答をし、ベストアンサーに選ばれる」と追加スコアがあることから、素早い回答を期待されているんだと思います。 また「価値のあるコンテンツを世の中に残し届ける事」とあるように、閲覧者に役に立つあるいは正しい情報を残すことも求められています。 この両立は大変難しく(当初の設計では回答のブラッシュアップを期待していた?)修正をお仕着せするよりは、多様な回答があったほうが望ましい気がします(明確に間違っている場合はコメントしますが) 個人個人の回答ポリシーで回答していれば、「結果的に充実するのかなー」と思います^^ 何が言いたいのかよくわからんコメントになってしまった(コードを書くのは好きだけど文章は苦手^^;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問