Мне нужно отобразить координаты x, y графического интерфейса Swing на определенную строку / столбец, который он представляет.В зависимости от того, где я нажимаю в каждом «квадрате», будет переключаться либо строка, появляющаяся выше, ниже, влево или вправо.Например, если моя мышь находится в верхней половине квадрата, она может переключать верхнюю, левую или правую линии для отображения.Аналогично для нижней половины, за исключением нижней строки вместо верхней.Чтобы определить, является ли это правой или левой линией, она зависит от того, в какой вертикальной половине квадрата находится мышь.
Поверхэто, если кнопка на верхнем экране взаимодействует, программа должна напечатать «Кнопка нажата».«Кнопка» просто рисуется в виде прямоугольника, и 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) {}
}