Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    39

    Problema con GridBagLayout

    Ciao a tutti,sono nuovo del forum, ho un problema con il GridBagLayout.
    In sostanza devo mappare il contenuto di una matrice di stringhe in un pannello contenente una matrice di JLabel.Il pannello e' contenuto in una JScrollPane e il layout e' il GridBagLayout.Questo e' il codice del costruttore e dei metodi predisponi e disegna:

    codice:
             public Gant(String[][]m){
                    this.m=m;
                    mypanel=new JPanel();
    		mypanel.setLayout(null);
    		mypanel.setBounds(this.getX(), this.getY(), this.getWidth(),this.getHeight());
    		this.setContentPane(mypanel);
                    layout = new GridBagLayout();
    		lim = new GridBagConstraints();
    		pannelloGant = new JPanel();
    		pannelloGant.setLayout(layout);
    		scrollpane=new JScrollPane(pannelloGant);
    		scrollpane.setBounds(30, 30, this.getWidth()-90, this.getHeight()-300 );
    		scrollpane.setVisible(true);
    		scrollpane.setViewportView(pannelloGant);
    		mypanel.add(scrollpane);
    		predisponi(m);
    		disegna(m);
    		mypanel.repaint();
    		this.setVisible(true);
                   }
                public void predisponi(String[][]sol){
    
                    ma=new JLabel[sol.length][sol[0].length];
                    Dimension d=pannelloGant.getSize();
    
                    if(d.width<sol[0].length*50){
        	               d.width=(sol[0].length*50);
        	               pannelloGant.setPreferredSize(d);
        	               pannelloGant.repaint();
                        }
                    if(d.height<sol.length*50){
        	               d.height=(sol.length*50);
        	               pannelloGant.setPreferredSize(d);
        	               pannelloGant.repaint();
                       }
    		for (int i = 0; i < ma.length; ++i) {
    			for (int j = 0; j < ma[0].length; ++j) {
    				ma[i][j]=new JLabel(new ImageIcon(""),JLabel.CENTER);
    				ma[i][j].setOpaque(true);
    				ma[i][j].setBorder(BorderFactory.createEtchedBorder());
    				ma[i][j].setBackground(Color.black);
    				lim.gridx = j;
    				lim.gridy = i; 
    				lim.weightx = 1;
    				lim.weighty = 1;
    				lim. fill = GridBagConstraints.BOTH;
    				lim.insets.top = 0;
    				lim.insets.bottom = 0;
    				lim.insets.left = 0;
    				lim.insets.right = 0;
    				layout.setConstraints(ma[i][j], lim);
    				pannelloGant.add(ma[i][j],0);
                                    pannelloGant.repaint();
    			}
    		     }
    	          }
               public void disegna(String[][]sol){
    		for (int i=0;i<sol.length;i++){
    			for(int j=0;j<sol[0].length;j++){
    				if(sol[i][j].equals("*"))
    					ma[i][j].setBackground(Color.yellow);     
    			}
    		  }
    	   }




    Come si vede dall'immagine quando il numero di colonne*50 supera l'ampiezza del pannello
    viene disegnato (al bordo sinistro e destro del pannello) uno spazio bianco della jScrollpane.
    Non riesco a capire perche' il GridBagLayout con uno JscrollPane non riempie tutto il pannello, spero possiate darmi una mano.
    Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    39
    Buon giorno a tutti, non capisco perche' il GridBagLayout non ridimensiona le JLabel su tutto il pannello,potete inviarmi qualche guida dove spiega il ridimensionamento del GridBagLayout con una JscrollPane?
    Grazie

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Non ho controllato tutto il codice ma questa frase qua mi fa supporre che forse stai prendendo il problema dalla parte sbagliata:

    qualche guida dove spiega il ridimensionamento del GridBagLayout con una JscrollPane
    1) GridBagLayout è un LayoutManager. I LayoutManager sono responsabili del posizionamento e dimensionamento dei componenti all'interno di un Container. Non hanno nulla a che vedere con il JScrollPane che è un componente particolare

    2) JScrollPane lavora "solo" con componenti scrollabili (ovvero, che implementano l'interfaccia Scrollable). Se il componente che si tenta di usare con JScrollPane non implementa tale interfaccia, allora tutto il lavoro di dimensionamento e notifica necessario al JScrollPane va fatto a mano.

    3) JPanel non implementa Scrollable quindi, stando a quanto detto prima, non è un "buon candidato" per essere usato con JScrollPane. Questo non significa che non lo si possa usare, anzi... spesso i componenti personalizzati lo usano con tale controllo... ma... tutto il lavoro di ridimensionamento e relativa notifica al JScrollPane va fatta a mano e può non essere una cosa così banale. Anche perchè, per ottenere il risultato voluto, occorre creare una nuova classe che estende JPanel e si occupa della notifica di cui sopra.

    Detto questo... se hai comportamenti "inaspettati" da parte del tuo pannello con il GridBagLayout, al 99,99% il problema non è nel GridBagLayout, ma nella mancata notifica da parte del tuo pannello degli eventi di ridimensionamento al JScrollPane.


    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
    May 2012
    Messaggi
    39
    Grazie LeleFT per i tuoi suggerimenti grazie hai quali sono riuscito a risolvere il problema.
    Saluti

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.