Pannello auto ridimensionante perde i MouseListener

di il
10 risposte

Pannello auto ridimensionante perde i MouseListener

Buongiorno a tutti!! ho un problema con questo pannello che auto ridistribuisce il suo contenuto in base alla dimensione ed inoltre cambia l'origine e l'orientazione del sistema di riferimento per disegnare i componenti.

public class AutoResizablePanel extends JPanel{
    
    private boolean showXaxis;
    private boolean showYaxis;
    private int  XaxisLength         = 100;
    private int  YaxisLength         = 100;
    private BasicStroke  XaxisStroke = new BasicStroke(1);
    private BasicStroke  YaxisStroke = new BasicStroke(1);
    private Color  XaxisColor        = Color.BLACK;
    private Color  YaxisColor        = Color.BLACK;
    
    private boolean scaleUniform     = true;
    private double ScaleUniformFactor;
    private double ScaleX;
    private double ScaleY;
    
    private Dimension BuildingBox = new Dimension(200, 300);

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D G2D = (Graphics2D) g;            
        G2D.translate(0, this.getHeight());
        
        ScaleX = (double)this.getHeight()/BuildingBox.height;
        ScaleY = (double)this.getWidth()/BuildingBox.width;
        ScaleUniformFactor = scaleUniform ? Math.min(ScaleX, ScaleY) : 0;        
        G2D.rotate(Math.toRadians(-90));        
        if(scaleUniform){
            G2D.transform(AffineTransform.getScaleInstance(ScaleUniformFactor, ScaleUniformFactor));
        }else{
            G2D.transform(AffineTransform.getScaleInstance(ScaleX, ScaleY));
        }
    }
}
Il problema è che aggiungendo qualsiasi componente (vedi bottone) su un null layout questo perde il suo mouse listener -.-

Si può fare qualcosa o devo abbandonare questa tecnica di ridimensionamento "automatico"?

Tente conto che dovrei disegnare una pianta do una casa con le stanze cliccabili... ergo i pulsanti sono importanti

10 Risposte

  • Re: Pannello auto ridimensionante perde i MouseListener

    lory1990 ha scritto:


    Il problema è che aggiungendo qualsiasi componente (vedi bottone) su un null layout questo perde il suo mouse listener -.-

    Si può fare qualcosa o devo abbandonare questa tecnica di ridimensionamento "automatico"?
    No, quello che hai fatto non è appropriato. Il problema è che la gestione degli eventi del mouse non ha alcuna "nozione" della matrice di traslazione.
    Per gli eventi del mouse, l'origine (0,0) è sempre nell'angolo in alto-sinistra del componente, la x cresce verso destra e la y cresce verso il basso. Questo non lo puoi/devi sovvertire.

    Se vuoi che una interfaccia grafica sia gradevole ed espandibile in base al frame, questo si fa sfruttando opportunamente i layout manager (e non usando il posizionamento "assoluto").

    Se invece vuoi fare cose più "strane", es. ruotare/scalare pulsanti, textfield, ecc... allora no. La cosa è altamente critica. Swing difatti non contempla assolutamente il concetto di "rotazione" dei componenti.
  • Re: Pannello auto ridimensionante perde i MouseListener

    Immaginavo che la risposta fosse questa... vabbè non fa niente mi adatterò Grazie 1000 della disponibilità.

    Effettivamente devo fare questa pianta dell'appartamento cliccabile; hai qualche dritta da darmi o è meglio che trasmigri su Java FX (che mi sembra molto più flessibile da questo punto di vista)?

    Grazie!
  • Re: Pannello auto ridimensionante perde i MouseListener

    lory1990 ha scritto:


    Effettivamente devo fare questa pianta dell'appartamento cliccabile;
    Ma questo è perfettamente fattibile, almeno detto così e in generale, anche in Swing!

    Quello che non capisco io è perché avresti bisogno di un pannello come quello che hai mostrato ....
  • Re: Pannello auto ridimensionante perde i MouseListener

    La pianta Deve adattarsi alle dimensioni dello schermo.... E quindi anche tutte le stanze devono adattarsi....
  • Re: Pannello auto ridimensionante perde i MouseListener

    lory1990 ha scritto:


    La pianta Deve adattarsi alle dimensioni dello schermo.... E quindi anche tutte le stanze devono adattarsi....
    Disegnare una immagine scalata su un Graphics non è quello il problema. Ma se pensavi di scalare anche i componenti GUI (pulsanti, ecc...) no.

    Ti ripeto che la cosa si può sicuramente fare ma dovresti avere una idea più chiara di cosa si può (e non si può/deve) fare in Swing.
  • Re: Pannello auto ridimensionante perde i MouseListener

    Questo è molto chiaro! In Swing i componenti non si possono ridimensionare dinamicamente.

    Allora dovrò cambiare strategia: però il problema rimane... Si deve fare questa casa con stanze cliccabili e che cambiano colore.... Come procedo?
  • Re: Pannello auto ridimensionante perde i MouseListener

    lory1990 ha scritto:


    Questo è molto chiaro! In Swing i componenti non si possono ridimensionare dinamicamente.
    Sì, si POSSONO ridimensionare ma NON andando a fare truschini sulla matrice di trasformazione!

    lory1990 ha scritto:


    Allora dovrò cambiare strategia: però il problema rimane... Si deve fare questa casa con stanze cliccabili e che cambiano colore.... Come procedo?
    Dovresti chiarire meglio cosa vuoi fare e da cosa parti. Per "stanze cliccabili", cosa sono? Hai una immagine completa della mappa? Sulla mappa vuoi segnare evidenziare qualcosa? E come?
  • Re: Pannello auto ridimensionante perde i MouseListener

    Purtroppo non ho una piantina.... L'idea è quella di avere una classe Casa con dentro un array di classi "Stanza". La classe stanza ha dentro un array di punti che ne definiscono i contorni.
    Ecco io devo disegnare tutto ciò!
    Non solo.... Quando clicco su una stanza questa deve diventare rossa e con il click destro devo aprire un popup menu

    E più chiaro adesso?

    Inviato dal mio SM-G900F utilizzando Tapatalk
  • Re: Pannello auto ridimensionante perde i MouseListener

    lory1990 ha scritto:


    Purtroppo non ho una piantina.... L'idea è quella di avere una classe Casa con dentro un array di classi "Stanza". La classe stanza ha dentro un array di punti che ne definiscono i contorni.

    E questo va benissimo. Perlomeno a livello di struttura "logica".

    lory1990 ha scritto:


    Ecco io devo disegnare tutto ciò!
    Si può fare e anche con diverse tecniche. La più diretta: estendere es. JPanel e fare del custom painting dentro il paintComponent. Se hai le informazioni logiche (punti, ecc...) le puoi disegnare.

    lory1990 ha scritto:


    Quando clicco su una stanza questa deve diventare rossa e con il click destro devo aprire un popup menu
    Anche questo si può fare, è solo un (bel) po' di codice in più per gestire eventi del mouse, ridisegno della pianta con uno "stato" differente (appunto es. una stanza "evidenziata").
  • Re: Pannello auto ridimensionante perde i MouseListener

    Allora ho dato un'occhiata su internet e ho avuto un'idea sul da farsi: ogni classe Stanza genera un JPanel con un custom painting in base ai contorni e che implementa un mouselistener che gestisce: click, doppio click, click destro.

    Creo un pannello casa a cui passo i pannelli delle stanze.... e adesso? come faccio? io vorrei usare un "absolute layout" a questo punto per la sistemazione dei pannelli è giusto?
Devi accedere o registrarti per scrivere nel forum
10 risposte