2013-08-14 4 views
0

Во-первых, я новичок в 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(); 
    } 
} 
+1

Использование 'KeyListener' не является хорошей идеей, особенно на что-то вроде 'JTextArea', ключевой штрих может быть потреблен до того, как он достигнет вас текстовой областью. Вы должны использовать [Key Bindings] (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html), но, возможно, даже 'DocumentListener' будет лучше или просто использовать' JTextField 'и зарегистрировать' ActionListener' к нему ... – MadProgrammer

ответ

2

В FileMenu когда я выбираю Teh MENUITEM событие вызывается, но Teh переменные класса не изменяются даже после изменения их внутри обработчика.

Вы действительно пропустили добавление слушателя к вашему меню, чтобы они не были изменены. Попробуйте добавить это.

db1.addActionListener(this); 

Как вы не добавить свой код, приведенный ниже, не работает так, переменные класса не были изменены

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

спасибо. Моя первая проблема решена. Не могли бы вы также рассказать мне о моей второй проблеме. Я вызываю 'obj.start (« john »);' но это не работает. – Vijay

+0

Да, вы добавили прослушиватель клавиш в textarea, и когда я нажимаю CTRL + ENTER, он отлично работает для меня .. – Vinay