Сопоставить координаты x, y с указателем массива 2d - PullRequest
0 голосов
/ 23 мая 2019

Мне нужно отобразить координаты x, y графического интерфейса Swing на определенную строку / столбец, который он представляет.В зависимости от того, где я нажимаю в каждом «квадрате», будет переключаться либо строка, появляющаяся выше, ниже, влево или вправо.Например, если моя мышь находится в верхней половине квадрата, она может переключать верхнюю, левую или правую линии для отображения.Аналогично для нижней половины, за исключением нижней строки вместо верхней.Чтобы определить, является ли это правой или левой линией, она зависит от того, в какой вертикальной половине квадрата находится мышь.

Reference picture

Поверхэто, если кнопка на верхнем экране взаимодействует, программа должна напечатать «Кнопка нажата».«Кнопка» просто рисуется в виде прямоугольника, и JButton или что-либо еще не используется, поскольку он должен был быть создан с использованием простого прямоугольника и текста.

Код, который у меня сейчас есть, таков: он рисует необходимые шары, а также линию между ними.Например, если щелкнуть мышью в верхней части серой сетки, показанной на изображении выше, она вызовет drawHor horizontalLine с r = 0 и c = 0. Для квадрата, расположенного рядом с ней, и мышь находится ближе всего к верхней линии, она будетвызовите с r = 0 и c = 1. Если бы это была вертикальная линия, например, в самом верхнем левом углу, это было бы r = 0, c = 0 и так далее.R представляет строки, а C представляет столбцы.

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

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

    public class SwingMain extends JPanel implements MouseListener {

        final static int SEPARATION = 125;
        final static int DIAMETER = 15;
        final static int NBALLS = 5;
        final static int WIDTH = (NBALLS) * (SEPARATION + DIAMETER) + (SEPARATION);
        final static int HEIGHT = (NBALLS) * (SEPARATION + DIAMETER) + (SEPARATION);
        final static int XSTART = SEPARATION;
        final static int YSTART = SEPARATION;
        JFrame frame = new JFrame();

        public static void main(String[] args) {
            SwingUtilities.invokeLater(() -> new SwingMain().start());
        }

        public void start() {
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setPreferredSize(new Dimension(WIDTH, HEIGHT));
            frame.add(this);
            setBackground(Color.gray);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;

            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setColor(Color.white);

            int y = YSTART;
            for (int r = 0; r < NBALLS; r++) {
                int x = XSTART;
                for (int c = 0; c < NBALLS; c++) {
                    g2d.fillOval(x, y, DIAMETER, DIAMETER);
                    x += SEPARATION + DIAMETER;;
                }
                y += SEPARATION + DIAMETER;;
            }

            drawHorizontalLine(g2d, 0, 0);
            drawButton(g2d);
        }

        public void drawHorizontalLine(Graphics2D g, int r, int c) {
            int x1 = (SEPARATION) * (c + 1);
            int x2 = x1 + SEPARATION;
            int y1 = (SEPARATION) * (r + 1) + 2;
            int y2 = SEPARATION * (r + 1) + 6;
            drawRectangle(g, x1, y1, x2, y2, Color.WHITE);
        }

        public void drawRectangle(Graphics2D graphic, int x1, int y1, int x2, int y2, Color c) {
            graphic.fillRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2));
        }

        private void drawButton(Graphics2D g) {
            int centerX = WIDTH / 2;
            int x1 = centerX - 100;
            int x2 = centerX + 100;
            int y1 = 25;
            int y2 = 75;
            drawRectangle(g, x1, y1, x2, y2, Color.WHITE);
            FontMetrics fm = g.getFontMetrics();
            g.setColor(Color.gray);
            g.setFont(new Font("TimesRoman", Font.BOLD, 20));
            int strWidth = fm.stringWidth("Completed.");
            int strHeight = fm.getAscent();
            g.drawString("Completed.",
                      (centerX - 20) - strWidth / 2,
                      45 + strHeight);
        }

        public void mousePressed(MouseEvent e) {
            //If the area of the button is clicked
            System.out.println("Button clicked.");
        }
        public void mouseClicked(MouseEvent e) {}
        public void mouseReleased(MouseEvent e) {}
        public void mouseEntered(MouseEvent e) {}
        public void mouseExited(MouseEvent e) {}

    }

1 Ответ

1 голос
/ 25 мая 2019

Еще раз вам нужно решить простую математическую задачу.

В зависимости от того, где я нажимаю в каждом «квадрате», будет переключаться либо строка, появляющаяся выше, ниже, влево или вправо ...

Ну, я не совсем понимаю ваше полное требование, но это не важно, что я понимаю. Потому что это снова сводится к математической формуле. Так что это зависит от вас, чтобы реализовать формулу на основе ваших требований.

Возможно, следующие указатели помогут вам в правильном направлении.

Может быть, вы можете ввести понятие «клетка». В вашем примере у вас есть 5 шаров, поэтому у вас есть 4 квадратные ячейки в каждой строке / столбце.

Теперь мы можем определить размер ячейки (ширина / высота):

int cellSize = DIAMETER + SEPARATION;

Теперь в мышке слушателя нужно определить:

  1. в какой ячейке вы щелкнули
  2. с какой стороны ячейки вы щелкнули (слева или справа)

Итак, если мы начнем со столбца первым (логика для строки будет аналогичной), вы можете сделать что-то вроде:

int columnPoint = event.getX() - SEPARATION; 

if (columnPoint < 0 ) // you clicked in the left margin

int columnCell = columnPoint / cellSize;

If (columnCell > NBALLS) // you clicked in the right margin

int cellPoint = columnPoint % cellSize);

if (cellPoint < cellSize / 2)
    // you clicked on the left half
else
    // you clicked on the right half

Повторите вышеуказанную базовую логику, чтобы определить строку, по которой щелкнули, и щелкнули ли вы сверху / снизу.

Опять же, ни один из кодов не проверен. Это концепция, которую я пытаюсь объяснить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...