Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    45

    pulsante che crea un pulsante

    Volevo creare un pulsante, che nel momento in cui viene premuto, ne crea un altro, però a quanto pare non riesco. Il pulsante viene creato come dico, ma non aggiunto al frame.
    Ho fatto una cosa di questo genere
    Codice PHP:
    public class PulsanteCreaPulsante extends JFrame implements ActionListener{
        
        private static final 
    long serialVersionUID 1L;              

        
    // button
        
    JButton button_restart = new JButton("Nuova Partita");    
        
    JButton button_scacchiera;// 
        
        
    public PulsanteCreaPulsante(String titolo) { 
            
            
    super(titolo);
            
    getContentPane().setLayout(null);                            
                 
            
    button_restart.setBounds(1204012028);         
            
    button_restart.addActionListener(this);//aggiungo il pulsante
                                
            
    getContentPane().add(button_restart);
            
    setResizable(false);
            
    setBounds(100100800650); //dim frame
            
    setVisible(true); // x rendere visibile il frame(di default non lo è)
        
    }
        public 
    void actionPerformedActionEvent e){ 
            
            
            
    Object target e.getSource();
            
    //alla pressione di buttton_restart, viene definito il secondo pulsante
                    
    if (target == button_restart){
                        
    button_scacchiera = new JButton("");                                                
                          
    button_scacchiera.setBounds(10 1503030);                    
                        
    button_scacchiera.setText("");
                        
    getContentPane().add(button_scacchiera);
                            
    //verifico la creazione del pulsante
                            
    System.out.println(button_scacchiera.getBounds());
                        
    System.out.println(button_scacchiera.getText());
                    }        
            
        }
        public static 
    void mainString [] args ){
            
            new 
    PulsanteCreaPulsante"Campo minato" ).setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }


    Probabilmente non gli piace dove metto il getContentPante().add del secondo pulsante, ma se deve avvenire a pressione non saprei come farlo. O forse la chiamata va effettuata in modo diverso? Grazie in anticipo a chi risponde...

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: pulsante che crea un pulsante

    Originariamente inviato da a_riz
    Il pulsante viene creato come dico, ma non aggiunto al frame.
    codice:
    getContentPane().add(button_scacchiera);
    button_scacchiera.repaint();
    Un repaint dovrebbe bastare.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    45
    Grandissimo, ha funzionato!!!!

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    45
    Ok adesso ho 1 altro problema: sempre partendo dal discorso di prima, ho fatto 1 pulsante che
    invece di crearne uno solo crea un array bidimensionale di pulsanti. Il comportamento è decisaente strano, forse dipende dalla mia poca conoscenza del metodo repaint().
    Cmq qui il pulsante button_restart, quando premuto, disegna una serie di caselle. Ognuna di queste caselle, se premute restituisce il suo text (che è poi la sua posizione nell'array).
    Il tutto funziona correttamente la prima volta, ma dalla seconda si hanno delle anomalie che non riesco a comprendere: in primo luogo l' array d pulsanti viene ridisegnato ma solo se grande uguale o più grande, se è più piccolo le caselle "extra" rimangono. In secondo luogo i pulsanti non funzionano più. Veramente non capisco dove sia l'errore e temo a questo punto sia nel mio modo di interpretare il JFrame.
    Il codice è il seguente. Grazie in anticipo


    Codice PHP:

    public class provaArrayPulsanti extends JFrame implements ActionListener{
        
        private static final 
    long serialVersionUID 1L;
        
    int dimCasella 40//25
        
    int xMax = -10;
        
    int yMax = -10;
        
    // ////////////////////////////////////////////////////
        // dichiarazione oggetti (pulsanti, label textfield,panel)
        // ////////////////////////////////////////////////////

        // button
        
    JButton button_restart = new JButton("Nuova Partita");    
        
    JButton[][] button_scacchiera;// 
        //JTextField (per inserire valori x, y)
        
    JTextField campoX = new JTextField();
        
    JTextField campoY = new JTextField();
        
        
        public 
    provaArrayPulsanti(String titolo) { // viene visualizzato come titolo della
                                            // finestra
            
            
    super(titolo);// richiama il costruttore della superclasse Jframe
                            // passando come parametro la stringa da visualizzare
                            // sulla barra del titolo
            
    getContentPane().setLayout(null);        
            
    button_restart.setBounds(1208012028); // setto la dimensionetext_P1.setBounds(60,26,60,40);
            
    campoX.setBounds(20,40,40,40);
            
    campoY.setBounds(20,100,40,40);
            
            
    button_restart.addActionListener(this);//aggiungo il pulsante
            
    getContentPane().add(campoX);
            
    getContentPane().add(campoY);
            
            
    System.out.println();

            
    // ////////////////////////////////////////////////////
            // metto quello che voglio sia disegnato nel jpanel
            // ///////////////////////////////////////////////////
            
            
            
    getContentPane().add(button_restart);
            
            
    setResizable(false);
            
    setBounds(100100800650); //dim frame
            
    setVisible(true); // x rendere visibile il frame(di default non lo è)
        
    }
        public 
    void actionPerformedActionEvent e){ //nella ver originale usato come tipo boolean
            
            
    Object target e.getSource();
                      
            if (
    target == button_restart){
                
    xMax Integer.parseInt(campoX.getText());
                
    yMax Integer.parseInt(campoY.getText());
                       
    button_scacchiera = new JButton[xMax][yMax];
                    for (
    int i 0xMaxi++){
                     for (
    int j 0yMaxj++){
                            
    button_scacchiera[i][j] = new JButton("");                                                
                            
    button_scacchiera[i][j].setBounds(10 + (j*dimCasella) , 120 + (i*dimCasella), dimCaselladimCasella);                                                    
                            
    button_scacchiera[i][j].setMargin(new Insets(2,6,2,6));
                            
    button_scacchiera[i][j].setEnabled(true);
                            
    button_scacchiera[i][j].setText(Integer.toString(i)+ " "Integer.toString(i));                                    
                            
    getContentPane().add(button_scacchiera[i][j]);
                            
    button_scacchiera[i][j].addActionListener(this);//aggiungo il pulsante
                            
    button_scacchiera[i][j].repaint(); 
                            }                        
                        }
                }              
                for (
    int x 0xMaxx++){
                    for (
    int y 0yMaxy++){
                        if (
    target == button_scacchiera[x][y]){
                            
    System.out.println("bottone" Integer.toString(x) + "  "Integer.toString(y));                    
                        }
                    }
                }
        }
        public static 
    void mainString [] args ){        
            new 
    provaArrayPulsanti"Scacchiera" ).setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }



  5. #5
    Ad occhio il motivo e' molto semplice: quando fai la "seconda partita" non togli tutti i pulsanti che avevi creato prima, ma sovrascrivi quelli che ci sono gia'... credo che ti convenga mettere l'array di pulsanti in un secondo contenitore in modo da poter chiamare la funzione removeAll() prima di ridisegnare i pulsanti

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    45
    Cosa intendi per 1 altro contenitore? 1 altro frame? Nel caso funziona solo per la seconda volta o per ogni volta che schiaccio il pulsante nuova partita?

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Semplicemente prima di creare nuovi pulsanti, fai un blocco di for annidati per rimuovere i vecchi pulsanti dal content pane.
    Devi farlo però prima di istanziare il nuovo array con button_scacchiera=new JButton[xMax][yMax] perché altrimenti, ovviamente, ti perderesti il reference al vecchio array.

    In sostanza:

    codice:
    if (button_scacchiera != null) {
        // cicli for su i e j per rimuovere i vecchi pulsanti
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    45
    Ho provato ma non sembra sortire alcun effetto. Peraltro pensavo che il contenuto del pulsante si annullasse quando faccio
    Codice PHP:
    button_scacchiera[i][j] = new JButton(""); 
    Magari va messo in diversa posizione oppure ho male interpretato? Cmq ho fatto così...fammi sapere. Thx
    Codice PHP:
    public void actionPerformedActionEvent e){ //nella ver originale usato come tipo boolean
            
            
    Object target e.getSource();
                      
                    if (
    target == button_restart){
                                
                                if (
    button_scacchiera != null) {
                                    
    // cicli for su i e j per rimuovere i vecchi pulsanti
                                    
    for (int i 0xMaxi++){
                                        for (
    int j 0yMaxj++){
                                            
    System.out.println("sono qui");
                                            
    button_scacchiera[i][j].removeAll();
                                        }
                                    }
                                    
                                }
                                
    xMax Integer.parseInt(campoX.getText());
                                
    yMax Integer.parseInt(campoY.getText());
                                
    button_scacchiera = new JButton[xMax][yMax];
                                for (
    int i 0xMaxi++){
                                    for (
    int j 0yMaxj++){
                                        
    button_scacchiera[i][j] = new JButton("");                                                
                                        
    button_scacchiera[i][j].setBounds(10 + (j*dimCasella) , 120 + (i*dimCasella), dimCaselladimCasella);                                                    
                                        
    button_scacchiera[i][j].setMargin(new Insets(2,6,2,6));
                                        
    button_scacchiera[i][j].setEnabled(true);
                                        
    button_scacchiera[i][j].setText(Integer.toString(i)+ " "Integer.toString(i));                                    
                                        
    getContentPane().add(button_scacchiera[i][j]);
                                        
    button_scacchiera[i][j].addActionListener(this);//aggiungo il pulsante
                                        
    button_scacchiera[i][j].repaint(); 
                                    }                        
                                }
                    }              
                    for (
    int x 0xMaxx++){
                        for (
    int y 0yMaxy++){
                            if (
    target == button_scacchiera[x][y]){
                                
    System.out.println("bottone" Integer.toString(x) + "  "Integer.toString(y));                    
                            }
                        }
                    }
        } 

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da a_riz
    button_scacchiera[i][j].removeAll();
    Ma non devi fare removeAll() sul pulsante!!!! (è vero che ogni componente Swing è un Container ... ma nessuno in genere mette un componente dentro un JButton!!).

    Devi invocare remove() sul content pane passando il pulsante!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    45
    Ok, chiedo scusa per la mia interpretazione grossolana.
    Ho fatto:
    Codice PHP:
    for (int i 0xMaxi++){
            for (
    int j 0yMaxj++){
                 
    System.out.println("rimosso il pulsante " " " j);
                 
    getContentPane().remove(button_scacchiera[i][j]);
            }

    e quasi funziona: l'unico errore ancora restante è che, se faccio 1 scacchiera più piccola rispetto alla precedente, i tasti extra rimangono, seppure inattivi e non considerati. C'è 1 ulteriore metodo per toglierli?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.