2017-03-24 9 views
0

私はボタンの配列を作成し、それらをフレームに追加し、それぞれのアクションリスナーを作成してJOptionPaneを開いて入力を取得し、それをString配列に追加しました。配列ボタンのテキストは、ポップアップが閉じられた後は更新されませんが、配列の一部ではないボタンはそのテキストをうまく更新します。JButton in array update text

文字列配列はJOptionPaneのデータを取得します。ボタンのキャプションは更新されません。

私の全プログラムでは、.xmlファイルにar_str_valsを書いています。アレイを適切に保存して読み込むことができます。驚くべきことに、配列ボタンはテキストを正しく設定しますが、

package wtf; 

    import javax.swing.JButton; 
    import javax.swing.JFrame; 
    import javax.swing.JOptionPane; 

    public class Wtf extends JFrame{ 
     JButton[] ar_btn_vals = new JButton[2]; 
     String[] ar_str_vals = new String[2]; 
     public Wtf(){ 
     super("Title"); 
     setLayout(null); 
     setSize(300, 300); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
     constructor(); 
     actionlisteners(); 
     } 

public void constructor(){ 
    for (int x = 0;x<=1;x++){ 
     ar_btn_vals[x] = new JButton(); 
     ar_btn_vals[x].setText(ar_str_vals[x]); 
     ar_btn_vals[x].setBounds(5,(100 * x)+20, 100,40); 
     ar_btn_vals[x].setVisible(true); 
     add(ar_btn_vals[x]); 
     System.out.println(ar_str_vals[x]); 
    } 

} 

public void actionlisteners(){ 
    for (int x=0;x<=1;x++){ 
     switch (x){ 
     case 0: 
       ar_btn_vals[0].addActionListener(new java.awt.event.ActionListener() { 
        public void actionPerformed(java.awt.event.ActionEvent evt) { 
         ar_btn_vals0ActionPerformed(evt); 
        } 
       }); 
      break; 
      case 1: 
       ar_btn_vals[1].addActionListener(new java.awt.event.ActionListener() { 
        public void actionPerformed(java.awt.event.ActionEvent evt) { 
         ar_btn_vals1ActionPerformed(evt); 
        } 
       }); 
      break; 
     } 
    } 
} 

private void ar_btn_vals0ActionPerformed(java.awt.event.ActionEvent evt) { 
    JFrame frm_val0change = new JFrame(); 
    String newval = JOptionPane.showInputDialog(frm_val0change, "Enter new Button 1 Value"); 
    ar_str_vals[0] = newval; 
    constructor(); 
} 

private void ar_btn_vals1ActionPerformed(java.awt.event.ActionEvent evt) { 
    JFrame frm_val1change = new JFrame(); 
    String newval = JOptionPane.showInputDialog(frm_val1change, "Enter new Button 2 Value"); 
    ar_str_vals[1] = newval; 
    constructor(); 
} 

public static void main(String[] args) { 
    Wtf frame = new Wtf(); 
} 
    } 

私は、これはそれができるほど効率的ではないことを認識してんだけど、私はこれを終了する限られた時間を持っていると私は、これは正常に動作していない理由は絶対にないアイデアを持っていません。

これは私の最初の質問ですので、間違った書式を設定した場合は、慈悲をお寄せください。

+0

コンストラクタをもう一度呼び出すと、ActionListenerのsetTextでボタンのテキストを更新します。 – MadProgrammer

+0

@MadProgrammer問題が修正されました。私はそれが私が怠け者であり、コンストラクタを何度も何度も繰り返し呼び出すことで得られるものだと思います。コンストラクタを呼び出すと、配列に属していないボタンが更新されますが、配列内のボタンは更新できません。 –

+0

さて、それは物事の組み合わせです。あなたは新しいボタンを何度も何度も追加しています(そしてレイアウトマネージャーを離れてしまったので)から、同じ位置に移動します。どのリムーバ、コンポーネントは逆順で描画されますが、そうでない場合は、コンストラクタを再度呼び出すことは悪い考えです。 – MadProgrammer

答えて

0

MadProgrammerが言ったように、私がしなければならなかったのは、コンストラクタを再度呼び出すのではなく、アクションリスナのボタンテキストを更新することだけでした。