Java-свинг, связывающий JPanel со значениями col строк для слушателя мыши - PullRequest
3 голосов
/ 20 января 2012

Я пишу настольную игру с графическим интерфейсом, и в основном у меня есть 10x10 GridLayout JPanel.

Каждая ячейка сетки является квадратной JPanel (я использовал BorderLayout для этих JPanel, чтобы границы были видны).

В любом случае я хочу, чтобы при щелчке по одному из этих квадратов он вносил изменения в boardGameGrid, который является классом, импортированным в графический интерфейс для бэкенда игры. Скажем, я хочу использовать метод

boardGameGrid.setCellCross(x,y)

когда нажата ячейка в позиции (x, y).

Я не могу понять, как это сделать, поскольку каждая JPanel не содержит никакой информации о своей позиции.

спасибо

Ответы [ 5 ]

5 голосов
/ 20 января 2012

Вы должны подготовить этот JPanels как Объект и поместить его на Карту или Список, простой пример, основанный на великолепной, но простой идее

enter image description hereenter image description hereenter image description here

import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import javax.swing.border.LineBorder;
//based on @trashgod code from http://stackoverflow.com/a/7706684/714968
public class FocusingPanel extends JFrame {

    private static final long serialVersionUID = 1L;
    private int elements = 10;
    private List<GridPanel> list = new ArrayList<GridPanel>();
    private final JFrame mainFrame = new JFrame();
    private final JPanel fatherPanel = new JPanel();

    public FocusingPanel() {
        fatherPanel.setLayout(new GridLayout(elements, elements));
        for (int i = 0; i < elements * elements; i++) {
            int row = i / elements;
            int col = i % elements;
            GridPanel gb = new GridPanel(row, col);
            list.add(gb);
            fatherPanel.add(gb);
        }
        mainFrame.setLayout(new BorderLayout(5, 5));
        mainFrame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        mainFrame.add(fatherPanel, BorderLayout.CENTER);
        mainFrame.pack();
        mainFrame.setVisible(true);
    }

    private GridPanel getGridPanel(int r, int c) {
        int index = r * elements + c;
        return list.get(index);
    }

    private class GridPanel extends JPanel {

        private int row;
        private int col;

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(20, 20);
        }

        public GridPanel(int row, int col) {
            this.row = row;
            this.col = col;
            this.setBackground(Color.red);
            this.setBorder(new LineBorder(Color.black,1));
            this.addMouseListener(new MouseListener() {

                @Override
                public void mouseClicked(MouseEvent e) {
                    int r = GridPanel.this.row;
                    int c = GridPanel.this.col;
                    GridPanel gb = FocusingPanel.this.getGridPanel(r, c);
                    System.out.println("r" + r + ",c" + c
                            + " " + (GridPanel.this == gb)
                            + " " + (GridPanel.this.equals(gb)));
                }

                @Override
                public void mousePressed(MouseEvent e) {
                }

                @Override
                public void mouseReleased(MouseEvent e) {
                }

                @Override
                public void mouseEntered(MouseEvent e) {
                    int r = GridPanel.this.row;
                    int c = GridPanel.this.col;
                    GridPanel gb = FocusingPanel.this.getGridPanel(r, c);
                    System.out.println("r" + r + ",c" + c
                            + " " + (GridPanel.this == gb)
                            + " " + (GridPanel.this.equals(gb)));
                    setBackground(Color.blue);

                }

                @Override
                public void mouseExited(MouseEvent e) {
                    setBackground(Color.red);
                }
            });
        }
    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                FocusingPanel focusingPanel = new FocusingPanel();
            }
        });
    }
}
3 голосов
/ 20 января 2012

Почему бы вам просто не сообщить каждой панели о своем положении:

public MyPanel(int x, int y) {
    this.x = x;
    this.y = y;
}

и в прослушивателе мыши:

MyPanel p = (MyPanel) event.getSource();
boardGameGrid.setCellCross(p.getX(), p.getY());

Или вы также можете использовать Map<MyPanel, Point> если вы не хотите изменять MyPanel и сохранять положение каждой панели на этой карте:

MyPanel p = (MyPanel) event.getSource();
Point point = panelPositionMap.get(p);
boardGameGrid.setCellCross(p.x, p.y);
2 голосов
/ 20 января 2012

Каждый JPanel знает о своем местонахождении, которое вы можете получить, используя panel.getX () / getY ().Похоже, что вы просите, это:

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

