0

C# から Java に押された void キーを変換するための sulotion を見つけようとしていますが、まだ誰も sulotion を成功させていませんか?

キー 13(enter) を押すと、Private void doen() が 1 回アクティブになります。

import java.awt.event.*;
import javax.swing.JTextField;
import javax.swing.*;
import java.awt.*;
import java.awt.Toolkit;
import java.util.Timer;
import java.util.TimerTask;

public class Paneel extends JPanel {

    private static final long serialVersionUID = 1L;
    String text;
    String AccountName = "default";
    String autosavecheck = "";
    String iss;
    JProgressBar monsterbar, progressbar;
    JButton sendknop, clearknop, creditsknop, saveknop, loadknop, restartknop,
            disableautosaveknop;
    JTextArea commandstextbox, dialoogtextbox;
    JTextField naamtextbox, invoertextbox;
    JOptionPane resetdialog;
    Toolkit toolkit;
    Timer timer;

    public Paneel() {

        setLayout(null);
// --------------------------------
        dialoogtextbox = new JTextArea();
        dialoogtextbox.setFont(new Font("sansserif", Font.BOLD, 12));
        dialoogtextbox.setBounds(12, 12, 838, 207);
        dialoogtextbox.list();

        invoertextbox = new JTextField(12);
        invoertextbox.setBounds(12, 330, 982, 20);
        invoertextbox.setEnabled(false);
        commandstextbox = new JTextArea();
        commandstextbox.setBounds(856, 28, 138, 191);
        naamtextbox = new JTextField(12);
        naamtextbox.setBounds(772, 263, 220, 20);

        toolkit = Toolkit.getDefaultToolkit();
        timer1 = new Timer();
        toolkit = Toolkit.getDefaultToolkit();
        autosave = new Timer();
        toolkit = Toolkit.getDefaultToolkit();
        monstertimer = new Timer();
        toolkit = Toolkit.getDefaultToolkit();
        autodisabletimer = new Timer();

        sendknop = new JButton("Send");
        sendknop.setBounds(12, 260, 75, 23);
        sendknop.addActionListener(new sendknopHandler());

        add(sendknop);
    }

    private void keypressed() {
        if (e.KeyChar == (char) Keys.Return) {
            doen();
        }
    }

    private void doen() {
        text = invoertextbox.getText();
        invoertextbox.setText("");
    }
}
4

7 に答える 7

2

できる限り、試すことができるアプローチはいくつかあります。監視に関心のあるコンポーネントを具体的に指定しなかったため、いくつかの異なる提案を行いました...

次の例では、キー バインディングと のデフォルト ボタンを示していますRootPane

残念ながら、JTextAreaはルート ペインに通知される前に Enter キーを消費します。つまり、ルート ペインは起動しません。これは、Enter キー アクションに応答するテキスト フィールドの一般的な問題です。

直面するもう 1 つの問題は、JtextFieldのエンター キーのデフォルトの動作を上書きしたという事実です。つまり、新しい行が挿入されなくなります。

public class TestPane extends JPanel {

    private JTextArea textArea;
    private JButton doneButton;

    public TestPane() {

        textArea = new JTextArea(10, 50);
        doneButton = new JButton("Done");

        setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 1;
        gbc.weighty = 1;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.insets = new Insets(4, 4, 4, 4);

        add(new JScrollPane(textArea), gbc);

        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.insets = new Insets(4, 4, 4, 4);

        add(doneButton, gbc);

        InputMap inputMap = textArea.getInputMap(JComponent.WHEN_FOCUSED);
        ActionMap actionMap = textArea.getActionMap();

        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "enter");
        actionMap.put("enter", new AbstractAction() {

            @Override
            public void actionPerformed(ActionEvent e) {

                System.out.println("I'm done here");

            }
        });

        doneButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("All the way out...");
            }
        });

    }

    @Override
    public void addNotify() {

        super.addNotify();

        // This is the button that will be activate by "default", depending on
        // what that means for the individual platforms...
        SwingUtilities.getRootPane(this).setDefaultButton(doneButton);

    }

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {

                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception exp) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setSize(400, 400);
                frame.setLocationRelativeTo(null);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.setVisible(true);

            }
        });

    }

}
于 2012-09-24T09:21:26.517 に答える
2

