Во-первых, я новичок в java. Поэтому я недостаточно хорош для написания сложных программ в Java. Я написал небольшую программу, и я просто пытаюсь понять, как переменные класса доступны и изменены. У меня здесь две проблемы.Изменение переменной класса по событию
1) изменение переменной класса при возникновении события. не работает.
2) вызов метода другого класса с его объектом при возникновении события также не работает.
Ниже приведены шаги, я затем для написания кода:
- я создал текстовую область.
- Я создал меню с файловым меню и элементом меню.
- Мне удалось обработать событие, когда кто-либо нажимает CTRL + ENTER.
- Теперь внутри этого обработчика я хочу вызвать функцию, которая находится вне класса и внутри другого. Но у меня есть объект этого класса. Но это не работает.
- В filemenu, когда я выбираю меню, событие вызывается, но переменные класса класса не изменяются даже после их изменения внутри обработчика.
ниже код:
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();
}
}
Использование 'KeyListener' не является хорошей идеей, особенно на что-то вроде 'JTextArea', ключевой штрих может быть потреблен до того, как он достигнет вас текстовой областью. Вы должны использовать [Key Bindings] (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html), но, возможно, даже 'DocumentListener' будет лучше или просто использовать' JTextField 'и зарегистрировать' ActionListener' к нему ... – MadProgrammer