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

    [Java] add() di un JPanel threaded

    codice:
    public class MainX extends JFrame {
    	private static JPanel areasgraph = new JPanel();
    	private static JPanel zonesgraph = new JPanel();
    	/* ... */
    	
    	public MainX() {
    		final JPanel sx = new JPanel();
    		sx.setLayout(new GridLayout(2,1));
    		/* ... */
    		areasgraph.setBorder(new TitledBorder(new LineBorder(Color.BLACK), "Areas graph", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.TOP, new Font("Verdana", Font.PLAIN, 12)));
    		areasgraph.setPreferredSize(new Dimension(700,348));
    		areasgraph.setLayout(new BorderLayout());
    		sx.add(areasgraph);
    		/* ... */
    		JPanel buttonspanel = new JPanel();
    		buttonspanel.setLayout(new GridLayout(2,2));
    		final JButton startb = new JButton("Start");
    		final JButton stopb = new JButton("Stop");
    		stopb.setEnabled(false);
    		/* ... */
    		class ButtonListeners implements ActionListener {
    			public void actionPerformed(ActionEvent e) {
    				if((JButton)e.getSource() == startb) {
    					startb.setEnabled(false);
    					stopb.setEnabled(true);
    
    					w = new World(areasN, maxzones, maxpeople);
    
    					AreaGrapher a = new AreaGrapher(w);
    					areasgraph.add(a); // <-- questo non sembra avvenire!!
    					/* ... */
    			}
    		}
    		
    		ActionListener buttonslistener = new ButtonListeners();
    		/* ... */
    		startb.addActionListener(buttonslistener);
    		/* ... */
    		add(sx);
    		/* ... */
    		setVisible(true);
    	}
    }
    codice:
    public class AreaGrapher extends JPanel implements Runnable {
    	private Thread t;
    	private World localw;
    	private int areasN, areasPeopleN[];
    	private AreaGraphBars[] bars;
    	private Random rand = new Random();
    	
    	public AreaGrapher(World w) {
    		int i;
    		localw = w;
    		
    		areasN = localw.getAreasN();
    		bars = new AreaGraphBars[areasN];
    		areasPeopleN = localw.getAreasPeopleN();
    		setLayout(new GridLayout(areasN,1));
    		
    		for(i=0; i<areasN; i++) {
    			bars[i] = new AreaGraphBars(new Color(rand.nextInt(0xFFFFFF)), 0, "A"+i);
    			add(bars[i]);
    		}
    		
    		t = new Thread(this);
    		t.setName("AreaGrapher-Thread");
    		t.start();
    	}
    	
    	public void run() {
    		int i, maxwidth=0;
    		try {
    			while(!Thread.interrupted()) {
    				areasPeopleN = localw.getAreasPeopleN();
    
    				for(i=0; i<areasN; i++) {
    					if(areasPeopleN[i] > maxwidth) {
    						maxwidth = areasPeopleN[i];
    					}
    				}
    
    				for(i=0; i<areasN; i++) {
    					bars[i].setAttr((int)((580*areasPeopleN[i])/maxwidth)-8, areasPeopleN[i]);
    					bars[i].repaint();
    				}
    
    				TimeUnit.SECONDS.sleep(1);
    			}
    		} catch(InterruptedException e) { return; }
    	}
    }
    Succede che quando premo Start, il JPanel a non viene aggiunto ad areasgraph, però facendo un po di debug, il thread viene creato e sembra fare tutto quello che deve fare..
    Idee sul perche' non riesce a vedere il JPanel threadato dentro al JPanel "principale" ?

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    6
    Hum...
    La mia è solo un'idea ma...

    Ci sono 2 cose che mi vengono in mente:

    1) prova a richiamare un repaint() o un update() subito dopo aver aggiunto il JPanel, per ridisegnare l'interfaccia grafica.

    2) Non conosco bene gli oggetti all'interno del JPanel, ma... se nessuno di essi ha una dimensione, può darsi che lo stesso JPanel non abbia dimensione (puoi provare a settarla all'inizio con setSize(int x, int y) ) risultando così presente, ma di dimensione talmente piccola da essere "invisibile".

    Aloha

  3. #3
    ho provato sia con repaint che con update(getGraphics()) e infine a mettere anche una dimensione al pannello (sebbene il pannello in cui e' contenuto abbia un borderlayout e quindi dovrebbe espandersi da solo) ma niente, non me lo visualizza.

  4. #4
    risolto, bisognava fare validate() sul JPanel + esterno

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.