3

コンピューター サイエンスのクラス用のアプリケーションを開発しています。タスクは電卓を書くことですが、JTextFields またはJTextAreas を使用しません。私は、appletviewer の両方で適切に機能し、Google Chrome (およびおそらく他のブラウザー)ではまったく機能しないKeyListener実装のアイデアを思いつきました。JFrame

これが私のコードスニペットです。

//- BinaryCalc.java
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;

public class BinaryCalc extends JApplet implements KeyListener {

    private JPanel panel;

    public BinaryCalc() {
        super();

        panel = new JPanel();
        this.add(panel);

        panel.addKeyListener(this);
        panel.requestFocusInWindow();
    }

    @Override
    public void init() {
        JOptionPane.showMessageDialog(this, "applet");
        panel.setFocusable(true);
        panel.requestFocus();
    }

    public void keyPressed(KeyEvent e) {
        JOptionPane.showMessageDialog(this, (char) e.getKeyCode());
    }

    public void keyReleased(KeyEvent e) {}

    public void keyTyped(KeyEvent e) {}

    public JPanel getPanel() { return panel; }

    public static void main(String args[]) {
        JFrame frame = new JFrame("Binary Calculator");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setMinimumSize(new Dimension(320, 240));

        BinaryCalc kalkulator = new BinaryCalc();
        frame.add(kalkulator);

        frame.pack();
        frame.setVisible(true);
        kalkulator.getPanel().requestFocusInWindow();
    }

}

そして、私のアプレットを含む HTML ファイル。

<!doctype html>
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <link rel="stylesheet" type="text/css" href="style.css">
    <title>Kalkulator binarny</title>
</head>

<body>
    <div style="text-align: center; border-bottom: 1px solid black">
        <h1>Kalkulator Binarny</h1>
    </div>

    <br/>
    <object style="display: block; margin: auto;" type="application/x-java-applet" width="320" height="240">
    <param name="code" value="BinaryCalc.class" />
    <!--- <param name="archive" value="Liczba.jar" /> -->
        What a terrible failure: applet failed to load!
    </object>   
    <br/>
</body>

</html>

何か案は?

4

2 に答える 2

5

@Davidの便利な例を、ラベルとテンキーを使用するように自由に変換しました。

更新:このハイブリッドはUbuntu / OpenJDKで動作し、 JavaWebStartを介してデプロイできます。

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.event.*;
import javax.swing.*;

/**
 * @see https://stackoverflow.com/a/13363349/230513
 */
public class BinaryCalc extends JApplet {

    private static BinaryCalc bc = new BinaryCalc();
    private JLabel label = new JLabel("0000000000");

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.setTitle("BinaryCalc");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                initContainer(frame);
                frame.pack();
                bc.label.setText("");
                frame.setVisible(true);
            }
        });
    }

    // Common initialization for either JApplet or JFrame
    private static void initContainer(Container container) {
        JPanel panel = new JPanel();
        bc.setKeyBindings(panel);
        panel.add(bc.label);
        container.add(panel, BorderLayout.CENTER);
        panel.requestFocusInWindow();
    }

    @Override
    public void init() {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                initContainer(BinaryCalc.this);
            }
        });
    }

    private void setKeyBindings(final JPanel panel) {
        panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
            .put(KeyStroke.getKeyStroke(KeyEvent.VK_0, 0), "0");
        panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
            .put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD0, 0), "0");
        panel.getActionMap().put("0", new AbstractAction() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                String tmp = label.getText();
                label.setText(tmp + "0");
            }
        });
        panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
            .put(KeyStroke.getKeyStroke(KeyEvent.VK_1, 0), "1");
        panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
            .put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD1, 0), "1");
        panel.getActionMap().put("1", new AbstractAction() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                String tmp = label.getText();
                label.setText(tmp + "1");
            }
        });
    }
}
于 2012-11-13T18:17:32.347 に答える
5
  • 使用するKeyBindingsかしないかKeyListener

  • アプレット インスタンスの単純な呼び出しJFrame用に独自のものを作成して、そこにすべてのコンポーネントを追加しないでください。JAppletgetContentPane()

  • すべてのコンポーネントは、ブロックにラップされたJAppletオーバーライドされたメソッドで作成する必要がありますinit()SwingUtilities#invokeAndWait(..)

  • JApplets およびApplets にはメソッドがありませんmain(..)(テスト目的以外)

  • requestFocusInWindow()の代わりに使用requestFocus()

読むことを強くお勧めします:

これが私にとってうまくいく例です。に編集不可を追加してJTextFieldから、JPanelと に を追加するだけです。ユーザーが0または1を入力すると、 un-edtiable で表示されます。KeyBindingKeyEvent.VK_0KeyEvent.VK_1JPanelJTextField

ここに画像の説明を入力

import java.awt.BorderLayout;
import java.awt.event.*;
import java.lang.reflect.InvocationTargetException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;

public class BinaryCalc extends JApplet {

    private JTextField jtf;

    @Override
    public void init() {
        try {
            SwingUtilities.invokeAndWait(new Runnable() {
                @Override
                public void run() {

                    JPanel panel = new JPanel();
                    setKeyBindings(panel);
                    jtf = new JTextField(10);
                    //so we cant edited it without pressing a key
                    jtf.setEditable(false);

                    panel.add(jtf);
                    getContentPane().add(panel, BorderLayout.CENTER);
                    panel.requestFocusInWindow();//incase we lost focus
                }
            });
        } catch (InterruptedException ex) {
            Logger.getLogger(BinaryCalc.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvocationTargetException ex) {
            Logger.getLogger(BinaryCalc.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private void setKeyBindings(final JPanel panel) {
        panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_0,0), "0");
        panel.getActionMap().put("0", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                String tmp = jtf.getText();
                jtf.setText(tmp + "0");
            }
        });
        panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_1,0), "1");
        panel.getActionMap().put("1", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                String tmp = jtf.getText();
                jtf.setText(tmp + "1");
            }
        });
    }
}
于 2012-11-13T15:16:02.850 に答える