Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    502

    [Java] JTree e dimensione JScrollPane che lo contiene

    Ciao a tutti.
    Ho un JFrame con layout BorderLayout. In CENTER metto un pannello.
    In SOUTH un pannello con dei pulsanti.
    In WEST metto un JTree dentro unoJScrollPane per controllare cosa visualizzo in CENTER.
    Mi crea tutto, solo che non riesco a fare in modo che lo JScollPane in WEST assuma come dimensione, la massima che può prendere a causa di JTree espanso.
    In pratica vorrei che le dimensioni iniziali fossero tali da permettere di vedere tutte le foglie del JTree.
    Ho provano con setPreferredSize, ma senza risultati.

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

    Re: [Java] JTree e dimensione JScrollPane che lo contiene

    Originariamente inviato da Rubox
    In WEST metto un JTree dentro unoJScrollPane per controllare cosa visualizzo in CENTER.
    Mi crea tutto, solo che non riesco a fare in modo che lo JScollPane in WEST assuma come dimensione, la massima che può prendere a causa di JTree espanso.
    In WEST c'è un JScrollPane. La sua dimensione non dipende da quella del JTree contenuto come "view".
    Nella parte WEST viene rispettato solo il preferred width del componente, l'altezza è quella del contenitore meno quelle di NORTH/SOUTH.

    Originariamente inviato da Rubox
    In pratica vorrei che le dimensioni iniziali fossero tali da permettere di vedere tutte le foglie del JTree.
    Se vuoi dimensionare all'inizio (quando crei la interfaccia utente), ammesso di avere o impostare il JTree tutto "aperto" puoi fare così.

    Estendi JScrollPane e fai l'override di getPreferredSize() e gli fai restituire la dimensione della view con: getViewport().getView().getPreferredSize()
    Appena prima di visualizzare il frame fai un pack() sul frame. Questo fa sì che i componenti si dimensionino alla dimensione "preferita". E pertanto il JScrollPane si dimensiona in base alla dimensione della view (il tuo JTree).
    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
    Feb 2009
    Messaggi
    502
    Io ho fatto così, ma non funziona.

    codice:
    public class MyFrame extends javax.swing.JFrame implements TreeSelectionListener {
    
    
        public MyFrame(String titolo) {
            super(titolo);
            tabbedPane = new JTabbedPane();
            this.tabbedPane.setPreferredSize(new Dimension(600, 400));
            scrollPane = new JScrollPane(this.tabbedPane);
            this.getContentPane().add(scrollPane, BorderLayout.CENTER);
            pannelloPulsanti = new JPanel(new FlowLayout());
            this.getContentPane().add(pannelloPulsanti, BorderLayout.SOUTH);
            this.getContentPane().validate();
            this.addWindowListener(new java.awt.event.WindowAdapter() {
    
                @Override
                public void windowClosing(java.awt.event.WindowEvent evt) {
                    closeDialog(evt);
                }
            });
            this.pack();
            this.albero = new JTree();
            // Crea l'albero e lo tiene aggiornato
            creaAlbero();
            albero.addTreeSelectionListener(this);
            MyScrollPane scrollPaneAlbero = new MyScrollPane(albero);
            albero.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
            this.getContentPane().add(scrollPaneAlbero, BorderLayout.WEST);
            this.getContentPane().validate();
            this.pack();
            centraSuSchermo();
        }
    
    class MyScrollPane extends JScrollPane {
    
            public MyScrollPane(Component view) {
                super(view);
            }
    
            @Override
            public Dimension getPreferredSize() {
                return this.getViewport().getView().getPreferredSize();
            }
        }
    
    }
    Evidentemente sto facendo qualche errore che però non riesco a capire / vedere.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Rubox
    Evidentemente sto facendo qualche errore che però non riesco a capire / vedere.
    Innanzitto togli i validate() che servono solo se aggiungi qualcosa dopo che il frame è stato reso "displayable" da un pack() o setVisible(true). Poi togli il primo pack e lascia solo l'ultimo.

    Il MyScrollPane è proprio come pensavo io e dovrebbe essere ok.
    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
    Feb 2009
    Messaggi
    502
    Ho solo dimenticato
    codice:
    for(int i=0;i<albero.getRowCount();i++){
        albero.expandRow(i);
    }
    Anzi, espandendo così l'albero, visualizza le foglie per intero, anche senza estendere JScrollPane.
    Mi guarderò la documentazione per quell'override che hai scritto prima, che prima o poi servirà di nuovo.

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.