|
ButtonManager con textField
Stesse funzionalitè di "ButtonManager", ma accanto ai bottoni di controllo vi dovrà essere un campo di testo.
"Cancella" e "Sposta" non agiranno su un bottone a caso, ma sul bottone numerico avente come etichetta il numero specificato dall'utente nel campo di testo. Qualora il campo di testo contenga valori non sensati, l'azione non avrà effetto.
NOTA: nella soluzione data di seguito vengono evidenziate le variazioni con il codice di ButtonManager. Si noti l'uso di una Map al posto di una Collection.
package buttonmanager;
import javax.swing.*;
import java.awt.*;
public class FinestraPrincipale extends JFrame{
public static void main(String[ ] a){
new FinestraPrincipale();
}
public FinestraPrincipale() {
this.setSize(400,400);
this.centerInScreen();
// fai in modo che la chiusura della finestra
// termini l'applicazione
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );
//
this.setLayout(new BorderLayout());
//
ButtonPanel bp=new ButtonPanel();
this.add(bp,BorderLayout.CENTER);
ControlPanel cp= new ControlPanel(bp);
this.add(cp,BorderLayout.SOUTH);
bp.setControlPanel(cp);
// rendi la finestra visibile
this.setVisible(true);
}
private void centerInScreen() {
// trova le dimensioni dello schermo e della finestra
Dimension screenSize =
Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = this.getSize();
// assicurati che la finestra non sia più grande dello schermo
if (frameSize.height > screenSize.height)
frameSize.height = screenSize.height;
if (frameSize.width > screenSize.width)
frameSize.width = screenSize.width;
// centra la finestra nello schermo
this.setLocation((screenSize.width - frameSize.width) / 2,
(screenSize.height - frameSize.height) / 2);
}
}
package buttonmanager;
import java.awt.GridLayout;
import java.awt.LayoutManager;
import java.awt.TextField;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JPanel;
public class ControlPanel extends JPanel {
public static final String CREA="create";
public static final String CANCELLA="delete";
public static final String SPOSTA="move";
private ButtonPanel bp;
private TextField tf;
ControlPanel(ButtonPanel bp){
this.bp=bp;
this.setLayout(new GridLayout(1,4));
JButton createButton=new JButton("aggiungi");
JButton deleteButton=new JButton("cancella");
JButton moveButton=new JButton("sposta");
tf=new TextField();
// associa delle stringhe di comando ai bottoni
createButton.setActionCommand(CREA);
deleteButton.setActionCommand(CANCELLA);
moveButton.setActionCommand(SPOSTA);
// aggiungi i bottoni al pannello
this.add(createButton);
this.add(deleteButton);
this.add(moveButton);
this.add(tf);
// aggungi un controller ai bottoni
ButtonController bc=new ButtonController(bp);
createButton.addActionListener(bc);
deleteButton.addActionListener(bc);
moveButton.addActionListener(bc);
}
int getValueFromTextField(){
int x=-1;
try {
x=Integer.parseInt(tf.getText());
} catch (NumberFormatException e) {
System.err.println("Invalid value in textfield");
}
return x;
}
}
package buttonmanager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
class ButtonController implements ActionListener{
ButtonPanel bp;
ButtonController(ButtonPanel bp){
this.bp=bp;
}
public void actionPerformed(ActionEvent e) {
String command=e.getActionCommand();
if (command.equals(ControlPanel.CREA)) bp.addButton();
else if (command.equals(ControlPanel.CANCELLA)) bp.removeButton();
else if (command.equals(ControlPanel.SPOSTA)) bp.moveButton();
}
}
package buttonmanager;
import java.awt.Color;
import java.awt.Component;
import java.awt.Point;
import java.util.*;
import javax.swing.JButton;
import javax.swing.JPanel;
class ButtonPanel extends JPanel{
HashMap buttonList;
int nextButtonLabel=1;
final int BUTTONWIDTH=60;
final int BUTTONHEIGHT=20;
Random rg=new Random();
ControlPanel cp=null;
public ButtonPanel() {
this.setLayout(null);
this.setBackground(Color.GREEN);
buttonList=new HashMap();
}
public void setControlPanel(ControlPanel cp){
this.cp=cp;
}
private Point generateRandomPoint(){
int x=rg.nextInt(this.getWidth()-BUTTONWIDTH);
int y=rg.nextInt(this.getHeight()-BUTTONHEIGHT);
return new Point(x,y);
}
public void addButton(){
JButton b=new JButton(" "+(nextButtonLabel)+" ");
b.setLocation(generateRandomPoint());
b.setSize(BUTTONWIDTH,BUTTONHEIGHT);
this.add(b);
this.repaint();
buttonList.put(new Integer(nextButtonLabel), b);
nextButtonLabel++;
}
private Component selectElement(){
if (cp==null) {
System.err.println("Error - ControlPanel is null in ButtonPanel");
System.exit(1);
}
int numElem=cp.getValueFromTextField();
if (numElem<0||numElem>nextButtonLabel) return null;
Component o=(Component)buttonList.get(new Integer(numElem));
return o;
}
public void removeButton(){
Component c=selectElement();
if (c!=null) {
buttonList.remove(c);
this.remove((Component)c);
this.repaint();
}
}
void moveButton() {
Component c=selectElement();
if (c!=null) {
Point p=generateRandomPoint();
c.setLocation(p);
this.repaint();
}
}
}
|