Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia)
Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia)
Abbiamo provato per una settimana intera la Can-Am Origin, la Dual Sport elettrica del gruppo canadese BRP: ecco com'è andata tra città, autostrada e un primo assaggio di sterrato
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco
Nelle ultime settimane abbiamo provato il mouse Logitech G305, la tastiera G316 X 98 e le cuffie G325. Si tratta del setup entry-level di Logitech che ormai, di "entry-level" ha ben poco. Tastiera e mouse offrono prestazioni di livello competitivo con quasi nessuna rinuncia e un livello di personalizzazione estremamente elevato. Le cuffie, invece, hanno mostrato qualche debolezza, ma propongono un ventaglio di funzionalità completo che consente di abbandonare completamente i cavi
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio
POCO F9 Pro arriva sul mercato con l'obiettivo di portare prestazioni da smartphone top di gamma in una fascia di prezzo "più aggressiva", senza rinunciare a un comparto fotografico finalmente all'altezza. Dopo averlo testato sul campo, emerge uno smartphone molto più completo rispetto alla generazione precedente, ma anche con alcuni piccoli compromessi che diventano difficili da ignorare quando il prezzo di listino sfiora i 1.000 euro.
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


Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia) Test ride Can-Am Origin: la moto elettrica che f...
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco Logitech G325, G305 e G316 X: il tris per chi no...
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio Recensione POCO F9 pro: potenza da vero top di g...
Tra audio e AI: la ricetta di Qualcomm per l'agentic AI Tra audio e AI: la ricetta di Qualcomm per l'age...
Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6 Qualcomm annuncia la nuova generazione di SoC Sn...
Apple apre Music Hall, una sala concerto...
Adobe arriva su Gemini e Claude: nuove f...
Non solo Fideuram: quasi 2 milioni di it...
I lettori CD di fascia alta potrebbero s...
Tutto il meglio di Amazon weekend: 5 nov...
Proscenic P15+ a 113€ su Amazon: scopa e...
TP-Link Wi-Fi 6 a 59,99€ e Tenda 4G03 Pr...
Un quasi top di gamma a 461€: lo smartph...
Roborock Saros 20 Neo e Flow Complete: 3...
Mac mini si trasforma: chip a 2 nanometr...
Su Amazon c'è un super TV Samsung...
La Cina ha rilasciato un satellite dallo...
Il satellite LINK è rientrato nel...
L'ESA risponde alle critiche di Jared Is...
La NASA annuncia il nuovo telescopio spa...
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: 18:39.


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