【问题标题】:Modification of variables/other swing objects on button click单击按钮时修改变量/其他摆动对象
【发布时间】:2011-09-22 07:46:35
【问题描述】:

好的,所以基本上我正在努力使用 Java Swing JButtons 执行一些操作。我有一种感觉,我的问题对于熟练的程序员来说很容易,因为我的“基本”问题如此简单:

我想做的是修改其他 JComponent 的内容,并可能在按钮单击时修改一些变量。这似乎相对容易,但我想在“已经声明”的变量(或已经创建的 JComponents)上执行它

无论我在哪里搜索,我总是会得到一些例子,其中所有内容都是在与特定 JButton 相关的 ActionPerformed 函数的实现中从头开始声明的,就像这里一样:

http://zetcode.com/tutorials/javaswingtutorial/swingevents/ //在上面你可以观察到在“actionPerformed”函数中他们定义了新的变量,例如:string/date/locale/stringbuffer

这样的解决方案无论如何都不能满足我的需求。我想使用属于不同类的函数来修改/显示先前由于用户单击而定义的变量。

好的,如果我向您展示我想在示例性源代码上做什么,可能会更清楚:

class Number_String {

    public String change_add_MOD (String sss){        
        String str_modified = sss + "_modified";        
        return str_modified;
    }
    public int change_plus1 (int z){        
        int z_modified = z + 1;
        return z_modified;
    }
    public static void main(String[] args) {
        // TODO code application logic here
    }
}

public class probTESTswing extends javax.swing.JFrame {

    public probTESTswing() {
        initComponents();
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        jLabel1.setText("done");         
        jLabel2.setText(mystring2);        
        jLabel3.setText(ns.change_add_MOD(mystring3));
    }

    public static void main(String args[]) {        

        Number_String ns=null;
        String first_str="myFIRSTstring";        
        String mystring2 = ns.change_add_MOD(first_str);
        String mystring3 = "third_str";

        probTESTswing testing= new probTESTswing();
        testing.setVisible(true);
    }
}

向所有努力到达这里的人致敬;)

所以让我简单解释一下:

主类是“swing gui”,在 main() 函数中,我使用第二类初始化一些变量,现在我想用我的 Number_String 类显示“处理”这些变量的结果,但是 Java 拒绝配合我的编程您可能已经注意到,技能缺乏一些基础知识。

您可以观察到我想以两种方式执行“它”:在 jButton1ActionPerformed 内部,我想从我的 Number_String 类访问函数(使用“mystring3”),以及我想要的另一种方式访问刚刚定义的变量(mystring2)

非常感谢任何帮助。

  • 我应该“重载”jButton1ActionPerformed 函数(以便将变量作为参数)吗? (是的,我知道它是私有的 -> 我用 Netbeans Swing 设计师创建了它) ——我应该手动设计我的 GUI,然后重载它们吗? (不知道这种超载是否可能)

  • 或者我应该为我想使用我的 Jbutton 修改的变量定义一些“缓冲区”(整数字段和字符串字段),然后将它们放在“probTESTswing”类中? (+ 编写适当的函数来处理其他类,以便我使用它的函数?)

  • 或者可能(因为我的 Number_String 没有任何变量 - 只是函数)将这些函数移动到 GUI 类 (probTESTswing)

  • 或者也许我应该使用一些指针/引用? (是的,这似乎是我在这里需要的,不幸的是指针/引用是我一无所知的东西:(,但是我想学习很多,因为我现在发现它似乎是强制性的——很难找到教程,因为据我所知没有指针,而且我不知道如何以这种方式使用引用以便实现所需的功能 - 正如您从我的问题中看到的那样)

  • 或者也许有完全不同的方法来处理这些问题/案例?

请启发我,我想以良好的编程方式“有效地”解决我的问题,以便学习高效、最佳、适当和快速的解决方案,但我迫切需要帮助,因此非常感谢任何建议。

问候

【问题讨论】:

标签: java swing button click


【解决方案1】:

一种方法是使用Model–View–Controller 模式将数据模型与视图分离,讨论过here

附录:更简单地说,你可能只需要给类ProbTestSwing一个合适的成员变量:

private Number_String ns = new Number_String();

【讨论】:

  • 注意ProbTestSwing中的大小写变化;类名通常使用首字母大写。
  • 是的,很好,谢谢,只是为了启发他人:在 Actonperformed 中,我使用了 this.ns = /*... 合适的代码 */ 以便进一步处理它
【解决方案2】:

JButtons 和几乎所有的 Swing 组件一样,有很多叫做“ActionListeners”的东西。这些 ActionListener 是实现一个名为... ActionListener 的接口的类!他们有一个名为 actionPerformed 的方法。每次单击按钮时,他都会告诉他的每个 ActionListener 调用它们的 actionPerformed 函数。所以,你给你的按钮一个 ActionListener,然后让它的 actionPerformed 方法做你想要的所有改变。

就像每次你的门铃响起时,你(作为 JButton)都会打电话给所有那些认为没有人来看你的绝望的亲戚。事实上,他们告诉你,每次门铃响起他们都会付钱给你。所以门铃响了(点击按钮),你(JButton)打电话给你的亲戚(ActionListeners),然后他们每个人都付钱给你(actionPerformed方法)。

代码示例:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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


public class Test implements ActionListener{
    int count = 0;
    public static void main(String[] args){
        JFrame frame = new JFrame();
        JButton button = new JButton();

        button.addActionListener(new Test());
        button.setText("I have been clicked 0 times");

        frame.setSize(200, 50);
        frame.add(button);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        JButton button = (JButton) (arg0.getSource());
        count++;
        button.setText("I have been clicked "+count+" times");
    }


}

【讨论】:

    猜你喜欢
    • 2012-06-02
    • 2020-06-14
    • 2016-09-18
    • 2022-11-30
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多