前提・実現したいこと
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
1public class Hyouji_sample{ 2 public static void main(String[] args) { 3 MyFrameSample mainframe = new MyFrameSample("表示", 800, 600); 4 mainframe.setLocationRelativeTo(null); 5 mainframe.setVisible(true); 6 } 7} 8 9class MyFrameSample extends JFrame { 10 11 MyFrameSample(String title, int width, int height){ 12 setTitle(title); 13 setSize(width, height); 14 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 15 16 JTabbedPane tabbedpane = new JTabbedPane(); 17 18 Machine1 machine1 = new Machine1(); 19 Info info = new Info(); 20 21 tabbedpane.addTab("機械1", machine1); 22 tabbedpane.addTab("情報", info); 23 24 getContentPane().add(tabbedpane, BorderLayout.NORTH); 25 } 26} 27 28class Machine1 extends JPanel{ 29 Machine1(){ 30 JLabel label = new JLabel(); 31 LineBorder border = new LineBorder(Color.RED, 2, true); 32 33 label.setText("sanpuru"); 34 35 add(label); 36 setPreferredSize(new Dimension(720, 240)); 37 setBorder(border); 38 } 39 40} 41 42class Info extends JPanel implements MouseListener{ 43 private String[][] tabledata1 = { 44 {"機械1", "100", "ABC", "50"}, 45 {"機械2", "200", "FRE", "10"}, 46 }; 47 private String[] columnNames1 = {"", "ワット数", "油の種類", "油残量"}; 48 DefaultTableModel tableModel1 = new DefaultTableModel(tabledata1, columnNames1); 49 JTextField textfield = new JTextField(); 50 JTable table = new JTable(tableModel1); 51 52 public Info(){ 53 JScrollPane sp = new JScrollPane(table); 54 JPanel panel = new JPanel(); 55 JLabel label = new JLabel("テロップ内容"); 56 textfield.setText("残量確認のこと"); 57 textfield.addMouseListener(this); 58 table.addMouseListener(this); 59 panel.add(label); 60 panel.add(textfield); 61 sp.setPreferredSize(new Dimension(600, 200)); 62 add(sp, BorderLayout.NORTH); 63 add(panel, BorderLayout.SOUTH); 64 } 65 public void mouseClicked(MouseEvent e){ 66 if (e.getSource()==textfield) { 67 68 }else { 69 int i; 70 i = table.getSelectedRow(); 71 DetailHyouji frame = new DetailHyouji(i); 72 } 73 } 74 public void mouseEntered(MouseEvent e){ 75 } 76 public void mouseExited(MouseEvent e){ 77 } 78 public void mousePressed(MouseEvent e){ 79 } 80 public void mouseReleased(MouseEvent e){ 81 } 82 public void Renew(int row, int column, String str){ 83 System.out.println("before "+ tableModel1.getValueAt(row, column)); 84 System.out.println("before "+ tabledata1[row][column]); 85 tableModel1.setValueAt(str, row, column); 86 tabledata1[row][column] = str; 87 tableModel1.fireTableCellUpdated(row, column); 88 System.out.println("after "+ tableModel1.getValueAt(row, column)); 89 System.out.println("after "+ tabledata1[row][column]); 90 System.out.println(""); 91 } 92} 93 94class DetailHyouji { 95 public DetailHyouji(int i) { 96 DetailFrame mainframe = new DetailFrame("詳細入力", 300, 200, i); 97 mainframe.setLocationRelativeTo(null); 98 mainframe.setVisible(true); 99 } 100} 101 102class DetailFrame extends JFrame implements MouseListener{ 103 JButton ok = new JButton("OK"); 104 JButton cancel = new JButton("キャンセル"); 105 JTextField textfield_wat = new JTextField("100"); 106 JTextField textfield_syurui = new JTextField("ABC"); 107 JTextField textfield_zanryou = new JTextField("50"); 108 int j; 109 110 DetailFrame(String title, int width, int height, int i){ 111 j = i; 112 setTitle(title); 113 setSize(width, height); 114 setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 115 116 JPanel panel = new JPanel(); 117 JPanel panel2 = new JPanel(); 118 JLabel wat = new JLabel("ワット数"); 119 JLabel syurui = new JLabel("油の種類"); 120 JLabel zanryou = new JLabel("油残量"); 121 wat.setHorizontalAlignment(JLabel.CENTER); 122 syurui.setHorizontalAlignment(JLabel.CENTER); 123 zanryou.setHorizontalAlignment(JLabel.CENTER); 124 ok.addMouseListener(this); 125 cancel.addMouseListener(this); 126 127 panel.setLayout(new GridLayout(5, 2)); 128 panel.add(wat); 129 panel.add(textfield_wat); 130 panel.add(syurui); 131 panel.add(textfield_syurui); 132 panel.add(zanryou); 133 panel.add(textfield_zanryou); 134 135 panel2.add(ok); 136 panel2.add(cancel); 137 138 getContentPane().add(panel, BorderLayout.CENTER); 139 getContentPane().add(panel2, BorderLayout.SOUTH); 140 } 141 142 public void mouseClicked(MouseEvent e) { 143 Info info = new Info(); 144 if (e.getSource()==cancel) { 145 setVisible(false); 146 dispose(); 147 }else { 148 String str_wat = textfield_wat.getText(); 149 info.Renew(j, 1, str_wat); 150 String str_syurui = textfield_syurui.getText(); 151 info.Renew(j, 2, str_syurui); 152 String str_zanryou = textfield_zanryou.getText(); 153 info.Renew(j, 3, str_zanryou); 154 155 setVisible(false); 156 dispose(); 157 } 158 } 159 public void mouseEntered(MouseEvent e){ 160 } 161 public void mouseExited(MouseEvent e){ 162 } 163 public void mousePressed(MouseEvent e){ 164 } 165 public void mouseReleased(MouseEvent e){ 166 } 167}
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
独学で学んでいることもありコードはスマートでないと思われるかもしれませんが、ご了承ください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/02/07 10:25