Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Mate X7 rinnova la sfida nel segmento dei pieghevoli premium puntando su un design ancora più sottile e resistente, unito al ritorno dei processori proprietari della serie Kirin. L'assenza dei servizi Google e del 5G pesa ancora sull'esperienza utente, ma il comparto fotografico e la qualità costruttiva cercano di compensare queste mancanze strutturali con soluzioni ingegneristiche di altissimo livello
Nioh 3: souls-like punitivo e Action RPG
Nioh 3: souls-like punitivo e Action RPG
Nioh 3 aggiorna la formula Team NINJA con aree esplorabili più grandi, due stili di combattimento intercambiabili al volo (Samurai e Ninja) e un sistema di progressione pieno di attività, basi nemiche e sfide legate al Crogiolo. La recensione entra nel dettaglio su combattimento, build, progressione e requisiti PC
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
La facilità di installazione e la completa automazione di tutte le fasi di utilizzo, rendono questo prodotto l'ideale per molti clienti. Ecco com'è andata la nostra prova in anteprima
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-10-2008, 16:51   #1
Mesh89
Member
 
Iscritto dal: Dec 2006
Messaggi: 198
[JAVA] Problemi con JPanel

Ecco il codice. Il problema è che, nel metodo initClientePanel, quando cerco di fare add, mi lancia un NullPointerException. Investigando, ho scoperto che clientePanel, al momento della add, è a null.

Codice:
import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;


public class NewGUI extends JFrame {
	private static NewGUI inst;
	private Core coreProgramma = new Core(); 
	
	private JPanel clientiPanel;
	private JPanel progettiPanel;
	private JPanel preventiviPanel;
	private JPanel fatturePanel;

	private DefaultTableModel clientiListData;
	private JTable clientiList;
	
	private JButton apriAggiungiClienteFrameButton;

	
	private NewGUI(int width, int height) {
		setTitle("Gestione fatture");
		setSize(new Dimension(width, height));
		setLocation(100,100);
		this.setLayout(new BoxLayout(getContentPane(), BoxLayout.X_AXIS));
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		setVisible(true);
	}
	
	private static void createAndShowGUI() {
		inst = new NewGUI(1024,768);
		inst.initMainPanels();
		
		inst.pack();
		inst.setVisible(true);
	}
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
	}
	
	private void initMainPanels() {
		initMainPanel(clientiPanel);
		initClientiPanel();
		
		initMainPanel(progettiPanel);
		initMainPanel(preventiviPanel);
		initMainPanel(fatturePanel);
	}
	private void initMainPanel(JPanel panel) {
		panel = new JPanel(new GridBagLayout());
		
		panel.setPreferredSize(new Dimension(this.getWidth()/4, this.getHeight()));
		panel.setBorder(new LineBorder(Color.GRAY));
		
		this.add(panel);
		panel.setVisible(true);
	}
	
	private void initClientiPanel() {
		GridBagConstraints c = new GridBagConstraints();
		
		clientiListData = new DefaultTableModel(0,1);
		clientiList = new JTable(clientiListData);

		/*clientiList.setBorder(new LineBorder(Color.GRAY));
		clientiList.setPreferredSize(new Dimension(clientiPanel.getWidth(), (int)((3.0/4.0)*clientiPanel.getHeight())));
		clientiList.getColumnModel().getColumn(0).setCellRenderer(MyCellRenderer.MY_RENDERER);
		clientiList.setVisible(true);*/
		
		//clientiPanel.add(clientiList, c);
		
		apriAggiungiClienteFrameButton = new JButton("Aggiungi cliente");
		c.fill = GridBagConstraints.HORIZONTAL;
		c.weightx = 0.5;
		c.gridx = 0;
		c.gridy = 0;
		
		if (clientiPanel == null) System.out.println("Errore");
		clientiPanel.add(apriAggiungiClienteFrameButton);
	}
	private void fillClientiListData()
	{
		for (int i = clientiListData.getRowCount()-1; i >= 0; i--)
			clientiListData.removeRow(i);
	
		for (Cliente c : coreProgramma.getClientiList())
			clientiListData.addRow(new Object[] {
				"<HTML>"+c.getSocieta()+"<br>"+
				c.getAnagrafica().getNome()+" "+c.getAnagrafica().getCognome()+"<br>"+
				"</HTML>"
			});
	}
	
	static class MultilineCellRenderer extends DefaultTableCellRenderer {
		public static final MultilineCellRenderer MY_RENDERER = new MultilineCellRenderer();

		public Component getTableCellRendererComponent (JTable table, Object value,
				boolean isSelected, boolean hasFocus,
				int row, int column) {
			Component c = super.getTableCellRendererComponent (table, value,
					isSelected, hasFocus, row, column);
			int height = c.getPreferredSize ().height;
			if (height > table.getRowHeight (row)) {
				table.setRowHeight (row, height);
			}
			return c;
		}
	}
}
Eppure nel metodo initMainPanel(clientePanel) avrebbe dovuto inizializzarla, no?
Purtroppo in Java sono abbastanza niubbo, è praticamente la prima volta che ci lavoro, per cui probabilmente è una cavolata o una sfumatura del linguaggio che non conosco, e che qualcuno più esperto di me troverà sicuramente
Mesh89 è offline   Rispondi citando il messaggio o parte di esso
Old 12-10-2008, 18:25   #2
Mixmar
Senior Member
 
