java - 通过事件的发生来更改类变量

标签 java swing event-handling

首先我是java新手。所以我不太擅长用java编写复杂的程序。 我编写了一个小程序,我只是想了解如何访问和更改类变量。 我这里有两个问题。

1)当事件发生时改变类变量。不工作。

2)当事件发生时,用其对象调用另一个类的方法也不起作用。

以下是我编写代码所遵循的步骤:

  • 我创建了一个文本区域。
  • 我创建了一个带有文件菜单和菜单项的菜单栏。
  • 当有人按 CTRL+ENTER 时,我能够处理该事件。
  • 现在在该处理程序中我想调用外部的函数 类和另一个类中。但我有该类的对象。但 这是行不通的。
  • 在文件菜单中,当我选择菜单项时,事件会被调用,但是 即使在内部更改后,类变量也不会更改 处理程序。

下面是代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class a {

    String user = "";

    public void start(String us) {
        user = us;
        System.out.println("user is:" + user);
    }
}

public class test extends JFrame implements ActionListener {

    private JTextArea ta;
    private int count;
    private JMenuBar menuBar;
    private JMenu fileM, editM, viewM;
    private JScrollPane scpane;
    private JMenuItem exitI, cutI, copyI, pasteI, selectI, saveI, loadI, 
            statusI, db1, db2, db3, db4;
    private String pad;
    private JToolBar toolBar;
    private a obj;
    public static String dbname, dbpsw, dbuser, dbconn;

    public test() {
        super("SybaseUI");
        obj = new a();
        obj.start("from constructor");
        setSize(600, 600);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container pane = getContentPane();
        pane.setLayout(new BorderLayout());
        ta = new JTextArea(); //textarea
        menuBar = new JMenuBar(); //menubar
        fileM = new JMenu("File"); //file menu
        scpane = new JScrollPane(ta); //scrollpane  and add textarea to scrollpane
        exitI = new JMenuItem("Exit");
        db1 = new JMenuItem("CNA");
        ta.setLineWrap(true);
        ta.setWrapStyleWord(true);
        setJMenuBar(menuBar);
        menuBar.add(fileM);
        fileM.add(db1);
        pane.add(scpane, BorderLayout.CENTER);
        exitI.addActionListener(this);
        setVisible(true);
        ta.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent ke) {
                int code = ke.getKeyCode();
                int modifiers = ke.getModifiers();
                if (code == KeyEvent.VK_ENTER && modifiers == KeyEvent.CTRL_MASK) {
                    dbconn = dbuser + " " + dbpsw + " " + dbname;
                    System.out.println("dbconn is:" + dbconn);
                    obj.start("john");
                }
            }
        });
    }

    public void actionPerformed(ActionEvent e) {
        JMenuItem choice = (JMenuItem) e.getSource();
        if (choice == db1) {
            dbname = "cnadb";
            dbpsw = "xxxxxxx";
            dbuser = "sa";
        }
    }

    public static void main(String[] args) {
        new test();
    }
}

最佳答案

In the filemenu when i select teh menuitem the event gets called but teh class variables are not changed even after changing them inside the handler.

您实际上错过了向菜单项添加监听器,因此它们没有更改。尝试添加这个。

db1.addActionListener(this);

由于您没有添加此内容,因此下面的代码不起作用,因此类变量没有更改

if (choice == db1) {
     dbname = "cnadb";
     dbpsw = "xxxxxxxx";
     dbuser = "sa";
}

关于java - 通过事件的发生来更改类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18228634/

相关文章:

java - 事务回滚后从文件系统中删除文件

java - 使用Rxjava作为EventBus时如何从事件中获取参数

java - 在 Java 中的另一个构建器中使用构建器

java - 从 String 获取时间

Java Swing : how to reflect changes made to xml file immediately to visual tree?

event-handling - 领域事件 v 事件聚合 v... 其他

java.lang.IllegalArgumentException : Username must not be null or empty , AbstractXMPPConnection.java:484

java - 将数据从左上角单元格移动到第一列的每一行

java - GUI 元素的处理

Javascript 获取事件处理程序不起作用