Java как рисовать прямоугольники на mouseclick

Как говорится в названии, мне трудно нарисовать некоторые прямоугольники (заполненные) в JApplet. Точная цель состоит в том, чтобы иметь таблицу 50×50 и когда вы нажимаете на целевую ячейку, чтобы она была заполнена (возможно, путем рисования заполненного прямоугольника). Я сделал математику о координатах начальной точки, но по какой-то причине я не могу рисовать новый прямоугольник в методе MouseClicked. Какие-либо предложения?

public class Main extends JApplet { public static final int DIMX = 800; public static final int DIMY = 800; public static final int ratio = 16; Graphics g; boolean drawing; public int cX; public int cY; public Main() { JPanel MainFrame = new JPanel(); MainFrame.setPreferredSize(new Dimension(400, 800)); MainFrame.setBackground(Color.LIGHT_GRAY); JPanel Table = new JPanel(); Table.setPreferredSize(new Dimension(800, 800)); Table.setBackground(Color.LIGHT_GRAY); add(MainFrame, BorderLayout.EAST); add(Table, BorderLayout.WEST); addMouseListener(new clicked()); } public void paint(Graphics g) { super.paintComponents(g); g.setColor(Color.black); for (int i = 0; i <= 800; i += 16) { g.drawLine(0, i, 800, i); g.drawLine(i, 0, i, 800); // g.fillRect(cX, cY, 16, 16); } } public static void main(String[] args) { JFrame win = new JFrame("Retarded Bullshit"); win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); win.setPreferredSize(new Dimension(1216, 840)); win.setContentPane(new Main()); win.pack(); win.setVisible(true); } public class clicked extends JApplet implements MouseListener { public int cX; public int cY; Graphics g; @Override public void mouseClicked(MouseEvent e) { // Point a = e.getLocationOnScreen(); int cellX = e.getX(); int cellY = e.getY(); if (cellX  0 && cellY  0) { cX = cellX / 16 + 1; cY = cellY / 16 + 1; JOptionPane.showMessageDialog(null, "" + cX + " " + cY); } 

Это относительно простая концепция (без обид).

Для начала не смешивайте свой код с JApplet и JApplet . Если вы хотите использовать ваше приложение в этих двух средах, отделите логику на отдельный компонент (например, JPanel ), который вы можете легко добавить к нему. Вы действительно не должны добавлять контейнер верхнего уровня в другой контейнер верхнего уровня (добавление апплета в фрейм) – это грязно.

Избегайте переопределения методов paint контейнеров верхнего уровня (например, JApplet ) вместо этого вместо этого используйте собственный компонент (например, JPanel ) и переопределите его метод paintComponent .

В вашем примере вы должны называть super.paint а не super.paintComponents . paint делает важную работу, вы не хотите ее пропускать – но вы должны использовать JComponent#paintComponent

MouseListener должен добавить к компонентам, которые вы заинтересованы в управлении событиями мыши. Поскольку clicked не добавляется ни в какие контейнеры, он никогда не получит события мыши.

Взгляни на

  • Как написать мышь
  • Выполнение пользовательской живописи
  • 2D-графика
  • Картина в AWT и Swing (потому что каждый разработчик Swing должен понимать это)

введите описание изображения здесь

 public class SimplePaint03 { public static void main(String[] args) { new SimplePaint03(); } public SimplePaint03() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception ex) { } JFrame frame = new JFrame("Test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new PaintPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class PaintPane extends JPanel { private List grid; private List fill; public PaintPane() { grid = new ArrayList<>(5); fill = new ArrayList<>(5); addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { for (Shape shape : grid) { if (shape.contains(e.getPoint())) { if (fill.contains(shape)) { fill.remove(shape); } else { fill.add(shape); } } } repaint(); } }); int colWidth = 200 / 50; int rowHeight = 200 / 50; for (int row = 0; row < 50; row++) { for (int col = 0; col < 50; col++) { grid.add(new Rectangle(colWidth * col, rowHeight * row, colWidth, rowHeight)); } } } @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; g2d.setColor(Color.RED); for (Shape cell : fill) { g2d.fill(cell); } g2d.setColor(Color.BLACK); for (Shape cell : grid) { g2d.draw(cell); } } } } 

дополнительный

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

Начните с чтения учебника Swing по пользовательской живописи .

Пользовательская покраска выполняется путем переопределения метода paintComponent () JPanel или JComponent (). Затем вы добавляете панель в JApplet.

Если вы хотите только рисовать определенные квадраты, вам понадобится Список, чтобы отслеживать, какие ячейки нужно рисовать. Затем каждый раз, когда вы перерисовываете компонент, вам нужно пройти через список и нарисовать ячейки.

Ваш MouseListener не расширит JApplet. Когда вы нажимаете на ячейку, вы обновляете список сверху, чтобы указать, что ячейка должна быть нарисована. Затем вы вызываете repaint () на панели так, чтобы ваш код рисования был вызван.

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