L'Avatar di Mixmar
 
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
L'errore è sul passaggio di parametri, che in Java avviene sempre per valore. Quando tu chiami il metodo che inizializza clientiPanel, initMainPanel, gli passi clientiPanel, che in quel momento vale null, crei un nuovo oggetto JPanel e lo inizializzi: ma questo oggetto non "torna indietro" alla chiusura del metodo come ti aspetteresti, e quindi la clientPanel che hai passato è ancora null come prima dell'esecuzione di initMainPanel.

Per spiegare meglio: la variabile panel di tipo JPanel nel metodo initMainClient viene inizializzata dentro il metodo stesso, quando chiami la new; da quel momento in poi, qualsiasi azione tu faccia va ad influire sulla nuova istanza di JPanel, non su quella vecchia che tu hai passato. Solo che la nuova istanza è referenziata da una sola variabile, quella panel di cui abbiamo appena parlato: siccome è locale al metodo (in quanto parametro di ingresso), appena finito viene "buttata via", e l'oggetto viene dereferenziato (in realtà no, per via di quella "this.add", ma questo è un effetto collaterale).

In questi casi le soluzioni sono (almeno?) due: o fai sì che il metodo initMainClient ritorni un riferimento al JPanel creato, così:

Codice:
	private void initMainPanels() {
		clientiPanel = initMainPanel();
		initClientiPanel();
		
		initMainPanel(progettiPanel);
		initMainPanel(preventiviPanel);
		initMainPanel(fatturePanel);
	}
	private JPanel initMainPanel() {
		panel = new JPanel(new GridBagLayout());
		
		panel.setPreferredSize(new Dimension(this.getWidth()/4, this.getHeight()));
		panel.setBorder(new LineBorder(Color.GRAY));
		
		this.add(panel);
		panel.setVisible(true);
                
               return panel;
	}
Oppure sfrutti il fatto che clientiPanel ha visibilità a livello di classe, e semplicemente operi su quello anzichè sulla variabile locale panel nel metodo initMainPanel (come peraltro fai già sotto):

Codice:
	private void initMainPanels() {
		initMainPanel();
		initClientiPanel();
		
		initMainPanel(progettiPanel);
		initMainPanel(preventiviPanel);
		initMainPanel(fatturePanel);
	}
	private void initMainPanel(JPanel panel) {
		clientiPanel = new JPanel(new GridBagLayout());
		
		clientiPanel.setPreferredSize(new Dimension(this.getWidth()/4, this.getHeight()));
		clientiPanel.setBorder(new LineBorder(Color.GRAY));
		
		this.add(clientiPanel);
		clientiPanel.setVisible(true);
	}
__________________
"Et Eärallo Endorenna utúlien. Sinome maruvan ar Hildinyar tenn' Ambar-metta!" -- Aragorn Elessar, Heir of Isildur
Mixmar -- OpenSuSE 11.1 on AMD 64 3000+ on DFI LanParty nF4-D | GeForce 6600 GT + Thermaltake Schooner on Samsung 710N
Storage -- ( 2 x Hitachi Deskstar 80 Gb + 1 x Hitachi 250 Gb ) = 1 RAID 5 + 1 Storage space LaCie Ethernet Disk Mini 250 Gb | HP - DV2150 EL MILAN CLAN
Mixmar è offline   Rispondi citando il messaggio o parte di esso
Old 12-10-2008, 19:41   #3
Mesh89
Member
 
Iscritto dal: Dec 2006
Messaggi: 198
Caspita, ma sai che, non so perchè, ero convinto che avvenisse sempre per referenza? O.o

Ora tutto quadra, grazie mille, credo proprio che andrò per il primo metodo
Mesh89 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker DJI RS 5: stabilizzazione e tracking intelligent...
Cubi Z AI 8M visto da vicino, un mini-PC...
Datacenter nello Spazio, affascinante ma...
Social e minori, Butti apre al dibattito...
Tutte le offerte Amazon del weekend, sol...
Amazon spinge sull'usato garantito: 10% ...
TikTok rischia una maxi-multa in Europa:...
Bose su Amazon: QuietComfort SC over ear...
Scope elettriche super accessoriate in o...
Umidità e muffa addio: questo deu...
DREAME Aqua10 Ultra Roller a 999€ &egrav...
500.000 kit gratis consegnati: Noctua fa...
Il MIT sperimenta il calcolo termico: op...
Sembra ormai certo: la prossima Xbox sar...
"Solutions Beyond Displays": l...
La società europea The Exploratio...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 14:11.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v