aJButtonが押されたらメソッドを呼び出したい場合は、 に an を追加しActionListener、次のようJButtonに内からメソッドを呼び出す必要があります。actionPerformed(ActionEvent ae)

jBtn.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("called");
        //call method here
    }
    });

または、キーが押されたときにメソッドを呼び出したい場合は、代わりにKeyBindingsJPanelを使用します。KeyListener

JPanel panel=...;
...    

panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0), "send");
panel.getActionMap().put("send", new MyAction());

...

class MyAction extends AbstractAction {
@Override
public void actionPerformed(ActionEvent e) {
    System.out.println("called");
    //call method here
}

}
于 2012-09-24T08:49:03.933 に答える
1

a)コード行の後にpublic Paneel() {欠落 している、同じ問題があり、}add(sendknop);public class Paneel extends JPanel {

b) このコードとこの形式では、コードが実行可能ではないため、イベントをリッスンすることはありません。質問は Java Basic に関するものであり、Swing GUI に関するものでも、リスナーに関するものでもありません。

c) キーをリッスンするには、 ActionListenerJButtonENTERに追加する必要があります

d) forの代わりにSwing TimerSwing GUIを使用する必要があります。そうしないと、Swingの同時実行性に問題があります。util.Timer

e) Swing GUI が KeyListener を使用しない場合、KeyBindingがあり、 Swing アクションへの出力があります。

f) そうでSwing JComponentsなけれFocus in the WindowKeyListener

于 2012-09-24T08:38:19.760 に答える
1

最初に: 適切な書式設定を行います。コード スニペットの挿入手順を参照してください。それを読んでいる私たちを助けます:)

ここで何を尋ねているのか完全にはわかりませんが、ユーザーがボタンをクリックしたときにプログラムに応答させようとしていると思います。これは、ボタンに必要なさまざまな ActionListeners で行われます。たとえば、あなたの場合、 sendknopHandler には、ユーザーがこの特定のボタンを押したときに何が起こるかを処理するロジックが含まれている必要があります。このクラス内では、アクションのソース (つまり、ボタンが押された)、アクションの内容、および応答方法をフィルター処理する必要があります。

于 2012-09-24T08:19:02.610 に答える
1

リスナーのすべてと、より具体的な主要なリスナーについて学ぶ

于 2012-09-24T08:19:47.930 に答える
1

「キー 13」はボタンですか、それともユーザーが「13」と入力したときですか?

ボタンの場合は、そのまま使用します

button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
                           your statements;
                    }
}

それ以外の場合は、Peter が応答したキー リスナーを使用します。

于 2012-09-24T08:36:29.737 に答える
0

invoertextboxコードの初期化部分に次の行を追加して、キー リスナーを追加します。

invoertextbox.addKeyListener(this);

KeyListener次に、以下を追加してクラスを拡張し、インターフェースを実装します。

import java.awt.event.KeyListener;

public class Paneel extends JPanel implements KeyListener {

そして、Paneelクラス内にインターフェースの次のメソッドを実装します。

@Override
public void keyTyped(KeyEvent e) {
}

@Override
public void keyPressed(KeyEvent e) {
  if (e.getKeyCode()==KeyEvent.VK_ENTER) {
    doen();
  }
}

@Override
public void keyReleased(KeyEvent e) {
}

private void doen() {
  text = invoertextbox.getText();
  invoertextbox.setText("");
}

keyTyped(KeyEvent)の代わりに使用することを検討してくださいkeyPressed(KeyEvent)

「キー入力」イベントは高レベルであり、通常はプラットフォームやキーボード レイアウトに依存しません。これらは Unicode 文字が入力されたときに生成され、文字入力を調べるための推奨される方法です。最も単純なケースでは、キー型イベントは 1 回のキー押下 (例: 'a') によって生成されます […] ( KeyEvent の JavaDoc )

于 2012-09-24T08:45:58.160 に答える