Login: password:
Forgot your password?
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();
        }
    }

}



powered by segue
segue_logo