前提・実現したいこと
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/ツールのバージョンなど)
独学で学んでいることもありコードはスマートでないと思われるかもしれませんが、ご了承ください。
まだ回答がついていません
会員登録して回答してみよう