0

まず、私はJavaが初めてです。そのため、Java で複雑なプログラムを書くのは得意ではありません。私は小さなプログラムを書きましたが、クラス変数がどのようにアクセスされ、変更されるかを理解しようとしています. ここで 2 つの問題があります。

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();
    }
}
4

1 に答える 1

2

ファイルメニューでメニューアイテムを選択するとイベントが呼び出されますが、クラス変数はハンドラー内で変更した後でも変更されません。

メニュー項目にリスナーを追加するのを実際に逃したため、変更されませんでした。これを追加してみてください。

db1.addActionListener(this);

これを追加しなかったため、以下のコードが機能しなかったため、クラス変数は変更されませんでした

if (choice == db1) {
     dbname = "cnadb";
     dbpsw = "xxxxxxxx";
     dbuser = "sa";
}
于 2013-08-14T10:08:07.007 に答える