Java 通过事件的发生更改类变量
首先,我是java新手。所以我不适合用java编写复杂的程序。 我写了一个小程序,我只是想了解类变量是如何访问和更改的。 我这里有两个问题 1) 发生事件时更改类变量。它不起作用 2) 在发生事件时调用另一个类的方法及其对象也不起作用 以下是我编写代码所遵循的步骤:Java 通过事件的发生更改类变量,java,swing,event-handling,Java,Swing,Event Handling,首先,我是java新手。所以我不适合用java编写复杂的程序。 我写了一个小程序,我只是想了解类变量是如何访问和更改的。 我这里有两个问题 1) 发生事件时更改类变量。它不起作用 2) 在发生事件时调用另一个类的方法及其对象也不起作用 以下是我编写代码所遵循的步骤: import java.awt.*; import java.awt.event.*; import javax.swing.*; class a { String user = ""; public void
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();
}
}
- 我已经创建了一个文本区域
- 我已经创建了一个带有文件菜单和菜单项的菜单栏
- 当有人按下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();
}
}
在文件菜单中,当我选择菜单项时,会调用事件,但
类变量即使在内部更改后也不会更改
处理者
实际上,您没有将侦听器添加到菜单项中,因此它们没有被更改。尝试添加这个
db1.addActionListener(this);
由于您没有添加此项,下面的代码无法运行,因此类变量没有更改
if (choice == db1) {
dbname = "cnadb";
dbpsw = "xxxxxxxx";
dbuser = "sa";
}
使用
keylister
不是一个好主意,尤其是在JTextArea
这样的东西上,按键笔划可能在文本区域到达您之前就被消耗掉了。您应该使用一个,但可能甚至是一个DocumentListener
都会更好,或者只需使用JTextField
并向它注册一个ActionListener
,谢谢。我的第一个问题解决了。你能告诉我我的第二个问题吗?我正在打电话给obj.start(“约翰”)代码>但它不起作用。是的,您已经在textarea中添加了一个按键侦听器,当我按CTRL+ENTER时,它对我来说可以正常工作。。