Visualizzazione risultati 1 fino 18 di 18

Discussione: [Java]GUI, OOP

  1. #1
    Guest

    Red face [Java]GUI, OOP

    Salve gente..

    Visto che la discussione precedente stava diventando un po lunga e comunque l'argomento principale "gestione bottone" è stato risolto ho voluto aprire questo topic per gli altri problemi che via via emergono con il mio programma.

    Ho deciso di riscrivere tutto da (quasi) 0.

    Per adesso sto procedendo ad impostare graficamente la finestra principale e vorrei consigli sull'impostazione di essa e la scrittura di un buon codice OOP
    Codice:
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
    
    public class NumeriPrimi_Interfaccia extends JFrame {
       	public NumeriPrimi_Interfaccia () {
       		
       		super("Numeri Primi - Created by: ");
       		
        	        Container contents = this.getContentPane();
        	        this.setLayout(new BorderLayout());
                    
                    JLabel head = new JLabel("NUMERI PRIMI COMPRESI");
       	    	head.setHorizontalAlignment(JLabel.CENTER);
                    this.add(head,"North");
            
          	        this.setResizable(true);
    		this.setSize(300,300);
    		this.setLocation(100,100);
    		this.setVisible(true);
      	}
            public static void main(String[] args){
       		NumeriPrimi_Interfaccia app = new NumeriPrimi_Interfaccia();
       	}
    }
    In questo modo si apre una finestra con una scritta sempre allineata in alto al centro (ed è quello che voglio).
    Però per "scompattare" il codice avevo provato a fare una cosa del genere:

    Creo una classe privata per la gestione della parte superiore:
    Codice:
    private class NorthPanel extends JPanel {
            public NorthPanel() {
       		JLabel head = new JLabel("NUMERI PRIMI COMPRESI");
       	    	head.setHorizontalAlignment(JLabel.CENTER);
          	}
    }
    Ma adesso il problema sorge quando devo includerlo nella mia finestra.
    Ho provato diverse "strade" ma la mia finestra resta vuota.

    Sapete aiutarmi in questo mio "primo" problema?

    PS: Ringrazio infinitamente dementialsite
    Ultima modifica di mathis : 31-08-2013 alle ore 17.03.53

  2. #2
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Ti basta, nel costruttore della finestra, creare il pannello e includerlo come fosse un componente:
    Codice:
    public class NumeriPrimi_Interfaccia extends JFrame {
       	public NumeriPrimi_Interfaccia () {
       		
       		super("Numeri Primi - Created by: ");
       		
        	        Container contents = this.getContentPane();
        	        this.setLayout(new BorderLayout());
                    
                    NorthPanel np = new NorthPanel();
                    this.add(np,"North");
            
          	        this.setResizable(true);
    		this.setSize(300,300);
    		this.setLocation(100,100);
    		this.setVisible(true);
      	}
            public static void main(String[] args){
       		NumeriPrimi_Interfaccia app = new NumeriPrimi_Interfaccia();
       	}
    }
    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  3. #3
    Guest

    Predefinito

    Avevo già provato ma niente, ecco:
    Codice:
    public class NumeriPrimi_Interfaccia extends JFrame {
       	public NumeriPrimi_Interfaccia () {
       		
       		super("Numeri Primi - Created by: ");
       		
        	        Container contents = this.getContentPane();
        	        this.setLayout(new BorderLayout());
            
                    NorthPanel header = new NorthPanel();
                    this.add(header,"North");
            
          	        this.setResizable(true);
    		this.setSize(300,300);
    		this.setLocation(100,100);
    		this.setVisible(true);
      	 }
    
      	private class NorthPanel extends JPanel {
       		public NorthPanel() {
       			JLabel head = new JLabel("NUMERI PRIMI COMPRESI");
       	    	        head.setHorizontalAlignment(JLabel.CENTER);
          	}
       	}
            public static void main(String[] args){
       		NumeriPrimi_Interfaccia app = new NumeriPrimi_Interfaccia();
       	}
    }
    Grazie...

  4. #4
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,745

    Predefinito

    Prova così:
    Codice:
    private class NorthPanel extends JLabel {
    	public NorthPanel() {
    		setText("NUMERI PRIMI COMPRESI");
    		setHorizontalAlignment(JLabel.CENTER);
    	}
    }

  5. #5
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    C'è un altro errore nel codice (prima non l'ho visto...): devi aggiungere elementi e pannelli alla contentPane (la variabile contents), non direttamente alla finestra... se no in JFrame non funziona.

    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  6. #6
    Guest

    Predefinito

    Citazione Originalmente inviato da karl94 Visualizza messaggio
    Prova così:
    Codice:
    private class NorthPanel extends JLabel {
    	public NorthPanel() {
    		setText("NUMERI PRIMI COMPRESI");
    		setHorizontalAlignment(JLabel.CENTER);
    	}
    }
    In questo modo di dice: error: Cannot find symbol

    Citazione Originalmente inviato da dementialsite Visualizza messaggio
    C'è un altro errore nel codice (prima non l'ho visto...): devi aggiungere elementi e pannelli alla contentPane (la variabile contents), non direttamente alla finestra... se no in JFrame non funziona.

    Stammi bene...
    Inizialmente ho provato così ma la finestra resta sempre vuota, forse funziona con il codice di Karl ma visto che ricevo l'errore sopra indicato non saprei..

  7. #7
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,745

    Predefinito

    Hmm, forse è meglio chiamare il costruttore della classe da cui erediti, con super? A questo punto puoi però omettere la chiamata al metodo setText.

  8. #8
    Guest

    Predefinito

    In questo modo intendi?
    Codice:
    public NorthPanel() {
       			super("NUMERI PRIMI COMPRESI");
    			setHorizontalAlignment(JLabel.CENTER);
          	}
    Comunque sia ricevo sempre errore, diverso, ma sempre errore:
    error: no suitable constructor found for JPanel(String)

  9. #9
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,745

    Predefinito

    Sei sicuro che la classe NorthPanel nel tuo codice estenda la classe JLabel (così come nel codice che ho scritto io)?

  10. #10
    Guest

    Predefinito

    Ooops.. Per errore estendevo la classe JPanel, adesso non ricevo nessun errore e credo funzioni [dico credo visto che, non capisco il perché , se premo run file si vede (o nel caso di "gestione bottone" apre la nuova finestra quindi funzionando regolarmente) mentre questo non accade se faccio run project) ho cercato su google ma non ho trovato risposte adeguate].

    PS: Uso JCreator e se qualcuno di voi sa rispondermi gli sarei molto grato
    PPS: Vi sono riconoscente comunque haha

  11. #11
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,745

    Predefinito

    L'unica volta che ho compilato qualcosa in Java ho usato il compilatore da riga di comando, non ho mai visto nemmeno Eclipse, che è ben più famoso. Prova a consultare la documentazione ufficiale (o ad usare il compilatore da riga di comando).

  12. #12
    Guest

    Predefinito

    Sinceramente non ho mai compilato in riga di comando.
    Ci ho provato qualche volta, a tempo perso, ma non riconosceva i comandi

    Comunque proverò a consultare nuovamente la documentazione ufficiale.

    PS: Ho anche Eclipse ma uso JCreator visto che a scuola useremo questo (quando farò Java)

    ---EDIT---

    Ho risolto.. mi sono accorto che un'impostazione di configurazione per l'esecuzione era modificata
    Ultima modifica di mathis : 01-09-2013 alle ore 00.51.37

  13. #13
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,745

    Predefinito

    Io ti consiglierei vivamente di dare un'altra possibilità al comando javac, non è poi così difficile. E poi mi sembra anche che quel tuo IDE dia messaggi di errore un po' vaghi. O sei tu che li hai tagliati nel riportarli qui? Ad esempio l'errore error: Cannot find symbol dovrebbe anche indicare dettagli aggiuntivi (cosa non riesce a trovare).

  14. #14
    Guest

    Predefinito

    Questo si, ma potresti linkarmi una guida o spiegarmi come compilare in linea di comando?

    Casomai tu consigli di usare Eclipse?

  15. #15
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,745

    Predefinito

    Nel caso più semplice è sufficiente usare il comando javac passando come argomento il percorso del file .java da compilare. Poi, a seconda delle classi che usi, potrebbe essere necessario specificare al compilatore dove può trovare i relativi file .class, mediante l'opzione -classpath.
    Ad ogni modo, consulta la documentazione ufficiale (in fondo trovi anche qualche esempio).
    Trovi tutto il necessario nel JDK (Java Development Kit).

  16. #16
    Guest

    Predefinito

    Grazie
    Comunque è da 1 ora che guardo pagine, forum e quant'altro alla ricerca della soluzione al mio problema:
    Esiste una funzione per impostare una distanza dal margine della finestra direttamente proporzionale alla sua grandezza?
    Diciamo come se impostassi una distanza in percentuale.

    Con i CSS sarebbe:
    Codice:
    Panel{
            margin-left: 10%;
    }
    Ma con Java non ho idea di come fare
    Ultima modifica di mathis : 01-09-2013 alle ore 02.29.47

  17. #17
    Guest

    Predefinito

    Magari quel problema lo lasciamo per dopo
    Adesso io avevo pensato di inserire due metodi in una classe ma, pur non ricevendo errori, non visualizza niente.
    Istanza della mia classe contenente i due metodi:
    Codice:
    private class LeftPanel extends JLabel {
       		public LeftPanel() {
       			setText("TRA");
       			setFont(new Font("Courier", Font.ITALIC, 28));
    			setVerticalAlignment(JLabel.NORTH);
          	}
          	public void InputTra(){
          		JTextField tra = new JTextField(5);
          		setVerticalAlignment(JTextField.NORTH);
          	}
       	}
    Creazione dell'oggetto:
    Codice:
    contents.add(new LeftPanel());
    ---EDIT---
    Avevo sbagliato a copiare il codice (avevo preso quello di un secondo file).
    Il problema è che non riesco ad invocare il metodo InputTra();
    Ultima modifica di mathis : 02-09-2013 alle ore 12.11.00

  18. #18
    iminelink non è connesso Neofita
    Data registrazione
    14-03-2013
    Messaggi
    3

    Predefinito

    Citazione Originalmente inviato da mathis Visualizza messaggio
    Magari quel problema lo lasciamo per dopo
    Adesso io avevo pensato di inserire due metodi in una classe ma, pur non ricevendo errori, non visualizza niente.
    Istanza della mia classe contenente i due metodi:
    Codice:
    private class LeftPanel extends JLabel {
       		public LeftPanel() {
       			setText("TRA");
       			setFont(new Font("Courier", Font.ITALIC, 28));
    			setVerticalAlignment(JLabel.NORTH);
          	}
          	public void InputTra(){
          		JTextField tra = new JTextField(5);
          		setVerticalAlignment(JTextField.NORTH);
          	}
       	}
    Creazione dell'oggetto:
    Codice:
    contents.add(new LeftPanel());
    ---EDIT---
    Avevo sbagliato a copiare il codice (avevo preso quello di un secondo file).
    Il problema è che non riesco ad invocare il metodo InputTra();
    Per poter chiamare il metodo InputTra() di una classe privata non statica devi avere un oggetto di tipo LeftPanel().
    E poi il metodo InputTra() crea un istanza di JTextField() che viene dimenticata alla fine della funzione InputTra(), perchè non viene attaccata a nessun container.

    Prova:
    Codice:
    LeftPanel mLeftPanel = new LeftPanel();
    JTextField mInputTra = mLeftPanel.InputTra();
    
    mContainer.add(mLeftPanel);
    mContainer.add(mInputTra);
    
    //Questo sopra nel caso vuoi attaccare tutto allo stesso container...altrimenti puoi fare:
    
    mLeftPanel.add(mLeftPanel.InputTra());
    mContainer.add(mLeftPanel);
    //E la classe diventa:

    Codice:
    private class LeftPanel extends JLabel {
       		public LeftPanel() {
       			setText("TRA");
       			setFont(new Font("Courier", Font.ITALIC, 28));
    			setVerticalAlignment(JLabel.NORTH);
          	}
          	public JTextField InputTra(){
          		JTextField tra = new JTextField(5);
          		setVerticalAlignment(JTextField.NORTH);
                    return tra;
          	}
       	}

    EDIT: Oppure ancora, evitando la parte di codice dove attacchi l'InputTra al LeftPanel:

    Codice:
    private class LeftPanel extends JLabel {
       		public LeftPanel() {
       			setText("TRA");
       			setFont(new Font("Courier", Font.ITALIC, 28));
    			setVerticalAlignment(JLabel.NORTH);
                            add(InputTra());
          	}
          	private JTextField InputTra(){
          		JTextField tra = new JTextField(5);
          		setVerticalAlignment(JTextField.NORTH);
                    return tra;
          	}
       	}
    Ultima modifica di iminelink : 26-09-2013 alle ore 12.46.49

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •