【问题标题】:JButton in array wont update text数组中的 JButton 不会更新文本
【发布时间】:2017-03-24 23:18:02
【问题描述】:

我创建了一个按钮数组,将它们添加到我的框架中,并且(低效地)为每个按钮创建了动作侦听器,这些侦听器打开了一个 JOptionPane 以获取输入并将其添加到字符串数组,但数组上的文本弹出窗口关闭后按钮不会更新,而不属于数组的按钮会很好地更新其文本。

字符串数组很好地从 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();
}
    }

我知道这并没有达到应有的效率,但我完成这项工作的时间有限,而且我完全不知道为什么它不能正常工作。

这也是我第一次提问,如果格式有误,请见谅。

【问题讨论】:

  • 与其再次调用构造函数,不如在 ActionListener 中用 setText 更新按钮文本
  • @MadProgrammer 这解决了我的问题。我想这就是我因为懒惰而一遍又一遍地调用构造函数所得到的。知道为什么调用构造函数会正确更新不属于数组的按钮,但不能更新数组内的按钮吗?
  • 好吧,它是多种事物的组合,您只是一遍又一遍地添加新按钮(并且因为您已经取消了布局管理器)到相同的位置,所以归结为z-ordering 位置,以及从什么移除器开始,组件以相反的顺序绘制,但如果不是,再次调用构造函数仍然是一个坏主意
  • @MadProgrammer 哦,这很有意义......我之前在构造函数中创建动作侦听器时遇到了类似的问题,但我发现了这个问题,我不确定为什么我没有注意到同样的问题问题。感谢您的帮助。

标签: java arrays swing jbutton


【解决方案1】:

正如 MadProgrammer 所说,我所要做的就是更新我的动作监听器中的按钮文本,而不是再次调用构造函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 2020-02-13
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多