Torna indietro   Hardware Upgrade Forum > Software > Programmazione

ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN è il primo monitor gaming con pannello QD-OLED Gen 5 a layout RGB Stripe Pixel e 360 Hz su 34 pollici: lo abbiamo misurato con sonde colorimetriche e NVIDIA LDAT. Ecco tutti i dati
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Nothing Phone (4a) Pro cambia pelle: l'alluminio unibody sostituisce la trasparenza integrale, portando una solidità inedita. Sotto il cofano troviamo uno Snapdragon 7 Gen 4 che spinge forte, mentre il display è quasi da top dig amma. Con un teleobiettivo 3.5x e la Glyph Matrix evoluta, è la prova di maturità di Carl Pei. C'è qualche compromesso, ma a 499EUR la sostanza hardware e la sua unicità lo rendono un buon "flagship killer" in salsa 2026
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro
Con Midnight, Blizzard tenta il colpaccio: il player housing sbarca finalmente su Azeroth insieme a una Quel'Thalas ricostruita da zero. Tra il dramma della famiglia Ventolesto e il nuovo Prey System, ecco com'è la nuova espansione di World of Warcraft
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-10-2008, 15: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, 17: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, 18: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


ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz ASUS ROG Swift OLED PG34WCDN recensione: il prim...
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico Recensione Nothing Phone (4a) Pro: finalmente in...
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro WoW: Midnight, Blizzard mette il primo, storico ...
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere? Recensione Samsung Galaxy S26+: sfida l'Ultra, m...
Secondo Elon Musk FSD è più...
Anche Cloudflare fissa il 2029 per la si...
Hacker sfruttano da mesi un bug segreto ...
ASUSTOR Lockerstor 24R Pro Gen2: 24 bay ...
Rigetti supera la soglia dei 100 qubit: ...
eFootball raggiunge il miliardo di downl...
Come provare OpenClaw facilmente grazie ...
Microsoft conferma: questo glitch dell'o...
Toyota bZ7: una berlina da oltre 5 metri...
Artemis II, le prime foto del lato nasco...
Sempre più pubblicità su YouTube: arriva...
Polestar fa +80% in Italia e tocca quota...
Il tuo Mac smette di connettersi a Inter...
La nuova alleanza Intel-Google ridefinis...
Energia troppo cara, regole da rivedere:...
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: 22:25.


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