-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDealershipGUI.java
More file actions
305 lines (253 loc) · 13.5 KB
/
Copy pathDealershipGUI.java
File metadata and controls
305 lines (253 loc) · 13.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
import javax.swing.*;
import java.awt.*;
public class DealershipGUI extends JFrame {
// Il tuo parcheggio generico
private Parking<Vehicle> mioParcheggio = new Parking<>();
// Elementi di input
private JTextField txtBrand, txtModel, txtPrice, txtDoors;
private JCheckBox chkTopCase;
private JComboBox<String> cmbType;
private JLabel lblSpecific;
// I due pannelli contenitori per i "quadrati" dei veicoli
private JPanel pnlCarGrid;
private JPanel pnlMotorcycleGrid;
public DealershipGUI() {
setTitle("City Concessionaire - Grid Management System");
setSize(1000, 650); // Allarghiamo la finestra per far spazio alle due sezioni
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setLayout(new BorderLayout(10, 10));
// Sfondo scuro principale
getContentPane().setBackground(new Color(25, 25, 30));
// =========================================================================
// 1. PANNELLO SINISTRO: INSERIMENTO DATI (Stile Form Moderno)
// =========================================================================
JPanel pnlLeft = new JPanel(new BorderLayout(10, 10));
pnlLeft.setBackground(new Color(35, 35, 40));
pnlLeft.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));
pnlLeft.setPreferredSize(new Dimension(280, 0));
JPanel pnlInputFields = new JPanel(new GridLayout(6, 2, 8, 12));
pnlInputFields.setBackground(new Color(35, 35, 40));
cmbType = new JComboBox<>(new String[]{"Automobile", "Motocicletta"});
txtBrand = new JTextField();
txtModel = new JTextField();
txtPrice = new JTextField();
txtDoors = new JTextField();
chkTopCase = new JCheckBox("Ha il Bauletto");
chkTopCase.setBackground(new Color(35, 35, 40));
chkTopCase.setForeground(Color.WHITE);
chkTopCase.setVisible(false);
lblSpecific = createWhiteLabel("Numero Porte:");
pnlInputFields.add(createWhiteLabel("Tipo Mezzo:")); pnlInputFields.add(cmbType);
pnlInputFields.add(createWhiteLabel("Marca:")); pnlInputFields.add(txtBrand);
pnlInputFields.add(createWhiteLabel("Modello:")); pnlInputFields.add(txtModel);
pnlInputFields.add(createWhiteLabel("Prezzo (€):")); pnlInputFields.add(txtPrice);
pnlInputFields.add(lblSpecific); pnlInputFields.add(txtDoors);
JButton btnAdd = new JButton("Aggiungi Veicolo");
btnAdd.setBackground(new Color(0, 122, 255));
btnAdd.setForeground(Color.WHITE);
btnAdd.setFont(new Font("Arial", Font.BOLD, 14));
btnAdd.setPreferredSize(new Dimension(0, 40));
pnlLeft.add(pnlInputFields, BorderLayout.CENTER);
pnlLeft.add(btnAdd, BorderLayout.SOUTH);
// =========================================================================
// 2. PANNELLO CENTRALE/DESTRO: DIVISIONE MACCHINE E MOTO
// =========================================================================
JPanel pnlDisplayArea = new JPanel(new GridLayout(1, 2, 15, 0)); // 1 Riga, 2 Colonne affiancate
pnlDisplayArea.setBackground(new Color(25, 25, 30));
pnlDisplayArea.setBorder(BorderFactory.createEmptyBorder(10, 5, 10, 10));
// --- SEZIONE MACCHINE (A Sinistra nel display) ---
JPanel pnlCarSection = new JPanel(new BorderLayout(5, 5));
pnlCarSection.setBackground(new Color(25, 25, 30));
JLabel lblCarTitle = createWhiteLabel(" 🚗 AUTOMOBILI IN STOCK");
lblCarTitle.setFont(new Font("Arial", Font.BOLD, 14));
// Pannello interno con FlowLayout per allineare i quadrati uno dopo l'altro
pnlCarGrid = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 10));
pnlCarGrid.setBackground(new Color(20, 20, 25));
JScrollPane scrollCars = new JScrollPane(pnlCarGrid);
scrollCars.setBorder(BorderFactory.createLineBorder(new Color(45, 45, 50)));
pnlCarSection.add(lblCarTitle, BorderLayout.NORTH);
pnlCarSection.add(scrollCars, BorderLayout.CENTER);
// --- SEZIONE MOTO (A Destra nel display) ---
JPanel pnlMotorcycleSection = new JPanel(new BorderLayout(5, 5));
pnlMotorcycleSection.setBackground(new Color(25, 25, 30));
JLabel lblMotoTitle = createWhiteLabel(" 🏍️ MOTOCICLETTE IN STOCK");
lblMotoTitle.setFont(new Font("Arial", Font.BOLD, 14));
pnlMotorcycleGrid = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 10));
pnlMotorcycleGrid.setBackground(new Color(20, 20, 25));
JScrollPane scrollMotos = new JScrollPane(pnlMotorcycleGrid);
scrollMotos.setBorder(BorderFactory.createLineBorder(new Color(45, 45, 50)));
pnlMotorcycleSection.add(lblMotoTitle, BorderLayout.NORTH);
pnlMotorcycleSection.add(scrollMotos, BorderLayout.CENTER);
// Aggiungiamo le due macro sezioni affiancate
pnlDisplayArea.add(pnlCarSection);
pnlDisplayArea.add(pnlMotorcycleSection);
// Composizione Finale Finestra
add(pnlLeft, BorderLayout.WEST);
add(pnlDisplayArea, BorderLayout.CENTER);
// =========================================================================
// LOGICA DEI COMPONENTI ED EVENTI
// =========================================================================
// Switch dinamico dei campi nel Form (Auto -> Porte / Moto -> Bauletto)
cmbType.addActionListener(e -> {
if (cmbType.getSelectedItem().equals("Automobile")) {
lblSpecific.setText("Numero Porte:");
pnlInputFields.remove(chkTopCase);
pnlInputFields.add(txtDoors);
txtDoors.setVisible(true);
} else {
lblSpecific.setText("Opzioni Moto:");
pnlInputFields.remove(txtDoors);
pnlInputFields.add(chkTopCase);
chkTopCase.setVisible(true);
}
pnlInputFields.revalidate();
pnlInputFields.repaint();
});
// Click sul Bottone Aggiungi
btnAdd.addActionListener(e -> {
try {
String brand = txtBrand.getText();
String model = txtModel.getText();
double price = Double.parseDouble(txtPrice.getText());
Vehicle nuovoVeicolo;
if (cmbType.getSelectedItem().equals("Automobile")) {
int doors = Integer.parseInt(txtDoors.getText());
nuovoVeicolo = new Car(brand, model, price, doors);
} else {
boolean hasTopCase = chkTopCase.isSelected();
nuovoVeicolo = new Motorcycle(brand, model, price, hasTopCase);
}
// Inseriamo nel parcheggio generico
mioParcheggio.addVehicle(nuovoVeicolo);
// Rinfreschiamo l'interfaccia grafica
aggiornaGrafica();
svuotaCampi();
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(null, "Inserisci dati numerici corretti nei campi Prezzo/Porte!", "Errore Input", JOptionPane.ERROR_MESSAGE);
} catch (IllegalArgumentException ex) {
// Cattura l'eccezione di prezzo <= 0 definita nel tuo Vehicle.java
JOptionPane.showMessageDialog(null, ex.getMessage(), "Errore Logica di Business", JOptionPane.WARNING_MESSAGE);
}
});
}
// =========================================================================
// METODO PER DISEGNARE I QUADRATI (CARDS)
// =========================================================================
private void aggiornaGrafica() {
// Svuotiamo i vecchi elementi grafici prima di ridisegnare la lista aggiornata
pnlCarGrid.removeAll();
pnlMotorcycleGrid.removeAll();
// Indice incrementale per sapere la posizione reale del veicolo nella lista (ci serve per rimuovere/modificare)
int index = 0;
for (Vehicle v : mioParcheggio.getVehiclesList()) {
final int currentIndex = index; // Costante richiesta per le classi interne delle azioni
// Creiamo il "Quadrato" (Card) del veicolo
JPanel card = new JPanel();
card.setLayout(new BoxLayout(card, BoxLayout.Y_AXIS));
card.setPreferredSize(new Dimension(150, 150)); // Forma quadrata!
card.setBackground(new Color(45, 45, 50));
card.setBorder(BorderFactory.createLineBorder(new Color(70, 70, 75), 1));
// Informazioni dentro al quadrato
JLabel lblMezzo = new JLabel(v instanceof Car ? "🚗 AUTO" : "🏍️ MOTO");
lblMezzo.setForeground(new Color(0, 255, 150));
lblMezzo.setFont(new Font("Arial", Font.BOLD, 11));
lblMezzo.setAlignmentX(Component.CENTER_ALIGNMENT);
JLabel lblMarcaModello = new JLabel(v.getBrand() + " " + v.getModel());
lblMarcaModello.setForeground(Color.WHITE);
lblMarcaModello.setFont(new Font("Arial", Font.BOLD, 12));
lblMarcaModello.setAlignmentX(Component.CENTER_ALIGNMENT);
JLabel lblPrezzo = new JLabel(v.getPrice() + " €");
lblPrezzo.setForeground(new Color(255, 200, 50));
lblPrezzo.setFont(new Font("Arial", Font.PLAIN, 12));
lblPrezzo.setAlignmentX(Component.CENTER_ALIGNMENT);
// Dettaglio specifico
String dettaglioText = "";
if (v instanceof Car) {
dettaglioText = "Porte: " + ((Car) v).getDoorsNumber();
} else {
dettaglioText = ((Motorcycle) v).getTopCase() ? "Con Bauletto" : "Senza Bauletto";
}
JLabel lblDettaglio = new JLabel(dettaglioText);
lblDettaglio.setForeground(Color.LIGHT_GRAY);
lblDettaglio.setFont(new Font("Arial", Font.ITALIC, 10));
lblDettaglio.setAlignmentX(Component.CENTER_ALIGNMENT);
// Sottopannello per i micro-bottoni all'interno del quadrato
JPanel pnlCardButtons = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 2));
pnlCardButtons.setBackground(new Color(45, 45, 50));
// Bottone Modifica Prezzo ($)
JButton btnEdit = new JButton("€");
btnEdit.setToolTipText("Modifica Prezzo");
btnEdit.setFont(new Font("Arial", Font.PLAIN, 10));
btnEdit.setMargin(new Insets(2, 5, 2, 5));
btnEdit.addActionListener(e -> modificaPrezzoVeicolo(currentIndex));
// Bottone Rimuovi (X)
JButton btnDelete = new JButton("X");
btnDelete.setToolTipText("Rimuovi Veicolo");
btnDelete.setFont(new Font("Arial", Font.BOLD, 10));
btnDelete.setForeground(Color.RED);
btnDelete.setMargin(new Insets(2, 5, 2, 5));
btnDelete.addActionListener(e -> {
mioParcheggio.removeVehicle(currentIndex);
aggiornaGrafica();
});
pnlCardButtons.add(btnEdit);
pnlCardButtons.add(btnDelete);
// Spaziatori e assemblaggio elementi nel quadrato
card.add(Box.createVerticalStrut(10));
card.add(lblMezzo);
card.add(Box.createVerticalStrut(8));
card.add(lblMarcaModello);
card.add(lblPrezzo);
card.add(lblDettaglio);
card.add(Box.createVerticalGlue());
card.add(pnlCardButtons);
card.add(Box.createVerticalStrut(5));
// Smistamento visivo: se è un'auto va nella griglia delle auto, altrimenti in quella delle moto!
if (v instanceof Car) {
pnlCarGrid.add(card);
} else {
pnlMotorcycleGrid.add(card);
}
index++; // Passiamo al prossimo veicolo nella lista reale
}
// Forza Java a ridisegnare i pannelli con le nuove modifiche visive
pnlCarGrid.revalidate();
pnlCarGrid.repaint();
pnlMotorcycleGrid.revalidate();
pnlMotorcycleGrid.repaint();
}
// Gestione pop-up per la modifica prezzo integrata nel quadratino
private void modificaPrezzoVeicolo(int index) {
String inputPrice = JOptionPane.showInputDialog(this, "Inserisci il nuovo prezzo (€):");
if (inputPrice != null && !inputPrice.trim().isEmpty()) {
try {
double nuovoPrezzo = Double.parseDouble(inputPrice);
mioParcheggio.updateVehiclePriceAt(index, nuovoPrezzo);
aggiornaGrafica();
JOptionPane.showMessageDialog(this, "Prezzo aggiornato!");
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(this, "Valore numerico non valido!", "Errore", JOptionPane.ERROR_MESSAGE);
} catch (IllegalArgumentException ex) {
JOptionPane.showMessageDialog(this, ex.getMessage(), "Errore Validazione", JOptionPane.ERROR_MESSAGE);
}
}
}
private JLabel createWhiteLabel(String text) {
JLabel lbl = new JLabel(text);
lbl.setForeground(Color.WHITE);
lbl.setFont(new Font("Arial", Font.PLAIN, 12));
return lbl;
}
private void svuotaCampi() {
txtBrand.setText("");
txtModel.setText("");
txtPrice.setText("");
txtDoors.setText("");
chkTopCase.setSelected(false);
}
public static void main(String[] args) {
System.out.println("\033c");
SwingUtilities.invokeLater(() -> new DealershipGUI().setVisible(true));
}
}