Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    JTabbedPane e collegamento con classe

    Ciao a tutti!!
    ho una classe jframe base

    codice:
    import javax.swing.*;
    import java.awt.*;
    
    public class BaseFrame extends JFrame {
    
    	BaseFrame() {
    
    		super();
    
    		setTitle("titolo");
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setPreferredSize(new Dimension(300, 450));
    
    		setVisible(true);
    
    	}
    
    }
    in cui ho creato 2 tabs

    codice:
    import javax.swing.*;
    import java.awt.*;
    
    public class TabbedPane extends BaseFrame {
    
    	TabbedPane() {
    		JTabbedPane tab = new JTabbedPane();
    		tab.setPreferredSize(new Dimension(200, 50));
    		JPanel panel = new JPanel();
    		panel.add(new JLabel("Contenuto prima scheda"));
    		tab.addTab("One", null, panel, "Impostazioni");
    
    		JPanel second = new JPanel();
    		second.add(new JLabel("Seconda scheda"));
    		tab.addTab("Two", null, second, "Impostazioni");
    		
    		this.add(tab);
    		this.pack();
    
    	}
    
    	public static void main(String args[]) {
    		new TabbedPane();
    	}
    
    }
    codice:
    public class File {
    
    public static void recupero(){
    
    }
    
    }
    Dovrei fare in modo che il "Contenuto prima scheda" venga generato automaticamente dalla classe File, la quale recupera i dati da un file di testo.

    Sapete aiutarmi ? grazie

    P.S. non mi serve il codice per recuperare i dati dal file di testo

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Bhe, diciamo che si complicano un pò le cose. In primis dovresti valutare se il JLabel fa al caso tuo, o se sarebbe meglio una JTextArea non editabile.

    Comunque, qualsiasi sia la scelta, sarà sufficiente dichiarare il componente come variabile di istanza.

    codice:
    import javax.swing.*;
    import java.awt.*;
    
    public class TabbedPane extends BaseFrame {
      private JLabel label;
    
      TabbedPane() {
        // Qui dovresti almeno richiamare super() e passare
        // ad esempio, il titolo della finestra e le dimensioni
    
        label = new JLabel("Tuo testo");
        JTabbedPane tab = new JTabbedPane();
        tab.setPreferredSize(new Dimension(200, 50));
        JPanel panel = new JPanel();
        panel.add(label);
        tab.addTab("One", null, panel, "Impostazioni");
        
        JPanel second = new JPanel();
        second.add(new JLabel("Seconda scheda"));
        tab.addTab("Two", null, second, "Impostazioni");
        
        this.add(tab);
        this.pack();
    
      }
    
      public static void main(String args[]) {
        new TabbedPane();
      }
    }

    Il tuo primo frame non ha molto senso. Non capisco perchè erediti la classe se non aggiungi nulla...

    Comunque il problema sarebbe... quando ti serve la classe File? Supponendo sia la classe che contiene il JLabel, ti sarà sufficiente (ad esempio), definire un metodo getter per ottenere i dati del jlabel (se ti serve) ed un setter, per settare il testo. Ovviamente dovrai passare un riferimento del tipo della classe che contiene il JLabel.

    Per capirci, al codice che ti ho scritto li sopra, fai una cosa di questo tipo:
    codice:
    void settaTesto(String text) {
      label.setText(text);
      // altro eventuale codice
    }
    Nella classe File avrai il metodo con un parametro (o l'oggetto della classe, però mi sembra eccessivo, o il JLabel).
    In alternativa, dichiari label come public (non mi sembra una grandissima idea però).
    Un altra alternativa, si potrebbe far tornare un valore (il testo) dal metodo della classe File, e poi settarlo nella classe del JLabel.


    Non so però quale sia l'idea di implementazione che stai applicando, quindi mi è difficile aiutarti.

  3. #3
    Ciao!! grazie per la risposta!!!

    Ho fatto qualche modifica al codice seguendo i tuoi consigli:

    codice:
    public class TabbedPane extends JFrame {
    
    	TabbedPane() {
    
    		super();
    
    		setTitle("Titolo");
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setPreferredSize(new Dimension(300, 450));
    
    		setVisible(true);
    
    		JTabbedPane tab = new JTabbedPane();
    		tab.setPreferredSize(new Dimension(200, 50));
    		JPanel panel = new JPanel();
    		panel.add(new JLabel("Contenuto"));
    		tab.addTab("One", null, panel, "Impostazioni");
    
    		JPanel second = new JPanel();
    		second.add(new JLabel("Seconda scheda"));
    		label.setText(text);
    		tab.addTab("Two", null, second, "Impostazioni");
    		
    		this.add(tab);
    		this.pack();
    
    	}
    
    	public static void main(String args[]) {
    		new TabbedPane();
    	}
    
    }
    La classe File include il codice necessario per recuperare i dati da un file di testo.


    panel.add(new JLabel("Contenuto"));

    Dovrei fare in modo che, al posto di "Contenuto", ci sia un collegamento alla classe File, la quale stampa nel primo tab un determinato testo.

    Inoltre nella classe File devo inserire un particolare codice? Per capirci al posto di System.out.println dovrei inserire un return?

    Forse al posto di contenuto dovrei aggiungere un elemento subordinato come un'istanza JPanel ?

    grazie mille

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Aspetta, aspetta! Prima di tutto non capisco che modifiche hai fatto lol Poi, il super così richiama il costruttore senza parametri. Al posto di settare il titolo in quel modo, passalo a super!
    Mi chiedo sempre a che ti serve estendere una classe che estende JFrame, se la nuova classe non apporta aggiunte...


    Poi:
    1) Il metodo di File legge da un file di testo e restituisce il testo?
    2) Il metodo File legge dal file di testo, ma deve settare lui stesso il testo sulla JLabel?

    Se vuoi mostrare il testo nella JLabel non puoi di certo utilizzare il flusso di output predefinito! (System.out.println())
    Quindi puoi far ritornare quanto hai letto, e poi settarlo nel JLabel! ^^

    Forse al posto di contenuto dovrei aggiungere un elemento subordinato come un'istanza JPanel ?
    Qui non capisco che intendi.
    JLabel riceve una stringa, o un immagine come parametro!
    Poi mi ripeto, non è corretto utilizzare JLabel (che è un etichetta) per memorizzare testi lunghi.

    codice:
    second.add(new JLabel("Seconda scheda"));
    label.setText(text);
    Ehm... è una svista, oppure è proprio ciò che vuoi fare?


    Se esponi ciò che devi fare possiamo trovare un implementazione differente magari, sempre se non devi seguire per forza un determinato tipo di struttura.

  5. #5
    Grazie mille per le varie risposte!

    Scopo: Creare un'applicazione che stampi a video un intero file .xml.
    1 Tab = Contenuto (news) file .xml
    2 Tab = Impostazioni

    Ho iniziato da circa un mese ad imparare java su un libro apposito, quindi sono ancora un novellino. Per quando riguarda il super e l'extend della classe JFrame, in allegato la screenshot della pagina (http://img189.imageshack.us/img189/5...0903185517.jpg).

    Ecco come ho strutturato la mia applicazione... (attendo consigli)

    codice:
    import javax.swing.*;
    import java.awt.*;
    
    public class TabbedPane extends JFrame {
    
    	TabbedPane() {
    
    		super();
    		setTitle("Titolo app");
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setPreferredSize(new Dimension(300, 500));
    		setVisible(true);
    
    		// add tab News
    
    		JTabbedPane tab = new JTabbedPane();
    
    		// add panel News
    
    		JPanel panelOne = new JPanel(new GridLayout(1,1));
    		panelOne.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
    		this.add(panelOne); )
    
    		News a = new News();
    
    		JTextArea test = new JTextArea(a.getTitolo()); 
        
    		JScrollPane scroll = new JScrollPane(test);
    		scroll.setPreferredSize(new Dimension(200, 100));
    		panelOne.add(scroll);
    
    		// end panel News
    
    		tab.addTab("News", null, panelOne, "News");
    
    		// add panel Impostazioni
    
    		JPanel panelTwo = new JPanel(new GridLayout(1,1));
    		panelTwo.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
    		this.add(panelTwo); 
    
    		JLabel im = new JLabel("impostazioni"); 
    		im.setHorizontalAlignment(JLabel.LEFT);
        		im.setVerticalAlignment(JLabel.TOP);
        
    		panelTwo.add(im);
    
    		// end panel Impostazioni
    
    		tab.addTab("Impostazioni", null, panelTwo, "Impostazioni");
    
    		// end tab News
    
    		this.add(tab);
    
    		this.pack();		
    
    	}
    
    	public static void main(String args[]) {
    		new TabbedPane();
    	}
    
    }
    Classe NEWS

    codice:
    public class News {
    
    	private String titolo, descrizione, autore, data;
    
    	public News(){
    	      codice per recuperare dati da .xml
    	}
    		
    	public String getTitolo() {
    		titolo = "ciao";
    		return titolo;
    	}
    
    }
    INoltre... come devo fare per rendere il textarea non editabile...
    Per gestire il .xml mi consigli jdom? C'è una guida?

    Fammi sapere

    Grazie ancora

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Ah ok, utilizza quella classe perchè include in essa alcune operazioni, così le potrai evitare (sinceramente potresti farne tranquillamente a meno).

    Questo puoi evitarlo (Se utilizzi BaseFrame, se estendi direttamente JFrame allora ti serve):
    codice:
    		setTitle("Titolo app");
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setPreferredSize(new Dimension(300, 500));
    		setVisible(true);
    O al massimo, passi a super il "Titolo App", però bada bene, nella classe BaseFrame devi avere il costruttore che riceve un parametro di tipo String e ne setta il titolo (passandolo a sua volta tramite super).

    Iniziamo da News.
    I parametri li andrai a leggere dal file xml, quindi il metodo getTitolo() non dovrà settare il titolo, poichè la variabile sarà già settata. Dovrai ovviamente fornire gli altri metodi getter, ma credo tu lo sappia già

    Per rendere la JTextArea non editabile devi semplicemente fare:
    codice:
    test.setEditable(false);

    Il problema della tua attuale implementazione è più o meno quello di prima. Crei l'oggetto News, ma questo al di fuori del costruttore... non esiste!
    Qui dipende quello che devi fare; se vuoi passare eventuali altri file da leggere e mostrare nella finestra, sei costretto a dichiarare News fuori dal suo interno (del costruttore), e precisamente, dovrai creare un nuovo oggetto ad ogni News. Ovvio che se vuoi salvarne e memorizzarne solo una alla volta, puoi utilizzare un solo oggetto (altrimenti serve un array).

    Se invece a te serve solamente far leggere il file che indicherai nel sorgente del programma, e mostrare a video il contenuto, allora puoi fare come stai facendo ora.

    A News ad esempio, fornirei un parametro di tipo String o File, che riceve il nome del file da parsare ^^


    Si, JDom è buona. Sinceramente non ho molta esperienza con essa, ma non credo ci sia nulla di complesso nella lettura di un xml (ho letto spesso JSON).

    Qui trovi alcuni esempi pratici: http://www.codicefacile.it/tutorials...re+un+file+XML

    Qui invece trovi il materiale che stai cercando: http://www.jdom.org/downloads/docs.html

    Non so quanto ti convenga leggere subito il file xml. Questo perchè supponendo sia molto lungo dovresti tenere impegnato un oggetto String per il titolo, un oggetto per il testo intero ecc. Forse ti conviene leggerlo al momento del bisogno, quando viene richiesto insomma.

  7. #7
    grazie mille per i consigli.

    Ho scaricato la libreria jdom, dopo averla scompattata l'ho copiata nella cartella del mio project ma, se provo ad istanziare la prima classe SaxBuilder mi da errore.

    C'è qualche modo particolare per configurare jdom?

    p.s. uso linux

    grazie ancora

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Non hai mai detto di utilizzare un IDE (o almeno non mi sembra), quindi do per scontato che ti riferisci ad una cartella "normale" e non i progetti di NetBeans o Eclipse.


    Suppongo sia in Jar la libreria. Una volta scaricata estrai dal Jar le cartelle (che penso proprio ci siano) e mettile dove hai l'applicazione, dovrebbe funzionare.

    Comunque che errore viene riportato?

    Devi aver riportato queste comunque:
    codice:
    import org.jdom.*;
    import org.jdom.input.*;
    E bada bene che l'oggetto non è SaxBuilder, ma SAXBuilder.


    PS: L'utilizzo di linux non crea problemi. Puoi portare sempre le cartelle contenute nel Jar all'interno della cartella con il progetto, e dovrebbe funzionare tutto.

  9. #9
    Grazie!!

    purtroppo mi da ancora errore, pero' su altre classi.

    Mio codice:

    codice:
    inizio 
    
                   SAXBuilder builder = new SAXBuilder();
    		Document doc = builder.build("prova.xml");
    		SAXBuilder builder = new SAXBuilder("org.apache.xerces.parsers.SAXParser");
    		Element root = doc.getRootElement();
    
    		List children = root.getChildren();
    		Iterator itr = doc.getDescendants();
    
    		while (itr.hasNext()) {
    
    		Content c = (Content) itr.next();
    
    		System.out.println(c);
    
    		}
    
    		itr = doc.getDescendants(new ElementFilter());
    		while (itr.hasNext()) {
    		Content c = (Content) itr.next();
    		System.out.println(c);
    		}
    fine
    Errori:

    Document doc = builder.build("prova.xml");

    SAXBuilder builder = new SAXBuilder("org.apache.xerces.parsers.SAXParser");

    List children = root.getChildren();

    Iterator itr = doc.getDescendants();

    itr = doc.getDescendants(new ElementFilter());



    Grazie ancora

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Dovresti postare lo stack trace dell'errore, così non so quale possa essere

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.