2

上記の機能を実現しようとしていますが、ほとんど成功していません。2 列と 2 行の GridLayout を使用して、ユーザーにパズルのようなゲームを表示しています。ここでは、contentPane 全体を埋める 4 (200x200 ピクセル) JPanels (3 色、1 デフォルト bgColor) があります。パネルが灰色のパネルの隣にある場合、色付きのパネルをクリックすると評価が解決されます。もしそうなら、彼らは交換する必要があります。私は、それらが交換される最後のステップまですべてのステップを完了しました。コードは次のとおりです。

public class MainClass extends JFrame {
//Generated
private static final long serialVersionUID = 4710628273679698058L;

private SpecialPanel redPanel;
private SpecialPanel greenPanel;
private SpecialPanel yellowPanel;
private SpecialPanel grayPanel;

public MainClass() {
    super("Puzzle");

    initPanels();

    setSize(410, 410);
    setLayout(new GridLayout(2, 2));

    this.add(redPanel);
    this.add(greenPanel);
    this.add(grayPanel);
    this.add(yellowPanel);
}
private void initPanels() {
    redPanel = new SpecialPanel();
    greenPanel = new SpecialPanel();
    yellowPanel = new SpecialPanel();
    grayPanel = new SpecialPanel();

    grayPanel.setGreyPanel(true);

    redPanel.setBackground(Color.RED);
    greenPanel.setBackground(Color.GREEN);
    yellowPanel.setBackground(Color.YELLOW);
    grayPanel.setBackground(this.getBackground());

    redPanel.setSize(200, 200);
    greenPanel.setSize(200, 200);
    yellowPanel.setSize(200, 200);
    grayPanel.setSize(200, 200);

    MouseAdapter ma = new MouseAdapter() {

        @Override
        public void mouseClicked(MouseEvent arg0) {
            super.mouseClicked(arg0);

            SpecialPanel sp = (SpecialPanel) arg0.getComponent();

            if (sp.getIsGray()) {
                //Do nothing
            } else if (checkIfNeighbourToGray(sp, grayPanel)) {
                //Swap them
                System.out.println("Swap notification");
                swap(sp, grayPanel);                
                //Update UI
            } else {
                //Again, do nothing for the clicked panel is diagonal to the gray panel
            }
        }

        private boolean checkIfNeighbourToGray(SpecialPanel sp, SpecialPanel grayPanel) {

            Point startPointSp = sp.getLocation();
            double x = startPointSp.getX();
            double y = startPointSp.getY();

            double width = sp.getWidth();
            double height = sp.getHeight();

            Point grayPoint = grayPanel.getLocation();
            double xG = grayPanel.getX();
            double yG = grayPanel.getY();

            double widthG = grayPanel.getWidth();
            double heightG = grayPanel.getHeight();

            //Gray panel is RIGHT of clicked one
            if (x + width == xG && y + height == yG + heightG) {
                return true;                    
            }
            //Gray panel is LEFT of clicked one
            else if (x - width == xG && y + height == yG + heightG) {
                return true;
            }
            //Gray panel is ABOVE of clicked one
            else if (x == xG && x + width == xG + widthG) {
                return true;
            }
            //Gray panel is UNDER of clicked one
            else if (xG == x && yG + widthG == x + width) {
                return true;
            }

            return false;
        }

        private void swap(SpecialPanel sp, SpecialPanel grayPanel) {
            //Swap logic
        }

    };
    redPanel.addMouseListener(ma);
    greenPanel.addMouseListener(ma);
    yellowPanel.addMouseListener(ma);
    grayPanel.addMouseListener(ma);

}
public static void main(String[] args) {
    MainClass mc = new MainClass();
    mc.setVisible(true);

}

}

クラス SpecialPanel は、最初に false + getter および setter に設定された新しい Boolean プロパティ IsGrayPanel だけで JPanel を拡張しています。注: これは「私は基本的な Swing スキルを持っている」という方法で行われていますが、その間に Java Swing についてさらに学びました。したがって、私の質問は、UI の更新を含め、隣り合っている 2 つのパネルを適切に交換する方法です。

4

2 に答える 2

2
  • をコンテナに移動する必要はありませんJPanels。そうしないと、非常に役に立たないコードの束を使用してJPanels、contianer から 2 を2 つ削除してからindexes、コンテナにレイアウトし直す必要がありますswaping indexes

  • (場合Colorのみ) setBackground(Color.Xxx)2 つの間を交換するだけです。JPanels

  • puzzle-like gameについてですImages、パズルまたはマインスイーパについてです(あなたからは明らかではありません...)

    1. put Imagesas Icon/ImageIconsto JLabelinstead of JPaneland on Mouse Eventsto switch ( setIcon()) with Iconsbetweens 、ローカル変数 JLabelsにロードIcons

    2. (最も簡単な方法)JToggleButton と Iconには、 と同様のロジックがありますJLabelが、表示IconについてsetPressedIcon()

于 2013-07-18T16:40:51.027 に答える