Java come dipingere i rettangoli sul mouseclick

Come dice il titolo, ho difficoltà a cercare di disegnare alcuni rettangoli (riempiti) in JApplet. L’objective esatto è quello di avere una tabella 50×50 e quando si fa clic su una cella mirata, per renderla piena (eventualmente fatta disegnando un rettangolo pieno). Ho fatto i calcoli sulle coordinate del punto di partenza, ma per qualche motivo non riesco a disegnare il nuovo rettangolo nel metodo MouseClicked. Eventuali suggerimenti?

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); } 

Questo è un concetto relativamente semplice (senza offesa).

Per cominciare, non mescolare il codice con JApplet e JFrame . Se vuoi usare la tua applicazione in questi due mezzi, separa la logica in un componente separato (come JPanel ) che puoi facilmente aggiungere a entrambi. Non dovresti davvero aggiungere un contenitore di primo livello ad un altro contenitore di primo livello (aggiungendo un’applet ad una cornice) – è disordinato.

Evita di sovrascrivere i metodi paint dei contenitori di livello superiore (come JApplet ), invece, usa un componente personalizzato (come JPanel ) e sostituiscilo con il metodo paintComponent .

Nel tuo esempio, dovresti chiamare super.paint piuttosto che super.paintComponents . paint fa un lavoro importante, non vuoi saltarlo – ma dovresti usare JComponent#paintComponent

MouseListener dovrebbe essere aggiunto ai componenti che ti interessano nella gestione degli eventi del mouse. Poiché il clicked non viene mai aggiunto a nessun contenitore, non riceverà mai gli eventi del mouse.

Dare un’occhiata a

  • Come scrivere gli ascoltatori del mouse
  • Esecuzione di un dipinto personalizzato
  • Grafica 2D
  • Dipingere in AWT e Swing (perché ogni sviluppatore Swing dovrebbe avere una comprensione di questo)

inserisci la descrizione dell'immagine qui

 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); } } } } 

addizionale

Le informazioni da un ciclo di pittura a un altro non vengono mantenute. È necessario ridipingere il componente esattamente come si desidera che appaia. Ciò significa che dovrai mantenere un elenco di punti di clic che possono essere ridipinti in qualsiasi momento.

Inizia leggendo il tutorial Swing su Custom Painting .

La verniciatura personalizzata viene eseguita sovrascrivendo il metodo paintComponent () di JPanel o JComponent (). Quindi aggiungi il pannello a JApplet.

Se vuoi solo dipingere determinati quadrati, avrai bisogno di un elenco per tenere traccia delle celle da dipingere. Quindi, ogni volta che si ridisegna il componente, è necessario scorrere l’Elenco e dipingere le celle.

MouseListener non estendere JApplet. Quando fai clic su una cella, aggiornerai la lista dall’alto per indicare che la cella deve essere dipinta. Quindi invierai repaint () sul pannello in modo che il tuo codice pittura venga richiamato.

Si potrebbe anche voler guardare approcci di verniciatura personalizzati che offre due diversi modi per fare questo tipo di pittura a seconda del tuo esatto requisito.