1

私は自分のJavaクラスのプロジェクトに取り組み始めました-LAN五目並べ/5連続。ゲームボードは、ボタン(JButton)で満たされた2次元配列で表されます。イベントハンドラー(クラスclickHandler)を使用して、クリックしたボタン(clickHandlerオブジェクトのパラメーター)に楕円を描画します。私の次のコードはうまくいきませんでした(変数gのnull値を取り除く方法がわかりません)...アドバイスをいただければ幸いです。大いに感謝する。

    class clickHandler implements ActionListener {

        JButton button;
        Dimension size;
        Graphics g;

        public clickHandler(JButton button) {
            this.button = button;
            this.size = this.button.getPreferredSize();
        }

        @Override
        public void actionPerformed(ActionEvent ae) {
                this.g.setColor(Color.BLUE);
                this.g.fillOval(this.button.getHorizontalAlignment(), this.button.getVerticalAlignment(), this.size.width, this.size.height);

                this.button.paint(this.g);
                this.button.setEnabled(false);
        }
    }

(GUIを作成するクラス-ボタンでいっぱいのゲームボード-各ボタンに新しいアクションリスナー-clickHandlerのインスタンスを割り当てます)このように:

    gButton.addActionListener(new clickHandler(gButton));
4

1 に答える 1

4

必ず:

  • JButtonクラスを拡張し、paintComponent(Graphics g)メソッドをオーバーライドします。
  • オーバーライドgetPreferredSize()メソッドを実行します。これは、Dimensionオブジェクトに戻り、適切なサイズを1つ指定することで、Layout Managerに配置するJButtonのに役立ちます。Container/Component

  • そこでサークルコードを作成します。

  • onClickListenerを追加し、クリックされたボタンがクリックされた場合はフラグを設定し、それを呼び出して再描画します。


Graphicsオブジェクトについて:paintComponentメソッドに保持し、そこでのみ使用するのが最善です。それは常に塗り直しで渡されます、そしてあなたが他の瞬間のためにそれを保存するならば、奇妙なことが起こるかもしれません(幸せな実験:))。

小さな例:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ButtonExample
{
    private MyButton customButton;

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

        customButton = new MyButton();
        customButton.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                MyButton.isClicked = true;
                customButton.repaint();
            }
        });

        frame.getContentPane().add(customButton, BorderLayout.CENTER);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new ButtonExample().displayGUI();
            }
        });
    }
}

class MyButton extends JButton
{
    public static boolean isClicked = false;

    public Dimension getPreferredSize()
    {
        return (new Dimension(100, 40));
    }

    public void paintComponent(Graphics g)
    {
        if (!isClicked)
            super.paintComponent(g);
        else
        {
             g.setColor(Color.BLUE);
             g.fillOval(getHorizontalAlignment(), getVerticalAlignment(), getWidth(), getHeight());
        }       
    }
}
于 2012-05-25T22:37:49.763 に答える