2017-03-24 15 views
0

我已經創建了一個按鈕數組,將它們添加到我的框架和(低效)創建的動作偵聽器爲每個他們打開JOptionPane接受輸入並將其添加到字符串數組,但在彈出窗口關閉後,數組按鈕上的文本不會更新,而不是數組的一部分的按鈕會更新其文本。JButton在數組中不會更新文本

字符串數組抓取JOptionPane的罰款數據,它只是不會更新按鈕的標題。

在我的完整程序中,我正在將ar_str_vals寫入一個.xml文件,並且它可以正確地保存和加載數組,並且令人驚訝的是數組按鈕正確設置了它們的文本,但僅在我的程序開始處。

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

好吧,這是一個組合,你只是一遍又一遍地添加新的按鈕(因爲你已經取消了佈局管理器)到相同的位置,所以它歸結爲一個z排序位置,並從什麼卸妝,組件是以相反的順序繪製的,但如果它們不是,再次調用構造函數仍然是一個壞主意 – MadProgrammer

回答

0

正如MadProgrammer所說,我所要做的就是更新動作偵聽器中的按鈕文本,而不是再次調用構造函數。