Selezione dinamica JPanel

di il
2 risposte

Selezione dinamica JPanel

In pratica ho un JPanel che ha come layout un GridLayout a questo JPanel aggiungo con due for annidati tanti JPanel cosi da formare una matrice di JPanel (e ogni uno di questi ha un MouseListener associato )dovrei fare in modo che quando ne viene cliccato uno si "accende"(dovrebbe cambiare colore ad esempio verde,oppure si colora in modo trasparente una cosa qualunque basta che faccia capire qual è stato cliccato) e poi se ne viene cliccato un altro ,quello già cliccato si deve "spegnere" (cioè tornare al colore originale), e quello appena cliccato si deve accendere

/**qui creo la matrice di JPanel (Posto panel estende JPanel)

int count =0;
for (int row = 0; row < h; row++) {
for (int column = 0; column < b; column++) {
if((row>=x && row<=x1) && (column>=y && column<=y1))
{PostoPanel prato = new PostoPanel(); panel.add(prato); }
else {
PostoPanel pixelPanel = new PostoPanel(count);
pixelPanel.addMouseListener(new PostoListener(pixelPanel));
panel.add(pixelPanel);
count++;
}

}
}
/**questo è il listener

class PostoListener implements MouseListener {

private PostoPanel panel;

public PostoListener(PostoPanel p) {
panel = p;
}

public void mousePressed(MouseEvent event) {
lpos.setText(""+ panel.geID());	
System.out.println(""+lpos.getText());

panel.setBackgroundColor(Color.YELLOW);
panel.repaint();
//System.out.println("I was clicked.");
//System.out.println(""+ panel.geID());	
}
public void mouseClicked(MouseEvent arg0) {}
public void mouseEntered(MouseEvent arg0) {}
public void mouseExited(MouseEvent arg0) {}
public void mouseReleased(MouseEvent arg0) {}	
}
/**questo è Posto Panel

public class PostoPanel extends JPanel {


private static final int PIXEL_SIZE = 17;
private Color backgroundColor; 
private int id;

public PostoPanel(int i) {
id =i;
this.backgroundColor = Color.white; 
this.setBorder(BorderFactory.createLineBorder(Colo r.BLACK));
this.setPreferredSize(new Dimension(PIXEL_SIZE, PIXEL_SIZE)); 
}

public PostoPanel() {

this.backgroundColor = Color.GREEN; 
this.setBorder(BorderFactory.createLineBorder(Colo r.black));
this.setPreferredSize(new Dimension(PIXEL_SIZE, PIXEL_SIZE)); 
}

public Color getBackgroundColor() {
return backgroundColor;
}


public void setBackgroundColor(Color backgroundColor) {
this.backgroundColor = backgroundColor;
}

public int geID(){
return id;
}

protected void paintComponent(Graphics g) {
super.paintComponent(g);


g.setColor(getBackgroundColor());
g.fillRect(0, 0, getWidth(), getHeight());
}



}

2 Risposte

  • Re: Selezione dinamica JPanel

    toniCors ha scritto:


    dovrei fare in modo che quando ne viene cliccato uno si "accende"(dovrebbe cambiare colore ad esempio verde,oppure si colora in modo trasparente una cosa qualunque basta che faccia capire qual è stato cliccato) e poi se ne viene cliccato un altro ,quello già cliccato si deve "spegnere" (cioè tornare al colore originale), e quello appena cliccato si deve accendere
    Il punto, te l'ho già spiegato su un altro forum (crossposting!), è che devi solamente tenere il riferimento al PostoPanel "acceso". In sostanza basta avere una variabile di istanza per il pannello acceso nella classe dove componi la GUI e dove gestisci il listener. Se il listener l'hai definito come classe esterna, è meno buono e avrai più problemi. Quindi è preferibile implementarlo come inner-class (e possibilmente privata).

    Abbozzato come esempio:
    public class Finestra extends JFrame {
        //....
        private PostoPanel pannelloAcceso;
    
        public Finestra() {
            // ....
            // qui costruisci la matrice di PostoPanel e registri i listener
        }
    
    
        private class MouseListenerImpl implements MouseListener {
            // ....
            public void mousePressed(MouseEvent event) {
                // Qui puoi prendere il PostoPanel cliccato dal event
                // Puoi usare pannelloAcceso
            }
        }
    }
    Ti segnalo anche alcune cose in più:

    1) I componenti (e quindi anche JPanel) hanno già la proprietà "background" (utile se è "opaco"). Ma se vuoi usare il custom-painting in PostoPanel va anche bene, nulla di male. Tieni però presente che il repaint() non lo dovresti fare esternamente al componente. Perché è il componente che sa e deve sapere se/come/dove/quando richiedere il repaint. Quindi il repaint() lo dovresti mettere nel setBackgroundColor di PostoPanel.

    2) Hai creato N istanze del listener. Oltretutto il tuo listener ha uno "stato" (il PostoPanel). Se non ti serve per altri motivi che non conosco, sappi che queste due cose non servono strettamente.
    Basterebbe 1 istanza del listener e come ho indicato nell'esempio, il PostoPanel cliccato lo puoi prendere dall'evento.
  • Re: Selezione dinamica JPanel

    Grazie mille ancora ma non ero soddisfatto della risposta volevo fare una cosa un po più carina tipo questo esempio che funziona sui bottoni pero
    
    
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    
    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.UIDefaults;
    import javax.swing.UIManager;
    import javax.swing.border.Border;
    
    public class ProveSwing {
    
      public ProveSwing() {
            JFrame frame = new JFrame("Bottoni colorati");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().setLayout(new FlowLayout());
            frame.getContentPane().add(new JLabel("Bottoni"));
            frame.getContentPane().add(new JButton("Primo"));
            frame.getContentPane().add(new JButton("Secondo"));
            frame.setSize(new Dimension(300,300));
            frame.pack();
            frame.setVisible(true);
      }
    
      public static void main(String[] args) {
            try {
            
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (Exception e) {
              e.printStackTrace();
            }
    
        UIDefaults uiDefaults = UIManager.getDefaults();
        //uiDefaults.put("Button.background", Color.orange);
        Border b = BorderFactory.createRaisedBevelBorder();
        uiDefaults.put("Button.border", b);
            new ProveSwing();
      }
    }
    
Devi accedere o registrarti per scrivere nel forum
2 risposte