Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    repaint JScrollPane in JApplet

    Ciao a tutti,
    è da una settimana che cerco una soluzione a questo problema...

    Ho un MenuItem nella barra dei menu della mia Applet, il quale ha
    come unico scopo quello di incrementare un contatore.
    Tale contatore indica il numero di JLabel che devono essere
    visualizzate nel corpo dell'applet.

    L'applet quindi, oltre alla barra dei menu, presenta un JPanel,
    al cui interno visualizzo le varie label...
    Ovviamente, dato che ad ogni incremento del contatore
    aggiungo una label in una nuova riga, voglio che il pannello
    sia scrollabile, così ho deciso di usare il JScrollPane.

    Il problema è questo: nel metodo makeWindow, che richiamo
    ogni qual volta incremento il contatore, creo le label,
    le aggiungo al JPanel e quindi setto il viewPort del JScrollPane
    al pannello... ma non si esegue il refresh del pannello! si
    esegue solo se, nell'appletViewer di Eclispe che sto usando,
    modifico la dimensione della finestra...

    Ma la cosa più bella è che, se anziché estendere JApplet estendo
    JFrame, tutto funziona regolarmente e perfettamente!

    Aiutatemi, vi prego!

    ecco il codice:

    codice:
    import java.awt.Graphics;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JApplet;
    import javax.swing.JLabel;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.ScrollPaneConstants;
    import javax.swing.event.MenuEvent;
    import javax.swing.event.MenuListener;
    
    
    public class Test extends JApplet {
    
    	private static final long serialVersionUID = 9064643650398109303L;
    
    	public JPanel panel;
    	public JScrollPane scrollPane;
    
    	private JMenuBar bar;
    	private JMenu menu;
    	private JMenuItem nuovo;
    
        int num_labels;
        private JLabel labels[]; 
    	
    	
    	public Test() {
    		
    		num_labels = 0;
    		
    		//menu bar
    		bar = new JMenuBar(); // create menu bar
    		setJMenuBar( bar ); // add menu bar to application
    		
    		//menu
    		menu =  new JMenu( "Menu" ); // create menu to create a new Label
    		menu.setMnemonic( 'M' ); // set mnemonic to M
    		bar.add( menu ); // add menu to menu bar
    
    		menu.addMenuListener(new MenuListener() {
    			@Override
    			public void menuSelected(MenuEvent arg0) {
    				;
    			}
    			@Override
    			public void menuDeselected(MenuEvent arg0) {
    				//repaint applet
    				Test.this.makeWindow();
    			}
    			@Override
    			public void menuCanceled(MenuEvent arg0) {
    				//repaint applet
    				Test.this.makeWindow();
    			}
    		});
    		
    		//menu > nuovo
    		nuovo = new JMenuItem( "Nuovo" );
    		nuovo.setMnemonic( 'N' ); // set mnemonic to N
    		menu.add( nuovo ); // add item nuovo to menu
    		nuovo.addActionListener(
    				new ActionListener() // anonymous inner class
    				{
    					public void actionPerformed( ActionEvent event ){
    
    						//let's increment labels to show
    						num_labels++;
    						//repaint applet
    						Test.this.makeWindow();
    						
    					} // end method actionPerformed
    				} // end anonymous inner class
    		); // end call to addActionListener
    		
    		makeWindow();
    	}
    
    	public void makeWindow(){
    		
    		panel = new JPanel(new GridLayout(10, 1));
    		if(num_labels != 0)
    			labels = new JLabel[num_labels];
    		scrollPane = new JScrollPane();
    		
    		this.setContentPane(scrollPane);
    		this.setSize(500,300);
    
    		for(int i=0; i<num_labels; i++)
    		{
    			labels[i] = new JLabel("label: " + (i+1));
    			panel.add(labels[i]);
    		}
    
    		scrollPane.setViewportView(panel);
    		scrollPane.setWheelScrollingEnabled(true);
    		scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
    		scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    
    		this.setVisible(true);
    	}
    	
    	public void paint(Graphics g){
    		super.paint(g);
    		makeWindow();
    	}
    	
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    scusami ma non mi sembra una buona strategia ricreare lo scrollpane ogni volta che si modifica il numero delle label. Aggiungi semplicemente la nuova label allo scrollpane esistente e fai il repaint di quest'ultimo.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3

    repaint JScrollPane in JApplet [RISOLTO]

    Non ci credo!!!!!
    bastava solo mettere la riga di codice

    codice:
    scrollPane = new JScrollPane();
    nel costruttore?!?!

    Beh, funziona!!! GRAZIE INFINITE!!!


    NB: quello che ho mostrato è un estratto di un progetto
    che sto portando avanti, e, secondo tale progetto, da
    un repaint all'altro dell'applet ho la necessità di modificare
    dei labels inseriti in precedenza, per cui mi è necessario
    ricreare il pannello e reinserire le labels
    ma in effetti non c'è motivo di instanziare nuovamente
    allo scrollPane! grazie ancora!

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.