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

    Estendere sottoclassi JComponent

    Ciao a tutti.
    La mia domanda forse è stupida, forse no; giudicate voi se è corretto o meno quello che ho fatto.
    Praticamente ho creato delle sottoclassi di JFrame, JButton, JLabel e JPanel. Il problema è che così facendo le variabili di esemplare non vengono istanziate correttamente: width e height dei componenti valgono 0, e non so cos'altro manca...

    Queste sono le classi che ho creato:

    Classe Frame
    codice:
    import javax.swing.JFrame;
    
    public class Frame extends JFrame
    {
    	private static final int FRAME_WIDTH = 300;
    	private static final int FRAME_HEIGHT = 400;
    	private static final int FRAME_X_POS = 200;
    	private static final int FRAME_Y_POS = 200;	
    		
    	public Frame()
    	{
    		setTitle("Un Frame.");
    		setBounds(FRAME_X_POS,FRAME_Y_POS,FRAME_WIDTH,FRAME_HEIGHT);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setVisible(true);
    	}	
    }
    Classe Button
    codice:
    import javax.swing.JButton;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseEvent;
    
    public class Button extends JButton
    {
    	private JButton button;
    	
    	class MouseOverListener implements MouseListener
    	{
    		public void mousePressed(MouseEvent event){}			
    		public void mouseReleased(MouseEvent event)
    		{
    			System.out.println("Button: sono stato cliccato.");
    		}			
    		public void mouseClicked(MouseEvent event){}			
    		public void mouseEntered(MouseEvent event){}
    		public void mouseExited(MouseEvent event){}			
    	}
    	
    	public Button(String text)
    	{
    		button = new JButton(text);
    		MouseListener listener = new MouseOverListener();
    		addMouseListener(listener);
    	}
    
    }
    Classe Label
    codice:
    import javax.swing.JLabel;
    
    public class Label extends JLabel
    {
    	private JLabel label;
    	
    	public Label(String text)
    	{
    		label = new JLabel(text);
    	}
    }
    Classe Panel
    codice:
    import javax.swing.JPanel;
    
    public class Panel extends JPanel
    {
    	private JPanel panel;
    	
    	public Panel()
    	{
    		panel = new JPanel();
    		setSize(200,200); //senza questo non riesco a cliccare button
    	}
    }
    Classe Main
    codice:
    public class Main
    {
    	public static void main(String[] args)
    	{
    		Frame frame = new Frame();
    		Button button = new Button("Button");
    		Label label = new Label("This is a label.");
    		Panel panel = new Panel();
    		panel.add(button);
    		panel.add(label);
    		frame.add(panel);
    	}
    }
    L'output è questo



    La domanda è: perché i componenti non vengono visualizzati? Forse ho sovrascritto qualche metodo delle superclassi senza volerlo e quindi sballa tutto?

    Ringrazio in anticipo chiunque abbia la pazienza e la voglia di rispondermi!




    EDIT: ho appena scoperto che se invoco i costruttori delle superclassi con super() funziona tutto alla perfezione però vorrei sapere da voi esperti se quest'approccio è corretto o se è meglio evitarlo... grazie!

  2. #2
    Per quanto rigurda il frame è abastanza corretto, in quanto vai ad aggiungere funzionalità ad un classe che non ne ha. Per quanto rigurda le label i button etc... non ne vedo il motivo inquanto ti basta usare direttamente tali classi (JButton,JLabel) ed usare i vari metodi che ti mettono a disposizione.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    e ricordiamoci che manca il frame.pack() e il frame.setVisible(true) e la delega all'EDT per la visualizzazione del frame

    ps frame.setVisible(true) di solito è l'ultima istruzione che inserisco fuori dal costruttore (all'interno di invokeLater) quando sono sicura che tutto si è inizializzato correttamente

  4. #4
    Vi ringrazio per le risposte.

    @francesco.muia: mi piace quest'approccio perché così facendo separo completamente le classi dal metodo main, sia le importazioni che le dichiarazioni di base. Però hai ragione, a parte il frame sulle altre classi è inutile.

    @valia: non so cosa sia l'EDT... comunque ho migliorato un po' la classe Frame, gli daresti un'occhiata?

    Classe Frame
    codice:
    import javax.swing.JFrame;
    import java.awt.Dimension;
    
    public class Frame extends JFrame
    {
    	private Dimension minSize = new Dimension(200, 200);
    
    	public Frame()
    	{
    		setTitle("Frame senza nome");
    		setMinimumSize(minSize);
    		pack();
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	}	
    	public Frame(String title, int frameWidth, int frameHeight)
    	{
    		setTitle(title);
    		pack();
    		setSize(frameWidth,frameHeight);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	}	
    	public Frame(String title, int frameWidth, int frameHeight, int frameXPos, int frameYPos)
    	{
    		setTitle(title);
    		pack();
    		setBounds(frameXPos,frameYPos,frameWidth,frameHeight);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	}
    }
    Classe Main
    codice:
    import javax.swing.JButton;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    
    public class Main
    {
    	public static void main(String[] args)
    	{
    		Frame frame = new Frame();
    		JButton button = new JButton("Click me!");
    		JLabel label = new JLabel("This is a label.");
    		JPanel panel = new JPanel();
    		panel.add(button);
    		panel.add(label);
    		frame.add(panel);
    		frame.setVisible(true);		
    	}
    }
    Sto preparando un piccolo framework per lavori futuri... cos'altro si potrebbe aggiungere come base di partenza? Grazie di nuovo a entrambi

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    EDT = EventDispatchThread, dovresti controllare sul tutorial oracle cosa è, a cosa serve, perché farvi riferimento (specie se stai preparando un framework o vuoi lavorare pesantemente con swing)

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.