Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304

    [Java] JScrollPane non visualizza la barra di scorrimento

    Ciao.

    Ho un piccolo problema che è la prima volta che mi capita: io ho uno JSplitPane che visualizza 2 componenti.
    Uno di questi componenti è uno JScrollPane contenente un pannello con diverse JTable una sotto l'altra. (Ognuna di queste JTable ovviamente è all'interno di uno JScrollPane). Questa è la struttura:
    codice:
    public class Tabelle extends JPanel {
    
       private JScrollPane jsp1, jsp2, ...
       private JTable t1, t2, ...
    
       public Tabelle(...) {
          setLayout(null);
          t1 = new JTable(...);
          t2 = new JTable(...);
          ...
          jsp1 = new JScrollPane(t1);
          jsp2 = new JScrollPane(t2);
          ...
          add(jsp1);
          add(jsp2);
          ...
       }
    }
    
    // Nella classe principale
    JScrollPane jsp = new JScrollPane( new Tabelle(...) );
    JSplitPane split = new JSplitPane(..., jsp);  // Visualizzo sulla destra le tabelle
    Il problema è che, sebbene il pannello sia più lungo del JScrollPane, quest'ultimo non visualizza la barra di scorrimento verticale e, di conseguenza, solo alcune delle tabelle sono visibili, le altre, che stanno sotto, al di fuori della parte visibile, non compaiono a video.

    Qualcuno ha idea di come risolvere tale problema? Ho provato anche a ridefinire il metodo paintComponent() della classe Tabelle in modo da settarne la dimensione più grande del suo contenitore, ma nulla.

    Ringrazio chiunque si voglia prodigare per risolvere questo problema.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    invece di setLayout(null); provare ad utilizzare un layout manager?

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    No... non ha a che fare con i LayoutManager. In altre applicazioni funziona perfettamente, in quest'ultima no.

    Visto che uso anche delle etichette descrittive per le tabelle, se uso un LayoutManager non mantengo le dimensioni volute queste etichette. (GridLayout)

    Ho provato ad usare un GridBagLayout, ma, a parte che non capisco quale astrusa logica abbia usato il progettista di tale LayoutManager, non ottengo risultati decenti.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    ho scritto il seguente codice.
    La barra verticale mi compare.
    Ti ho messo anche la descrizione della tabella.
    Dimmi se è anche solo lontanamente quello che volevi.

    codice:
    import javax.swing.BoxLayout;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JSplitPane;
    import javax.swing.JTable;
    import javax.swing.JTextArea;
    
    public class Tabelle extends JPanel {
    
        private JScrollPane jsp1, jsp2;
        private JLabel j1;
        private JTable t1, t2;
    
        public Tabelle() {
            //setLayout(null);
            setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
    
            String[] columnNames = { "First Name", "Last Name", "Sport", "# of Years", "Vegetarian" };
    
            Object[][] data = { { "Mary", "Campione", "Snowboarding", new Integer(5), new Boolean(false) },
                    { "Alison", "Huml", "Rowing", new Integer(3), new Boolean(true) },
                    { "Kathy", "Walrath", "Knitting", new Integer(2), new Boolean(false) },
                    { "Sharon", "Zakhour", "Speed reading", new Integer(20), new Boolean(true) },
                    { "Philip", "Milne", "Pool", new Integer(10), new Boolean(false) } };
    
            t1 = new JTable(data, columnNames);
            t2 = new JTable(data, columnNames);
    
            jsp1 = new JScrollPane(t1);
            jsp2 = new JScrollPane(t2);
    
            j1 = new JLabel("Descrizione prima tabella");
            
            add(j1);
            add(jsp1);
            add(jsp2);
    
        }
    
        public static void main(String[] args) {
            //      Nella classe principale
            JScrollPane jsp = new JScrollPane(new Tabelle());
            JTextArea jta = new JTextArea("\n\n\n\n");
            JSplitPane split = new JSplitPane(JSplitPane.VERTICAL_SPLIT, jta, jsp);
            JFrame frame = new JFrame();
            frame.getContentPane().add(split);
            frame.setSize(600, 400);
            frame.setVisible(true);
        }
    }

  5. #5
    Anche a me funziona solo se togli il setLayout(null)


    codice:
    class libri extends JFrame {
    
    	private libri()
    	{
    
            // calcola le dimensioni in base alla risoluzione del monitor
            int inset = 70;
            Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
            setBounds(inset, inset, 
                      screenSize.width - inset*2, 
                      screenSize.height-inset*2);
                      
            JScrollPane jsp = new JScrollPane( new Tabelle() );
            JPanel pippo =new JPanel();
    		JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,pippo, jsp);
    		getContentPane().add(split);
            
    	}
    		public static void main(String[] args)
    		{
    		libri l = new libri();
    		l.setVisible(true);
    	}
    }		
    class Tabelle extends JPanel 
    {
    
       private JScrollPane jsp1, jsp2,jsp3;
       private JTable t1, t2,t3;
    
       public Tabelle() 
       {
          //setLayout(null);//questo mi sembra non serva a molto
          t1 = new JTable(5,5);
          t2 = new JTable(5,5);
          t3 = new JTable(5,5);
    
          jsp1 = new JScrollPane(t1);
          jsp2 = new JScrollPane(t2);
          jsp3 = new JScrollPane(t3);
    
          add(jsp1);
          add(jsp2);
          add(jsp3);
    
       }
    }
    Naturalmente è codice buttato giù in cinque minuti quindi lascia perdere l'estetica di ciò che non riguarda il tuo problema.
    Sul settare a null il layout manager non ho trovato nulla neanche nella doc,probabilmente non è una pratica molto ortodossa,c'è di sicuro qualche altro modo per ottenere le cose come le vuoi tu
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    @ unomichisiada: Ho visto che la barra di scorrimento appare, però rimane il fatto che esteticamente non va bene: c'è troppo spazio fra una tabella e l'altra.

    PS: Il setLayout(null) ha senso in quanto ho usato setBounds() per posizionare gli oggetti in modo da decidere autonomamente la distanza fra una tabella e l'altra.

    @ tutti: Se esiste un LayoutManager in grado di permettermi di posizionare in modo più flessibile gli oggetti, lo userei ben volentieri!


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    così può andare?

    codice:
    
    import javax.swing.BoxLayout;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JSplitPane;
    import javax.swing.JTable;
    import javax.swing.JTextArea;
    
    public class Tabelle extends JPanel {
    
        private JScrollPane jsp1, jsp2;
        private JLabel j1, j2, j3, j4;
        private JTable t1, t2, t3, t4;
    
        public Tabelle() {
            //setLayout(null);
            setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
    
            String[] columnNames = { "First Name", "Last Name", "Sport", "# of Years", "Vegetarian" };
    
            Object[][] data = { { "Mary", "Campione", "Snowboarding", new Integer(5), new Boolean(false) },
                    { "Alison", "Huml", "Rowing", new Integer(3), new Boolean(true) },
                    { "Kathy", "Walrath", "Knitting", new Integer(2), new Boolean(false) },
                    { "Sharon", "Zakhour", "Speed reading", new Integer(20), new Boolean(true) },
                    { "Philip", "Milne", "Pool", new Integer(10), new Boolean(false) } };
    
           // t1 = new JTable(data, columnNames);
           // t2 = new JTable(data, columnNames);
    
            t1 = new JTable(5,5);
            t2 = new JTable(5,5);
            t3 = new JTable(5,5);
            t4 = new JTable(5,5);
            
            jsp1 = new JScrollPane(t1);
            jsp2 = new JScrollPane(t2);
    
            j1 = new JLabel("Descrizione prima tabella");
            j2 = new JLabel("Descrizione seconda tabella");
            j3 = new JLabel("Descrizione terza tabella");
            j4 = new JLabel("Descrizione quarta tabella");
            
            add(j1);
            add(t1);
            add(j2);
            add(t2);
            add(j3);
            add(t3);
            add(j4);
            add(t4);
            //add(jsp1);
            //add(jsp2);
    
        }
    
        public static void main(String[] args) {
            //      Nella classe principale
            JScrollPane jsp = new JScrollPane(new Tabelle());
            JTextArea jta = new JTextArea("\n\n\n\n");
            JSplitPane split = new JSplitPane(JSplitPane.VERTICAL_SPLIT, jta, jsp);
            JFrame frame = new JFrame();
            frame.getContentPane().add(split);
            frame.setSize(600, 400);
            frame.setVisible(true);
        }
    }

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Ehm... qui lo spazio è addirittura annullato... (dal troppo al niente, senza mezze misure ).

    Vabbè... per stasera sono finito, farò ulteriori prove domani, cercando di venirne fuori.

    Grazie ad entrambi!

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    creare lo spazio è il problema minore. una soluzion è quella di mettere una jlabel vuota
    codice:
    import javax.swing.BoxLayout;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JSplitPane;
    import javax.swing.JTable;
    import javax.swing.JTextArea;
    
    public class Tabelle extends JPanel {
    
        private JScrollPane jsp1, jsp2;
        private JLabel j1, j2, j3, j4, j5;
        private JTable t1, t2, t3, t4;
    
        public Tabelle() {
            
            setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
    
            t1 = new JTable(5,5);
            t2 = new JTable(5,5);
            t3 = new JTable(5,5);
            t4 = new JTable(5,5);
            
            j1 = new JLabel("Descrizione prima tabella");
            j2 = new JLabel("Descrizione seconda tabella");
            j3 = new JLabel("Descrizione terza tabella");
            j4 = new JLabel("Descrizione quarta tabella");
            j5 = new JLabel(" ");<-- per creare lo spazio
            
            add(j1);
            add(t1);
            add(j5);
            add(j2);
            add(t2);
            add(j3);
            add(t3);
            add(j4);
            add(t4);
    
        }
    
        public static void main(String[] args) {
            //      Nella classe principale
            JScrollPane jsp = new JScrollPane(new Tabelle());
            JTextArea jta = new JTextArea("\n\n\n\n");
            JSplitPane split = new JSplitPane(JSplitPane.VERTICAL_SPLIT, jta, jsp);
            JFrame frame = new JFrame();
            frame.getContentPane().add(split);
            frame.setSize(600, 400);
            frame.setVisible(true);
        }
    }

  10. #10
    Infatti!ha ragione abcd1000,lospazio è il minore dei problemi:meglio delle JLabel vuote esistono dei componenti fatti apposta per occupare spazio e basta,dai uno sguardo alla documentazione della jdk.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

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 © 2024 vBulletin Solutions, Inc. All rights reserved.