2

JPanel クラス内に KeyAdapter クラスを作成し、System.out.println(String par1); を使用してクリックのデバッグを試みました。

しかし、それはうまくいかないようです...

クラスは次のとおりです。

package net.ryanshah;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class Menu extends JPanel
{
private GameFrame gf;

private Image bg = new ImageIcon("res/bg.png").getImage();

public Menu(final GameFrame parent) {
    this.gf = parent;
    int width = parent.getWidth();
    int height = parent.getHeight();

    setFocusable(true);

    addKeyListener(new MenuOperator());

    setBackground(Color.black);

    setLayout(null);
}

protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    Graphics2D g2d = (Graphics2D)g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

    int w = getWidth();
    int h = getHeight();
    g2d.drawImage(bg, 0, 0, null);
}

public class MenuOperator extends KeyAdapter {
    @Override
    public void keyPressed(KeyEvent event) {
        int keyCode = event.getKeyCode();
        if(keyCode == KeyEvent.VK_SPACE) {
            System.out.println("LOL");
        }
    }
}
}

問題が何であるかを知っている人はいますか?フレームにキーハンドラーを設定し、フレームをフォーカス可能に設定しました..

前もって感謝します

〜RyanS.

4

2 に答える 2

2

コードで正しくないと見なされるもの(IMHO):

  • コード内の画像にアクセスする方法。何か問題が発生した場合に前者が通知するため、のコンストラクターを使用するよりもImageIOを検討してください。ImageIcon詳細については、画像アイコンの例外の読み込みを参照してください。
  • KeyListeners一方、AWTKeyBindings使用します。Swing
  • 前に、任意の背景を設定すると、最初に前述のプロパティを にJComponent設定することが優先されます。したがって、プロパティは通常、使用に依存します。opaqueJComponenttrueopaqueLookAndFeel
  • 、の使用は setLayout(null)できるだけ避けてください。詳細については、絶対配置の最初の段落を参照してください :-)
  • ImageObserverコメントですでに述べたようにの使用。

@camickr によるこのブログMotion Using the KeyboardKeyListenersは、なぜより良いオプションと見なされず、なぜKeyBindingsそのようなニーズにより適しているのかについて、あなたの知識に負荷を追加します :-)

この例を見てください:

import java.awt.*;
import java.awt.event.*;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;

public class TestMenu extends JPanel {

    private Image bg;

    public TestMenu() {
        try {
            bg = ImageIO.read(
                    new URL("http://i.imgur.com/Aoluk8n.gif"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        getInputMap().put(KeyStroke.getKeyStroke("SPACE"), "SPACE key");
        getActionMap().put("SPACE key", keyAction);
        setOpaque(true);
        setBackground(Color.black);
    }

    private Action keyAction = new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            System.out.println("LOL");
        }
    };

    /*
     * Make this a customary habbit to override
     * this method for the JPanel/JComponent,
     * when ever you extend any of the above classes
     */
    @Override
    public Dimension getPreferredSize() {
        return (new Dimension(200, 200));
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D)g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                            RenderingHints.VALUE_ANTIALIAS_ON);
        int w = getWidth();
        int h = getHeight();
        /*
         * Here the last part of the drawImage is the 
         * ImageObserver, here it is a good practise
         * to keep the instance of the JPanel on which
         * we drawing the image to be notified, till the
         * end, till the image loading is not complete
         */
        g2d.drawImage(bg, 0, 0, this);
    }

    private void displayGUI() {
        JFrame frame = new JFrame("Painting Example");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        frame.setContentPane(this);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                new TestMenu().displayGUI();
            }
        };
        EventQueue.invokeLater(runnable);
    }
}
于 2013-08-30T17:10:13.730 に答える