public class PanelLocation extends JFrame implements MouseListener
{
    private JPanel mainPanel, footerPanel;
    private JPanel[] panel = new JPanel[9];
    private JTextField tfield;

    public PanelLocation()
    {
        mainPanel = new JPanel();
        mainPanel.setLayout(new GridLayout(3, 3));

        for (int i = 0; i < 9; i++)
        {
            panel[i] = new JPanel();
            panel[i].addMouseListener(this);
            panel[i].setBorder(BorderFactory.createLineBorder(Color.BLUE));
            mainPanel.add(panel[i]);
        }   

        footerPanel = new JPanel();

        tfield = new JTextField(10);
        footerPanel.add(tfield);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        add(mainPanel, BorderLayout.CENTER);
        add(footerPanel, BorderLayout.PAGE_END);

        pack();     
        setVisible(true);
    }



     private void getWhichButtonGotPressed(int x, int y)
     {
         if ((x == panel[0].getX()) && (y == panel[0].getY()))
         {
            panel[0].setBackground(Color.MAGENTA);
            tfield.setText("You Clicked Panel : " + panel[0].getToolTipText());
         }
         else if ((x == panel[1].getX()) && (y == panel[1].getY()))
         {
            panel[1].setBackground(Color.YELLOW);
            tfield.setText("You Clicked Panel : " + panel[1].getToolTipText());
         }
         else if ((x == panel[2].getX()) && (y == panel[2].getY()))
         {
            panel[2].setBackground(Color.RED);
            tfield.setText("You Clicked Panel : " + panel[2].getToolTipText());
         }
         else if ((x == panel[3].getX()) && (y == panel[3].getY()))
         {
            panel[3].setBackground(Color.DARK_GRAY);
            tfield.setText("You Clicked Panel : " + panel[3].getToolTipText());
         }
         else if ((x == panel[4].getX()) && (y == panel[4].getY()))
         {
            panel[4].setBackground(Color.ORANGE);
            tfield.setText("You Clicked Panel : " + panel[4].getToolTipText());
         }
         else if ((x == panel[5].getX()) && (y == panel[5].getY()))
         {
            panel[5].setBackground(Color.PINK);
            tfield.setText("You Clicked Panel : " + panel[5].getToolTipText());
         }
         else if ((x == panel[6].getX()) && (y == panel[6].getY()))
         {
            panel[6].setBackground(Color.BLUE);
            tfield.setText("You Clicked Panel : " + panel[6].getToolTipText());
         }
         else if ((x == panel[7].getX()) && (y == panel[7].getY()))
         {
            panel[7].setBackground(Color.CYAN);
            tfield.setText("You Clicked Panel : " + panel[7].getToolTipText());
         }
         else if ((x == panel[8].getX()) && (y == panel[8].getY()))
         {
            panel[8].setBackground(Color.GRAY);
            tfield.setText("You Clicked Panel : " + panel[8].getToolTipText());
         }
    }

    public void mouseClicked(MouseEvent ae)
    {
        JPanel panel = (JPanel) ae.getSource();

        getWhichButtonGotPressed(panel.getX(), panel.getY());
    }

    public void mousePressed(MouseEvent ae)
    {
    }

    public void mouseReleased(MouseEvent ae)
    {
    }

    public void mouseEntered(MouseEvent ae)
    {
    }

    public void mouseExited(MouseEvent ae)
    {
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    new PanelLocation();
                }
            });
    }
}

Пример программы, показывающей координаты панели, на которую нажали.Вы просто щелкаете панель, координаты передаются в функцию, и эта функция проверяет, на какой панели нажата кнопка, и возвращает toopTipText для указанной панели.

Вот вывод программы:

Panel Selection through X, Y Co-ordinates

Надеюсь, это может как-то помочь.

С уважением

2 голосов
/ 20 января 2012

Почему бы вам не сделать это как JTable вместо JPanel, и вы можете добавить слушателя для каждой ячейки. Таким образом, вы будете знать, в какой строке и в каком столбце щелкнули

1 голос
/ 20 января 2012

Вы можете использовать 2d массив для хранения ссылок на ваши панели.

Пример:

JPanel[][] panels = new JPanel[10][10];

//to store a panel:
JPanel p = new JPanel();
panels[x][y] = p;

//then change your method so that it gets the panel at position (x,y) from the array
public void setCellCross(int x, int y){
     JPanel clickedPanel = panels[x][y];
}
...