Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    17

    [Java] Posizionamento Componenti in JFrame

    Salve ragazzi, avrei bisogno di una grande mano, mi sto scervellando, spiego il mio problema:
    Dovrei creare una semplice frame con un immagine di sfondo, sulla quale dovrei posizionare 3 componenti, una JTextArea un JTextField e un JButton. La mia Esigenza è di posizionare "in maniera xfetta" i componenti poichè devono corrispondere a sezioni precise dello sfondo sottostante, ho pensato quindi di non usare Layout ma di settare manualmente le distanze rendendo la finestra NonResizable, nonostante tutto non funziona. Posto il codice se qualcuno ha pazienza di leggerlo:
    codice:
    public class index {
    	private JFrame frame;
    	private JTextArea testo;
    	private JTextField nick;
    	private JButton start;
    	private JPanel pannelloTesto;
    	private JPanel pannelloNick;
    	private JPanel pannelloStart;
    	private Image img;
    	public index(){
    		gui();
    	}
    	public static void main(String[] args) {
    		index i = new index();
    	}
    	public void gui(){
    		img = Toolkit.getDefaultToolkit().getImage("src/einstaing.jpg");
    		frame = new JFrame();
    		pannelloTesto = new JPanel(null){
    			public void paintComponent(Graphics g){
    				super.paintComponent(g);
    				g.drawImage(img, 0, 0, null);
    				}
    		};
    		pannelloNick = new JPanel(null);
    		pannelloStart = new JPanel(null);
    		testo = new JTextArea(5,26);
    		testo.setOpaque(true);
    		nick = new JTextField(10);
    		nick.setForeground(Color.BLACK);
    		start = new JButton("Start");
    		frame.setSize(671,520);
    		frame.setResizable(false);
    		
    		pannelloTesto.add(testo);
    		testo.setBounds(300, 65, 250, 100);
    		
    		pannelloNick.add(nick);
    		nick.setBounds(110, 110, 800,800);
    		
    		frame.getContentPane().add(pannelloNick);
    		frame.getContentPane().add(pannelloTesto);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setVisible(true);
    	}
    }
    Facendo in questo modo credo che quando aggiungo al frame il PannelloTesto in un certo qual modo me lo sovrappone coprendo ciò che ci sta sotto.
    Se riuscite a consigliarmi sul codice o anche a darmi qualche consiglio sul funzionamento della disposizione dei componenti, vi sono grato

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java] Posizionamento Componenti in JFrame

    Originariamente inviato da clangel
    codice:
    		frame.getContentPane().add(pannelloNick);
    		frame.getContentPane().add(pannelloTesto);
    me lo sovrappone coprendo ciò che ci sta sotto.
    Il content-pane del JFrame per default ha un BorderLayout.

    la add() in un BorderLayout senza specificare un constraint è come se si stesse facendo la aggiunta nella parte CENTER:

    ....add(comp);

    equivalente a:

    ....add(comp, BorderLayout.CENTER);

    in un BorderLayout

    Pertanto stai mettendo prima pannelloNick in CENTER e poi pannelloTesto in CENTER. Ma siccome il componente visualizzato in CENTER (idem nelle altre 4 aree) è 1 solo ..... vedi solo l'ultimo aggiunto.


    Consiglio: ragiona in termini di "inscatolamento" (componenti dentro contenitori, dentro altri contenitori ecc....) .... non di "sovrapposizione".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    17
    grazie della risposta, non avevo capito il BorderLayout di defautl, ma continuo a non capire quale sarebbe la strada migliore per il mio problema, per evitare la sovrapposizione non potrei dare 'null' al layout del frame e posizionare i pannelli a mano con le posizioni? l'ho provato ma nn mi funziona.
    Se dovessi lavorare con contentitori dentro contenitori e l'inscatolamento, come farei a dare dell "posizioni assolute", per posizionare xfettamente i componenti dove io voglio?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da clangel
    Se dovessi lavorare con contentitori dentro contenitori e l'inscatolamento, come farei a dare dell "posizioni assolute", per posizionare xfettamente i componenti dove io voglio?
    Il pannelloTesto deve occupare "tutto lo spazio disponibile del frame" e deve stare "sotto" a tutti gli altri componenti? Allora puoi benissimo metterlo nella parte CENTER del BorderLayout del content-pane.

    E visto che pannelloTesto è un JPanel (un contenitore generico) senza layout (passi null infatti) allora puoi aggiungerci dentro tutti i componenti che vuoi posizionandoli esplicitamente.
    Nota, sarebbe meglio se questi componenti in pannelloTesto non si sovrapponessero.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    17
    Il pannelloTesto dovrebbe essere Sopra lo sfondo e occupare una piccola sezione in alto a destra e dovrei farlo coincidere con una sezione della foto, tipo nella foto c'è un sole e io voglio che dentro di esso si possa scrivere.Gli altri pannelli, del Jtextfield e del button devon stare allo stesso "livello" del pannelloTesto solo in posizioni diverse del frame

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da clangel
    Il pannelloTesto dovrebbe essere Sopra lo sfondo
    Ma il pannelloTesto disegna sulla sua superficie la immagine .... quindi è la immagine che è "dentro" pannelloTesto!!

    Originariamente inviato da clangel
    dovrei farlo coincidere con una sezione della foto
    La foto è quella immagine ..... no? Abbiamo appena detto che è la immagine ad essere disegnata dentro il pannelloTesto.

    Originariamente inviato da clangel
    tipo nella foto c'è un sole e io voglio che dentro di esso si possa scrivere.Gli altri pannelli, del Jtextfield e del button devon stare allo stesso "livello" del pannelloTesto solo in posizioni diverse del frame
    Purtroppo di quanto hai detto, poco risulta chiaro .....
    Un disegnino magari che spiega cosa vuoi vedere??
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    17
    scusa se sono poco chiaro, la mia idea era di mettere come sfondo 1 disegno e sopra di esso posizinare le componenti ti faccio vedere dalla foto come dovrebbe venire
    http://yfrog.com/9himgnkj

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da clangel
    la mia idea era di mettere come sfondo 1 disegno e sopra di esso posizinare le componenti
    E allora è come ti ho già detto e lo ripeto meglio in modo più generale:

    Un "tuo" pannello che tramite un apposito paintComponent in "override" disegna la immagine. Questo pannello lo metterai dentro un altro contenitore, es. il content-pane del JFrame nella parte CENTER per occupare tutto lo spazio.

    Questo tuo pannello è ovviamente un "contenitore", quindi può contenere N altri componenti. E i componenti "figli" staranno "sopra" il disegno.

    Insomma, il "tuo" pannello disegna la immagine e contiene N componenti che stanno "sopra" la immagine. Non è quanto hai appena descritto??

    Guarda ad esempio tra i miei Java Examples (vedi firma), sezione Graphics l'esempio TiledBackground.java (è un po' diverso ma concettualmente simile).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    17
    credo di aver risolto in maniera sicuramente non pulitissima ma almeno funziona hihi
    ho impostato il layout del frame a null e imposto il Border dei pannelli a mano dopo ke li ho inseriti nel frame.cmq per correttezza provo ad implementare la tua soluzione che sicuramente sarà sintatticamente e sematicamente piu corretta ^^
    una cosa sola nell' "inscatolare" i pannelli per impostare io le coordinate uso il .setBorders()?

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.