Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    45

    immagine disabledIcon per un JButton

    Ho un problema moolto urgente e sarei grato se qualcuno mi risponderà:

    ho aggiunto un'immagine ad un jbutton usando setDisabledIcon(). L'immagine viene caricata al momento giusto ma assurdamente decentrata (per l'esattezza viene messa in alto a sinistra rispetto allo spazio della casella). Il fatto è che la stessa immagine, se messa con setIcon() viene posizionata nel modo corretto. Ho provato qualche trucchetto come allargare l'immagine ma non o viene troppo grossa o me la tiene cmq così
    Qualcuno sa dirmi se esiste 1 metodo per centrare l'immagine di una disabledIcon? Grazie a chi mi risponde...

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

    Re: immagine disabledIcon per un JButton

    Originariamente inviato da a_riz
    ho aggiunto un'immagine ad un jbutton usando setDisabledIcon(). L'immagine viene caricata al momento giusto ma assurdamente decentrata (per l'esattezza viene messa in alto a sinistra rispetto allo spazio della casella). Il fatto è che la stessa immagine, se messa con setIcon() viene posizionata nel modo corretto.
    Non mi risulta ci sia differenza nel posizionamento della icona disabled rispetto a quella normale (ammesso che non venga cambiato l'allineamento).

    Posta il codice.
    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
    Allora, ci ho messo 1 po' xkè ho cercato di estrapolare dal codice solo il minimo essenziale di interesse (quinid è molto probabile che ci siano bug). Il codice essenziale che ti ho passato funziona così: prende i parametri altezza, larghezza scacchiera e poi disegna la scacchiera con tanti bei punti di domanda. Se cliccchi 1 casella col sinistro esce 1 icona messa con setdisabledIcon, se col destro un'icona messa con setIcon. Noterai che le icone prendono la stessa immagine che però non vengono messe nello stesso modo.. (almeno a me funziona così)
    Codice PHP:
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.Insets;
    import javax.swing.Icon;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JTextField;



    public class 
    provaIcon extends JFrame implements MouseListener{
        
        private static final 
    long serialVersionUID 1L;

        
    int dimCasella 30//25
        
    int xMax = -10;
        
    int yMax = -10
         

        
    Icon iconaMinaNonCliccata;
        
    Icon iconaBandiera;
        
    Icon iconaQmark;
        
    Icon iconaMinaCliccata;
        
        
        
    // ////////////////////////////////////////////////////
        // dichiarazione oggetti (pulsanti, label textfield,panel)
        // ////////////////////////////////////////////////////

        // button
        
    JButton button_restart = new JButton("Nuova Partita");    
        
    JButton[][] button_scacchiera;// 
        
        
        //JLabel
        
    JLabel labelIstruz = new JLabel ("Inserire le dimensioni della campo minato");
        
    JLabel labelX = new JLabel("X");
        
    JLabel labelY = new JLabel("Y");    
        
    JLabel labelMine = new JLabel("Mine");
        
        
    //JTextField (per inserire valori x, y, mine)
        
    JTextField campoX = new JTextField();
        
    JTextField campoY = new JTextField();
        
    JTextField campoMine = new JTextField();
        
        
        
    //Font
        
    Color defaultColor;
        
    Font buttonFont = new Font ("buttonFont"Font.BOLD,10);
        
        
        
    /**
         * Si occupa di definire e disegnare  scacchiera e pulsanti
         * @param titolo nome della finestra in cui è aperto il frame
         */
        
    public provaIcon(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);        
            
    defaultColor button_restart.getBackground();
            
    iconaMinaNonCliccata createImageIcon("images/mina.jpg""mina");
            
    iconaBandiera createImageIcon("images/flag.jpg""mina segnata");
            
    iconaQmark createImageIcon("images/questMark.jpg""mina?");
            
    iconaMinaCliccata createImageIcon("images/mina.jpg""M");
            
    // ////////////////////////////////////////////////////
            // definisco le dimensioni degli oggetti
            // ////////////////////////////////////////////////////
            
            
            
            
    campoX.setBounds(40,90,30,30);
            
    campoY.setBounds(100,campoX.getY(),30,30);
            
    campoMine.setBounds(campoX.getX() + 150,campoY.getY(), 3030);
            
    button_restart.setBounds(campoMine.getX() + 80campoX.getY(), 12028); // setto la dimensionetext_P1.setBounds(60,26,60,40);
            
    labelX.setBounds(campoX.getX()- 20,campoX.getY(),40,40);
            
    labelY.setBounds(campoY.getX()- 20,campoY.getY(),40,40);
            
    labelMine.setBounds(campoMine.getX()- 40,campoY.getY(),40,40);
            
    labelIstruz.setBounds(labelX.getX() - 10,campoX.getY() - 4040040);

                                                

            
    // ////////////////////////////////////////////////////
            // metto quello che voglio sia disegnato nel frame
            // ///////////////////////////////////////////////////
            
            
    getContentPane().add(labelIstruz);
            
    getContentPane().add(button_restart);        
            
    getContentPane().add(labelX);
            
    getContentPane().add(labelY);
            
    getContentPane().add(campoX);
            
    getContentPane().add(campoY);
            
    getContentPane().add(campoMine);
            
    getContentPane().add(labelMine);
        
            
            

            
    button_restart.addMouseListener(this);//aggiungo il pulsante
            
            //parametri del frame
            
    setResizable(false);
            
    setBounds(100100800650); //dim frame
            
    setVisible(true); // x rendere visibile il frame(di default non lo è)
        
    }

        
        
        
        public 
    void setCasella(int xint y){
        
            
    button_scacchiera[x][y].setIcon(null);
        
            
    button_scacchiera[x][y].setBackground(Color.white);
            
    button_scacchiera[x][y].setEnabled(false);        
        }
        
        protected 
    ImageIcon createImageIcon(String path,String description) {
            
    java.net.URL imgURL getClass().getResource(path);
            if (
    imgURL != null) {
                return new 
    ImageIcon(imgURLdescription);
            } else {
                
    System.err.println("File assente: " path);
                return 
    null;
            }
        }
        
    /**
         * Si occupa di gestire l'evento pressione di un tasto del mouse, in base al bottone 
         * grafico premuto. 
         
         * @param e l'evento pressione del tasto
         */
        
        
    public void mousePressed(MouseEvent e) {
                 
    int xMina = -10;
                
    int yMina = -10;
                
    int numMineTemp = -10
                
        
    ///////////////////////////////////////////////////////////////////////
        ///pressione di button_restart        
        ///////////////////////////////////////////////////////////////////////        
                
    if(e.getComponent() == button_restart){
                    
    labelIstruz.setText("Inserire le dimensioni della campo minato");
                    
    //cancello i bottoni (solo se non è la prima partita)
                    
    if (button_scacchiera != null) {
                        
    // cicli for su i e j per rimuovere i vecchi pulsanti
                        
    for (int i 0xMaxi++){
                            for (
    int j 0yMaxj++){                    
                                
    getContentPane().remove(button_scacchiera[i][j]);
                            }
                        }
                    }
                    
    //prendo i parametri dell'utente            
                    
    try {
                        
    xMax Integer.parseInt(campoX.getText());
                        
    yMax Integer.parseInt(campoY.getText());
                        
                    }
                    
                    catch(
    NumberFormatException e1 ){
                        
    labelIstruz.setText("formato non valido");
                    }
                    
                    
                    if ((
    xMax 0) && (xMax 40)){
                        if ((
    yMax 0) && (yMax 40)){
                            
                                
    labelIstruz.setText("Scegli una casella..");
                                
    //disegno scacchiera e pulsanti
                              
                                  
    button_scacchiera = new JButton[xMax][yMax];
                         
                                  
    //definisco i singoli bottoni
                                   
    for (int x 0xMaxx++){
                                       for (
    int y 0yMaxy++){
                                           
    button_scacchiera[x][y] = new JButton("");
                                           
    button_scacchiera[x][y].setFont(buttonFont);                
                                           
    button_scacchiera[x][y].setBounds(15 + (y*dimCasella), 
                                                   
    150 + (x*dimCasella), dimCaselladimCasella);                                                    
                                           
    button_scacchiera[x][y].setMargin(new Insets(2,6,2,6));
                                           
    button_scacchiera[x][y].setBackground(defaultColor);
                                           
    button_scacchiera[x][y].setIcon(iconaQmark);
                                           
    //button_scacchiera[x][y].setText("?");                                    
                                           
    getContentPane().add(button_scacchiera[x][y]);
                                           
    button_scacchiera[x][y].addMouseListener(this);                                                                                          
                                       }
                                   }
                               
                                   
                                   
    getContentPane().repaint();                        
                                                
                        }
                    }
                }                     
    //            /////////////////////////////////////////////////////////////////////
                ///pressione di una casella        
                ///////////////////////////////////////////////////////////////////////
                
    for (int x 0xMaxx++){
                    for (
    int y 0yMaxy++){
                        
    //se viene premuta 1 casella
                        
    if (e.getComponent() == button_scacchiera[x][y]){ 
                            if (
    e.getButton() == MouseEvent.BUTTON3){
                                
    button_scacchiera[x][y].setText("");
                                
    button_scacchiera[x][y].setIcon(iconaMinaNonCliccata);                                  
                            }
                            else if (
    e.getButton() == MouseEvent.BUTTON1){
                                
    button_scacchiera[x][y].setEnabled(false);
                                
    button_scacchiera[x][y].setDisabledIcon(iconaMinaNonCliccata);    
                                                                                               
                            } 
    //chiudo else
                        
    }                                                    
                    }                                   
                 }                    
               }
    //Fine pressione mouse
            
            
            
    public void mouseReleased(MouseEvent e) {
                 
    //System.out.println("hai lasciato 1 tasto");
            
    }
            
            public 
    void mouseEntered(MouseEvent e) {
               
    // quando il cursore del mouse entra nell'area interessata
            
    }
            
            
            public 
    void mouseExited(MouseEvent e) {
                
    // quando il cursore del mouse esce dall'area interessata       
            
    }
            
            public 
    void mouseClicked(MouseEvent e) {
                
    //System.out.println("mouseClick");
            
    }
            
        
        public static 
    void mainString [] args ){
            
            new 
    provaIcon"Campo minato" ).setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }



    Allego solo l'immagine della mina (l'altra mettici quel che t pare) visto che qua mi fa mettere 1 solo allegato...
    Immagini allegate Immagini allegate

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da a_riz
    Se cliccchi 1 casella col sinistro esce 1 icona messa con setdisabledIcon, se col destro un'icona messa con setIcon. Noterai che le icone prendono la stessa immagine che però non vengono messe nello stesso modo..
    La iconaQmark ha una dimensione diversa dalla iconaMinaNonCliccata??? In effetti fa quello che dici ... è perchè le dimensioni sono diverse. Non l'avevo mai notata questa cosa ma ... sembra (e non so se è un bug o una caratteristica by design) che si tenga memorizzata la dimensione della prima icona impostata.

    In un certo modo lo risolvi. Quando imposti quella disabled, imposta anche quella normale:

    button_scacchiera[x][y].setEnabled(false);
    button_scacchiera[x][y].setDisabledIcon(iconaMinaNonCliccata);
    button_scacchiera[x][y].setIcon(iconaMinaNonCliccata);


    Nota alcune cose: il codice postato l'hai sicuramente scritto velocemente, mettendo solo l'essenziale e quindi un po' "pasticciato". Comunque tutta quella tua gestione è altamente migliorabile.

    Ad esempio sul pulsante Nuova Partita avrebbe più senso registrare un ActionListener, non un MouseListener. Poi i pulsanti delle celle li disabiliti, probabilmente perchè non vuoi che siano più cliccabili ma .... il mousePressed arriva comunque! Pure se il pulsante è disabled!
    E visto che ogni cella ha un "comportamento" molto specifico, sarebbe anche stata una buona cosa incapsulare questo comportamento in una classe apposita (creando un componente "custom" che disegni tu in paintComponent() oppure, più semplicemente, che incapsula il pulsante).
    Insomma ... si può dare di più.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    45
    Visto che gentilmente mi offri consigli, cerco di capirli meglio. Premetto che il java l'ho sempre fatto "fai da te" nn ho mai studiato o fatto 1 corso specifico, quindi tendo a trovare ciò che mi serve nel momento in cui mi serve (Cosa che potrebbe scandalizzare qualcuno).

    Ad esempio sul pulsante Nuova Partita avrebbe più senso registrare un ActionListener, non un MouseListener.
    Il problema è che la classe implementa MouseListener. Dovrei fare 1 classe a parte per il pulsante? O posso implementare 2 interfacce insieme?

    Poi i pulsanti delle celle li disabiliti, probabilmente perchè non vuoi che siano più cliccabili ma .... il mousePressed arriva comunque! Pure se il pulsante è disabled!
    Si in effetti hai ragione, c'è 1 modo per disattivare mousePressed?

    E visto che ogni cella ha un "comportamento" molto specifico, sarebbe anche stata una buona cosa incapsulare questo comportamento in una classe apposita (creando un componente "custom" che disegni tu in paintComponent() oppure, più semplicemente, che incapsula il pulsante).
    Beh sì, anche xkè la classe creata è un po' grande, diciamo che nn l'ho fatto per pigrizia

    Per il resto grazie ancora, mi hai dato grande aiuto...

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da a_riz
    Il problema è che la classe implementa MouseListener. Dovrei fare 1 classe a parte per il pulsante? O posso implementare 2 interfacce insieme?
    Una classe può implementare più interfacce. Quindi nulla ti vieta di implementara ActionListener e MouseListener (e non dovresti più distinguere tra pulsante di avvio e di una cella).

    Originariamente inviato da a_riz
    Si in effetti hai ragione, c'è 1 modo per disattivare mousePressed?
    Ti arriva comunque ma puoi non fare nulla usando isEnabled() per vedere se il pulsante non è abilitato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.