Ciao ,
Ho trovato il tuo codice ben più ordinato e comprensibile rispetto a molti altri esempi sparsi per internet
Se ho capito bene, aggiungi ogni oggetto di tipo
CircleElement ad una lista di tipo
CircleElements
per poi ridisegnare tutti gli oggetti contenuti nella lista appena dopo.
I valori delle coordinate
x e
y sono definiti come attributi della classe CircleElement e vengono aggiornati
dal metodo addRandomCircle, dove come detto prima crei ad ogni chiamata (button event) il nuovo oggetto di tipo CircleElement e chiami il metodo
del JPanel (
multiCirclesPaintPanel) ovvero
addCircleElement che ha il compito di aggiornare la lista e ridisegnare
tutti gli oggetti circle.
Sulla base di questo sto aggiornando il tuo MultiCirclesPaintFrame per i miei scopi con una piccola differenza.
Io non devo creare coordinate x,y random ma tenerne traccia e aggiungere ad esse un offset ogni qualvolta sia necessario , ovvero quando
premo i tasti freccia.Devo poter creare un quadretto o circle uno vicino all'altro ma con direzione dipendente dal tasto della freccia ( destra ,sinistra,sopra ,sotto).
Quindi ho dichiaro
x, y ancora una volta "global" oppure pensavo di fare all'interno di addRandomCircle (execCommands() nel mio caso) il get dell'ultimo oggetto
CircleElement ad esempio getX() e getY() e poi sommare ad esse un valore ancora da decidere , quindi
chiamare il JPanel come hai fatto tu
cosa ne pensi ?
nota:
Mi sono imbattuto nelle
anonymous inner classes che non conoscevo. Ho cercato di riutilizzare lo stesso principio per creare l'event listener
I metodi in ovveride vuoti sono stati creati automaticamente da netBeans.
Ho capito che hai passato una classe come un argomento , ma non ho capito perchè, devo leggermi anche questo
package wroom;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
/**
*
* @author l'originale di Andrea Binello ("andbin") si trova qui https://github.com/andbin/java-examples
* modificato da cyrano per scopi didattici
*/
public class RoomPaintFrame extends JFrame {
private RoomPaintPanel RoomPaintPanel;
private JPanel controlPanel;
private JPanel commandPanel;
private JButton northButton;
private JButton southButton;
private JTextField commands;
private byte commandsWidthField = 20;
public RoomPaintFrame() {
super("Wroom - Java Exercise");
RoomPaintPanel = new RoomPaintPanel();
controlPanel = new JPanel();
commandPanel = new JPanel();
northButton = new JButton("Look At North");
southButton = new JButton("Look At South");
commands = new JTextField(commandsWidthField);
RoomPaintPanel.setOpaque(true);
RoomPaintPanel.setBackground(Color.WHITE);
controlPanel.setFocusable(true);
controlPanel.requestFocus();
RoomPaintPanel.addMouseListener(new MouseListener() {
@Override
public void mousePressed(MouseEvent e) {
RoomPaintPanel.setFocusable(true);
RoomPaintPanel.requestFocus();
}
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
@Override
public void mouseClicked(MouseEvent e) {
}
});
commands.setText("commands> ");
controlPanel.setLayout(new BoxLayout(controlPanel,BoxLayout.LINE_AXIS));
controlPanel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
controlPanel.add(Box.createHorizontalStrut(10));
controlPanel.add(northButton);
controlPanel.add(southButton);
commandPanel.add(commands);
// Setups the KeyListener for the JtextField using anonymous inner classes.
RoomPaintPanel.addKeyListener(new KeyListener() {
@Override
public void keyPressed(KeyEvent keyEvent) {
execCommands(keyEvent);
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {}
});
add(RoomPaintPanel,BorderLayout.CENTER);
add(controlPanel,BorderLayout.NORTH);
add(commandPanel,BorderLayout.SOUTH);
// Setups the frame.
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setSize(400, 300);
setLocationRelativeTo(null); // Centers the frame on the screen.
}
private void execCommands(KeyEvent e) {
// crea un nuovo oggetto
// legge gli attributi x e y dell'oggetto precedente
// somma un offeset verticale o orrizontale dipendente dal tipo di freccia premuto
// chiama il metodo di RoomPaintPanel per aggiornare la lista e ridisegnare tutto.
}