Visualizzazione dei risultati da 1 a 8 su 8

Discussione: Jlabel rotazione

  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    8

    Jlabel rotazione

    Ciao Ragazzi, ho un problema...
    Ho una classe che eredita da JLabel (MyLabel) devo poter aggiungere la proprietà di rotazione a questa classe e permettere all'utente di ruotarla nella GUI...Avete idea di come fare? c' è qualche classe già pronta? NB vorrei dare la proprietà di rotazione alla JLabel e non al suo contenuto (immagine o testo)...qualcuno può aiutarmi? grazie 1000

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

    Re: Jlabel rotazione

    Originariamente inviato da mix99
    Ho una classe che eredita da JLabel (MyLabel) devo poter aggiungere la proprietà di rotazione a questa classe e permettere all'utente di ruotarla nella GUI...Avete idea di come fare? c' è qualche classe già pronta? NB vorrei dare la proprietà di rotazione alla JLabel e non al suo contenuto (immagine o testo)
    Beh ma allora .... precisa cosa intendi per "rotazione"!!
    Se hai un JLabel 100x50 e intendi una rotazione a sinistra che lo fa diventare 50x100, ovviamente tutta la "grafica" (qualunque cosa disegnata) "ruota".
    Se non è questo che intendi ... spiega.
    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
    Jan 2010
    Messaggi
    8
    Ciao andbin, grazie per avermi risposto...
    In pratica vorrei dotare una Jlabel della proprietà di ruotare, passando ad esempio l'angolo di rotazione espresso in radianti. Vorrei che l'utente possa ruotarlo usando il click del mouse.

    La jlabel possiede dei metodi che eredita da java.awt.Container come ad esempio setLocation e setSize che permettono rispettivamente la traslazione della label e il ridimensionamento, che vengono automaticamente visualizzati sulla gui... vorrei sapere se è possibile fare la stessa cosa con la rotazione...
    grazie mille, ancora...se nn ti è chiaro chiedi pure...

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da mix99
    vorrei sapere se è possibile fare la stessa cosa con la rotazione...
    Quindi vuoi proprio ruotare tutto il "contesto grafico" del componente. No, non c'è nulla di già fatto e predefinito. AWT/Swing non offrono nulla a riguardo.
    Ma tecnicamente sarebbe fattibile anche se con un certo (abbastanza) lavoro. E dovresti avere ben chiaro come funziona il painting nei componenti, come usare Graphics2D (specialmente per la rotazione delle coordinate) e come/quando calcolare i nuovi "bounds" (limiti) del componente (se hai un componente 100x50 e lo ruoti di 30 gradi ... quale è la dimensione del componente? I componenti devono comunque occupare una area rettangolare!).

    Se hai tempo/voglia, si potrebbe fare, altrimenti evitalo.
    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
    Jan 2010
    Messaggi
    8
    Grazie 1000 andbin...difatti è una operazione abbastanza complessa...Se volessi sbatterci un pò la testa cosa mi consiglieresti di fare? di vedere un pò la classe Graphics2D e i metodi paint e paintComponents? Attualmente ho MyLabel che eredita da Jlabel, eventualmente da quale classe potrei ereditare per avere la proprietà di rotazione già pronta! Grazie ancora andbin

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da mix99
    Attualmente ho MyLabel che eredita da Jlabel, eventualmente da quale classe potrei ereditare per avere la proprietà di rotazione già pronta!
    Ripeto: nessuna classe già pronta, nessun metodo già pronto, nulla di nulla. La rotazione dei componenti non è gestita "di serie".

    Se volessi solamente realizzare es. un tuo semplice componente che mostra una stringa ruotata di un qualunque angolo, si può fare tranquillamente e senza troppi grattacapi. Basta estendere tipicamente JPanel, fare l'override di paintComponent() e disegnare tu la stringa con le coordinate trasformate opportunamente (traslate e/o ruotate).

    Se invece vuoi fare in modo che un certo componente Swing già esistente possa "disegnarsi" ruotato ... no, qui come ho detto le cose si complicano enormemente. Non l'ho mai fatto. Teoricamente si potrebbe fare ma non vorrei che si andasse incontro a cose strane sul dimensionamento, ecc...

    Quindi: vuoi farti un componente che disegna del testo ruotato? Questo si fa in fretta a farlo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    8
    ok, ti ringrazio molto. Perfetto, credo che gestirò la cosa facendo override di paintComponent..

    potrei estendere la classe Jlabel aggiungendo un nuovo attributo (float rotation_angle) e disegnare la label attraverso paintComponent che effettua prima una rotazione dell'oggetto..

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    8
    Ciao sono riuscito a ruotare la Jlabel grazie ai consigli di andbin e a del codice che ho trovato in rete e che vi posto:
    <code>

    import java.awt.*;
    import java.awt.geom.AffineTransform;
    import javax.swing.*;
    import javax.swing.event.*;

    public class RotLabel {
    int angle = 0;

    private JPanel getContent() {
    label.setFont(new Font("Monospaced", Font.PLAIN, 24));
    label.setBorder(BorderFactory.createEtchedBorder() );
    JPanel panel = new JPanel(new GridBagLayout());
    panel.add(label, new GridBagConstraints());
    return panel;
    }

    private JLabel label = new JLabel("hello world") {
    protected void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D)g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASIN G,
    RenderingHints.VALUE_ANTIALIAS_ON);
    AffineTransform aT = g2.getTransform();
    Shape oldshape = g2.getClip();
    double x = getWidth()/2.0;
    double y = getHeight()/2.0;
    aT.rotate(Math.toRadians(angle), x, y);
    // g2.transform(aT);
    g2.setTransform(aT);
    g2.setClip(oldshape);
    super.paintComponent(g);
    }
    };

    private JSlider getSlider() {
    final JSlider slider = new JSlider(-180, 180, angle);
    slider.addChangeListener(new ChangeListener() {
    public void stateChanged(ChangeEvent e) {
    angle = slider.getValue();
    label.getParent().repaint();
    }
    });
    return slider;
    }

    public static void main(String[] args) {
    RotLabel rotLabel = new RotLabel();
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.add(rotLabel.getContent());
    f.add(rotLabel.getSlider(), "Last");
    f.setSize(400,400);
    f.setLocation(100,100);
    f.setVisible(true);
    }
    }

    </code>

    il problema adesso è che ho soltanto una visualizzazione dell'oggetto e non le sue proprietà. Mi spiego meglio: MyJlabel ha la capacità di spostarsi e ridimensionarsi. Se ad esempio clicco su un angolo dell'oggetto e lo trascino questo si ridimensiona. Dopo la trasformazione, il tutto continua a funzionare, ma devo cliccare sul riquadro originario e non su quello che visualizzo. è come se l'anima dell'oggetto rimanesse uguale, quindi i punti della Label che devo cliccare per fare le trasformazioni, non sono quelle che visualizzo ma quelle originarie...cosa dovrei fare? bisogna ricalcolare i punti dellalabel ruotata?
    grazie ancora per il supporto....

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.