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

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

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

JTableとは二次元的なセルの表を表示し編集するJava Swing用のコンポーネントです。

Java

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

受付中

tableのデータを更新したいが表示が変わらない

suteaka
suteaka

総合スコア13

JTable

JTableとは二次元的なセルの表を表示し編集するJava Swing用のコンポーネントです。

Java

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

2回答

-1評価

1クリップ

500閲覧

投稿2022/02/04 12:07

前提・実現したいこと

javaを独学で勉強しています。
表についての質問で、表のデータを初期値から変更し、反映させたいと思っています。

プログラムを起動し情報タブを開くと写真のようになります。
イメージ説明
仮に機械1のワット数「100」を「500」に変えたい場合、表の該当セル(または行)をクリックすることでマウスイベントが発生し、新規ウィンドウ(DetailFrame)を表示させます(写真参照)
イメージ説明
ここで100の数字を500に変更し「OK」を押したときに、配列 tabledata1[][]の値を500変更し、表についても500と表示されるようにしたいです。

発生している問題・エラーメッセージ

System.out.println によって変える前後の状態を確認し、値は変わっているようなのですが、フレームで表示させているほうに反映されません。
加えて、新規ウィンドウ(DetailFrame)で100を500に変えてOKを押し、プログラムを終了せずに再度変更しようと表をクリックし200にしたとするとき、System.out.printlnの1回目(100→500)は問題ないですが、2回目(500→200)のときはbeforeのほうが100に戻っています(新規ウィンドウの方は100で問題ないですが、System.out.printlnで表示させている方はtablemodelないしtabledataで本来は1回目で500に変えたので500が表示されるはず)。

該当のソースコード

java

public class Hyouji_sample{ public static void main(String[] args) { MyFrameSample mainframe = new MyFrameSample("表示", 800, 600); mainframe.setLocationRelativeTo(null); mainframe.setVisible(true); } } class MyFrameSample extends JFrame { MyFrameSample(String title, int width, int height){ setTitle(title); setSize(width, height); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JTabbedPane tabbedpane = new JTabbedPane(); Machine1 machine1 = new Machine1(); Info info = new Info(); tabbedpane.addTab("機械1", machine1); tabbedpane.addTab("情報", info); getContentPane().add(tabbedpane, BorderLayout.NORTH); } } class Machine1 extends JPanel{ Machine1(){ JLabel label = new JLabel(); LineBorder border = new LineBorder(Color.RED, 2, true); label.setText("sanpuru"); add(label); setPreferredSize(new Dimension(720, 240)); setBorder(border); } } class Info extends JPanel implements MouseListener{ private String[][] tabledata1 = { {"機械1", "100", "ABC", "50"}, {"機械2", "200", "FRE", "10"}, }; private String[] columnNames1 = {"", "ワット数", "油の種類", "油残量"}; DefaultTableModel tableModel1 = new DefaultTableModel(tabledata1, columnNames1); JTextField textfield = new JTextField(); JTable table = new JTable(tableModel1); public Info(){ JScrollPane sp = new JScrollPane(table); JPanel panel = new JPanel(); JLabel label = new JLabel("テロップ内容"); textfield.setText("残量確認のこと"); textfield.addMouseListener(this); table.addMouseListener(this); panel.add(label); panel.add(textfield); sp.setPreferredSize(new Dimension(600, 200)); add(sp, BorderLayout.NORTH); add(panel, BorderLayout.SOUTH); } public void mouseClicked(MouseEvent e){ if (e.getSource()==textfield) { }else { int i; i = table.getSelectedRow(); DetailHyouji frame = new DetailHyouji(i); } } public void mouseEntered(MouseEvent e){ } public void mouseExited(MouseEvent e){ } public void mousePressed(MouseEvent e){ } public void mouseReleased(MouseEvent e){ } public void Renew(int row, int column, String str){ System.out.println("before "+ tableModel1.getValueAt(row, column)); System.out.println("before "+ tabledata1[row][column]); tableModel1.setValueAt(str, row, column); tabledata1[row][column] = str; tableModel1.fireTableCellUpdated(row, column); System.out.println("after "+ tableModel1.getValueAt(row, column)); System.out.println("after "+ tabledata1[row][column]); System.out.println(""); } } class DetailHyouji { public DetailHyouji(int i) { DetailFrame mainframe = new DetailFrame("詳細入力", 300, 200, i); mainframe.setLocationRelativeTo(null); mainframe.setVisible(true); } } class DetailFrame extends JFrame implements MouseListener{ JButton ok = new JButton("OK"); JButton cancel = new JButton("キャンセル"); JTextField textfield_wat = new JTextField("100"); JTextField textfield_syurui = new JTextField("ABC"); JTextField textfield_zanryou = new JTextField("50"); int j; DetailFrame(String title, int width, int height, int i){ j = i; setTitle(title); setSize(width, height); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); JPanel panel = new JPanel(); JPanel panel2 = new JPanel(); JLabel wat = new JLabel("ワット数"); JLabel syurui = new JLabel("油の種類"); JLabel zanryou = new JLabel("油残量"); wat.setHorizontalAlignment(JLabel.CENTER); syurui.setHorizontalAlignment(JLabel.CENTER); zanryou.setHorizontalAlignment(JLabel.CENTER); ok.addMouseListener(this); cancel.addMouseListener(this); panel.setLayout(new GridLayout(5, 2)); panel.add(wat); panel.add(textfield_wat); panel.add(syurui); panel.add(textfield_syurui); panel.add(zanryou); panel.add(textfield_zanryou); panel2.add(ok); panel2.add(cancel); getContentPane().add(panel, BorderLayout.CENTER); getContentPane().add(panel2, BorderLayout.SOUTH); } public void mouseClicked(MouseEvent e) { Info info = new Info(); if (e.getSource()==cancel) { setVisible(false); dispose(); }else { String str_wat = textfield_wat.getText(); info.Renew(j, 1, str_wat); String str_syurui = textfield_syurui.getText(); info.Renew(j, 2, str_syurui); String str_zanryou = textfield_zanryou.getText(); info.Renew(j, 3, str_zanryou); setVisible(false); dispose(); } } public void mouseEntered(MouseEvent e){ } public void mouseExited(MouseEvent e){ } public void mousePressed(MouseEvent e){ } public void mouseReleased(MouseEvent e){ } }

試したこと

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

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

独学で学んでいることもありコードはスマートでないと思われるかもしれませんが、ご了承ください。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

JTable

JTableとは二次元的なセルの表を表示し編集するJava Swing用のコンポーネントです。

Java

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