Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    37

    Scroll di un Jframe/Jpanel

    Ciao ragazzi, è da parecchi giorni che sono bloccato su sto problema.

    La classe estende un JPanel
    Viene creato un JFrame

    In questo JFrame vengono inseriti una serie di campi di testo in posizioni fissate col setBounds.

    Purtroppo essendo tantissimi non riesco ad inserirli tutti dentro i 700 px a disposizione del display, di conseguenza mi tocca utilizzare lo spazio sottostante, ma non so come fare a mettere una scrollBar verticale.

    Su google ho trovato molti esempi, ma poi quando provo a modificare il codice accadono cose strane, tipo i JTextArea al posto di essere 20x50 diventano grossi quanto il JFrame e vengono allineati uno accanto all'altro ignorando il setbounds.

    Se potete mi farebbe comodo un codice di esempio spiegato passo passo

    Da quanto ho letto nei vari topic in inglese che ho trovato, questa cosa risulta una boiata di livello astronomico, ma io non riesco a farla

    Grazie in anticipo.

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Premessa: ti consiglio di lavorare con lo Swing Tutorial e la carrellata dei componenti a portata di click... scopriresti che c'è un componente apposito che gestisce in automatico (se vuoi), l'overflow dei contenuti aggiungendo (se vuoi) le necessarie barre di scorrimento: Si chiama JScrollPane.

    Quindi quel che si fa in genere è
    - creare un pannello che contenga tutti i componenti del caso, con la disposizione del caso (se riuscissi ad ottenere lo stesso risultato con un appropriato LayoutManager meglio)
    - creare uno JScrollPane in cui infilare il tuo pannello.
    - aggiungere lo scroll pane dove devi nel frame principale ovvero dove dovrebbe andare-
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    37
    Ci ho provato ma senza risultato, ecco il codice:

    codice:
    class EventScroll{    
    
    //Crea Pannello
      JPanel        Pannello = new JPanel();
    //Crea ScrollPane
      JScrollPane Scroll     = new JScrollPane(); 
    //Crea Frame 
      JFrame      Finestra = new JFrame();
    
    public EventScroll(){
    //Set posizione e grandezza del Frame
      Finestra.setBounds(0, 0, 720, 730); 
      
    //Agggiunge il Frame al Pannello
      Pannello.add(Finestra);
    //Aggiunge il Pannello allo ScrollPane
      Scroll.add(Pannello);
    //Aggiunge lo ScrollPane al Frame.
      Finestra.add(Scroll);
    }
    }
    Ho fatto tutti i passaggi che mi hai indicato ma senza risultati quando avvio il main:
    codice:
    public static void main(String[] args){
        try{
            SwingUtilities.invokeLater(new Runnable(){
                public void run(){ new EventScroll(); }
            });
        }catch(Exception e){ }
    }
    Java mi da una serie di errori e non apre nulla.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    37
    Ho capito il problema, in pratica mettendo il layout null le scrollbar scompaiono.

    L'unica soluzione è usare un layout diverso dal null, ma io ho bisogno di inserire dei campi di testo in posizioni ben definite e della grandezza che voglio io, come posso fare?


    Ho usato questo codice:
    codice:
    import javax.swing.JScrollPane;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class AddScrollBarToJFrame
    {
    public static void main(String[]args)
    {
    //Create a JPanel
    JPanel panel=new JPanel();
    
    //Create a scrollbar using JScrollPane and add panel into it's viewport
    //Set vertical and horizontal scrollbar always show
    JScrollPane scrollBar=new JScrollPane(panel,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    
    //Create a JFrame with title ( AddScrollBarToJFrame )
    JFrame frame=new JFrame("AddScrollBarToJFrame");
    
    //Add JScrollPane into JFrame
    frame.add(scrollBar);
    
    //Set close operation for JFrame
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    //Set JFrame size
    frame.setSize(400,400);
    
    //Make JFrame visible. So we can see it.
    frame.setVisible(true);
    
    //So, if you want to add other component like JTextArea, just add them into JPanel.After that add
    //the JPanel into JScrollPane before add the JScrollPane into JFrame.
    }
    }
    Inserendo qualcosa nel pannello e questa viene visualizzata nella posizione del mio setbounds, ma le scrollbar non scrollano.
    Stessa situazione se porgo sia il Frame che il Panel in layout nullo.
    Se uso invece il GRIDLAYOUT sul panel le scrollbar funzionano alla grande, con l'unico problema che i campi di testo diventano enormi e non li posso posizionare dove voglio io.

    Come posso risolvere?

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    scusa la risposta in ritardo:

    l'apparente vantaggio di setLayout(null) è vanificato, nella maggior parte dei casi, dal numero di situazioni che si devono poi gestire a mano, che invece con un LayoutManager verrebbero gestite in modo trasparente. Una di queste è proprio quel che ritorna getPreferredSize sul JPanel, che per un contenitore senza LayoutManager (o meglio, posto a null) ritorna di default un ricco 0,0 - da cui lo scrollpane senza barre di scorrimento.

    Adesso, se proprio devi, continua ad utilizzare il layout a null, ma bisogna inventarsi un work-around del genere:
    codice:
    import javax.swing.*;
    import java.awt.*;
    
    /**
     *
     * @author Andrea
     */
    public class NullLayoutWithJScrollPane extends JFrame {
        
        
        private class MyNullLayoutJPanel extends JPanel {
            
            public Dimension getPreferredSize() {
                int maxX = 0;
                int maxY = 0;
                Component[] components = this.getComponents();
                for(int i = 0; i < components.length; i++){
                    Rectangle bounds = components[i].getBounds();
                    maxX = Math.max(maxX, (int)bounds.getMaxX());
                    maxY = Math.max(maxY, (int)bounds.getMaxY());
                }	
                return new Dimension(maxX,maxY);
            }
        }
        
        private JScrollPane scrollPane;
        private MyNullLayoutJPanel nullPanel;
        private JButton[] buttons;
        
        public NullLayoutWithJScrollPane() {
            super("test app");
            nullPanel = new MyNullLayoutJPanel();
            nullPanel.setLayout(null);
            buttons = new JButton[20];
            for (int i = 0; i < buttons.length; i++) {
                buttons[i] = new JButton("Button "+i);
                buttons[i].setBounds(10+i*30, 10+i*30, 100, 20);
                nullPanel.add(buttons[i]);
            }
            scrollPane = new JScrollPane(nullPanel);
            this.setSize(400,400);
            
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setVisible(true);
            this.getContentPane().add(scrollPane);
        }
        
        public static void main (String[] args) {
            new NullLayoutWithJScrollPane();
        }
        
        
    }
    oppure, meglio, sforzati di utilizzare un LayoutManager appropriato e lascia che sia questo a determinare lo spazio effettivo occupato dai vari componenti. I vantaggi sono molteplici, anche al costo di dover trimmare e fare del fine-tuning su layout manager "ostici" come GridBagLayout
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    37
    Grazie mille funziona alla grande.

    Mi è rimasto un ultimo problema, utilizzando questo metodo per lo screen del pannello:

    codice:
    public static BufferedImage getScreenShot(
        Component component) {
        BufferedImage image = new BufferedImage(
          component.getWidth(),
          component.getHeight(),
          BufferedImage.TYPE_INT_RGB
          );
        component.paint( image.getGraphics() );
        return image;
    }
    Per effettuare lo screen uso queste istruzioni:

    codice:
            
    
    BufferedImage img = getScreenShot(  NomePannello .getContentPane() );
            JOptionPane.showMessageDialog(
                    null,
                    new JLabel(
                    new ImageIcon(
                        img.getScaledInstance(
                            img.getWidth(null)/2,
                            img.getHeight(null)/2,
                            Image.SCALE_SMOOTH )
                     )));
             String NomeImmagine = EVENTO.getText();            
    
             try {
                ImageIO.write(
                        img,
                        "png",
                new File(NomeImmagine+".png"));
             } 
             catch(Exception A){}
    Al posto del nome pannello, per fare lo screen del "nullPanel" devo lasciare semplicemente getContentPane() .
    A questo punto lo screen viene fatto, ma solo della parte a vista dello scroll, la parte sottostante o sovrastante non viene visualizzata.
    Posso risolvere? O mi conviene spezzettare il pannello in più parti?

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.