|
Benvenuti al Forum > Grafica > in depth |
Grafica |
|
Questa sezione è dedicata a discussioni relative alla grafica in Java (Swing, AWT).
|
|
|
|
View All Content
Hide All Content
|
|
View Content
Hide Content
Volevo mettere sul forum la mia soluzione di un precedente esercizio secondo il modello MVC.
L'esercizio consisteva nel creare un'applicazione che mostrava una finestra contenente tre controlli scorrevoli, un pannello, un pulsante reset e le label opportune, e tre selettori Red, Green, Blue.
Ad ogni momento, a seconda della posizione dei selettori, il pannello mostrava il colore formato dalla combinazione RGB relativa.
Volevo chiedere al forum un consiglio sulle cose che possono essere migliorate nella stesura del programma.
http://latemar.science.unitn.it:8000/segue_userfiles/2006prog2/slidercolore.zip
Grazie
| |
View Content
Hide Content
Ciao, c'è qualcuno che può mettere disponibile il codice dell'esame di giugno 2006? grazie a tutti.
| |
|
View Content
Hide Content
Buongiorno al forum, volevo chiedere gentilmente delucidazioni relativamente al metodo getSize. In particolare, se ho la seguente classe:
public class Rettangolo extends JPanel { Color colore, colore1; Dimension coordinate, coordinate1, area, area1; public void paintComponent (Graphics g) { super.paintComponent(g); g.setColor(colore); g.fillRect(coordinate.width,coordinate.height,area.width,area.height); g.setColor(colore1); g.fillRect(coordinate1.width,coordinate1.height,area1.width,area1.height); } public Rettangolo() { //set the default color of the rectangles Color colore = Color.YELLOW; this.colore = colore; Color colore1 = Color.BLUE; this.colore1 = colore1; //set the default dimension of the rectangles Dimension area = new Dimension(75, 75); this.area = area; Dimension area1 = new Dimension(75, 75); this.area1 = area1; //set the default coordinates of the rectangles Dimension coordinate = new Dimension(0,0); this.coordinate = coordinate; Dimension coordinate1 = new Dimension(250,250); this.coordinate1 = coordinate1; } }
nell'istruzione evidenziata in rosso, come posso impostare coordinate1 utilizzando il metodo getSize() ?
Io ho provato ad eseguirlo sul pannello, ma non ottengo il valore desiderato. E' corretto utilizzare getSize() su un oggetto di tipo JPanel?
Mi sono accorto che setVisible() sul JFrame non prima non è settato a true, mi impedisce di ottenere la dimensione del JPanel.
Grazie per l'eventuale gradita risposta.
Giampaolo
| |
View Content
Hide Content
Ciao, se c'è qualcuno che ha fatto il compito d'esame dell'anno scorso ( quello del bersaglio ) potrebbe mettere sul forum il codice cosi per vedere come lo ha fatto?
Grazio a tutti
| |
|
View Content
Hide Content
Salve a tutti, volevo fare un pò di domande:
1) Cosa fa la "super.clone()" ? 2) A che cosa serve implementare un hashcode ? 3) Da errore se non si implementa un hashcode se implementiamo una equals? 4) Posso implementare due eventi diversi in un file.java? Come? 5) Se voglio per esempio che quando premo un punto su un pannello si disegna un cerchio come faccio ( cioè "mescolare" i components con la paintComponent) ?
|
|
View Content
Hide Content
1) richiama la clone del padre (risalendo eventualmente fino alla clone di Object che fa una copia bit a bit della memoria occupata dall'oggetto che deve essere clonato)
2) A far funzionare bene le hashtables. Se non è chiaro cosa sono e come funzionano suggerisco i riguardare la parte finale della lezione 18 in video. Dovrebbe valere la proprietà che che due oggetti uguali finiscono nello stesso posto in una hashtable, e due oggetti diversi in posti diversi. Dato che la hashtable usa hashcode per generare la chiave di accesso, quando si cambia la equals si dovrebbe fer in modo che tale proprietà sia valida.
3) No non da errore, ma le hashtables (e le collezioni che mantengono una sola copia di oggetti uguali) potrebbero non funzionare correttamente.
4) Che vuol dire? Non is implementano eventi, ma ascoltatori (gestori) di eventi. Una classe può implementare diverse Listener interfaces, e quindi gestire eventi diversi.
5) Analogo a quanto detto nella risposta data a V.Sartori (paintComponents) di sopra.
PS. Tutte le domande sono importanti :-)
| |
|
View Content
Hide Content
Stavo provando un programma semplice in cui si ha nella finestra principale un BorderLayout,dove al centro ho un pannello da gestire,con dei pulsanti posizionati nella parte nord del borderLayout. In questa parte nord ho fatto un'altro JPanel con un flow layout,ho posizionato due bottoni,una label e due textField. Il problema è che i componenti si dispongono tutti in una riga,andando ad uscire dal campo di visuale,non visualizzando ad esempio l'ultimo bottone. ho provato a guardare la documentazione e ho trovato questo:
JFrame frame = new JFrame("FlowLayoutDemo") { public Dimension getMinimumSize() { Dimension prefSize = getPreferredSize(); return new Dimension(100, prefSize.height); } };
cioè va impostata una dimensione minima? ma stando a quanto detto in classe non si arrangiava da solo il Layout Manager a capire quando andare a capo? Il mio problema non è che capita perchè ho posizionato questo pannello a nord di un borderLayout,e quindi viene tutto minimizzato?
oltretutto ho notato che con questo metodo non si fa altro che avere una minima dimensione della finestra,impossibilitando l'utente a rimpicciolirla oltre. In questo caso non c'è un metodo piu veloce,tipo frame.setMinimumSize() ? bisogna sempre fare questo procedimento?
| |
View Content
Hide Content
Salve a tutti... Vorrei sapere se qualcuno ha capito come si fa a "togliere" un evento (Actionlistener o Mouselistener) da un oggetto.
Faccio un esempio: dopo aver creato un JButton che chiamo B, gli ho assegnato un Actionlistener (chiamiamolo Al) nel solito modo,
B.addAction_Listener(Al).
Questo fa si che venga attivato un MouseListener (Ml) su un JPanel (jp) che controlla i click del mouse al suo interno.
Adesso volevo fare in modo che premendo nuovamente B (o premendo un nuovo bottone) si disattivasse anche il MouseListener, ma pur facendo
jp.removeMouseListener(Ml)
non cambia assolutamente nulla. C'è qualche altro metodo per ottenere questo risultato o semplicemente sbaglio ad usare il metodo "removeMouseListener"?
Grazie.
|
|
View Content
Hide Content
Anche qui, aggiungere (IN ATTACHMENT) il sorgente aiuterebbe... Il ragionamento sembra filare, ma vorrei vedere come è implementato per poter rispondere.
|
|
View Content
Hide Content
Mi scuso per il ritardo con cui le rispondo...
Comunque penso di aver trovato il problema, ma le invio comunque il mio progetto.
Graziee ancora.
| |
|
|
View Content
Hide Content
Buongiorno a tutti e scusate se pongo una domanda banale.
Sul tema d'esame di giugno 2005 si chiede di disegnare un punto quando viene premuto un pulsante. Si deve reimplementare la paintComponents?
E come si chiama in modo che venga eseguita solo quando si preme il pulsante? Non capisco come si deve gestire e se posso in qualche modo
chiamarla dal metodo che gestisce il click del mouse sul bottone.
|
|
View Content
Hide Content
do un suggerimento: Se si vuole far si che un bottone aggiunga un punto, e che il pannello mostri tutti i punti creati finora, si può definire una struttura che tenga traccia di quanti punti sono stati finora creati (ad esempio una Collection di Punti). La paintComponent dovrà esaminare la struttura e disegnare tutti i punti in essa presenti. Quando si schiaccia un bottone, questo aggiunge il dato alla struttura e chiama la repaint sul pannello.
| |
|
View Content
Hide Content
Ma che differenza c'è tra getWidth e getSize().width ?
|
|
View Content
Hide Content
Dalle API di Java, jawa.awt.Component:
public int getWidth()
- Return the current width of this component. This method is preferable to writing component.getBounds().width, or component.getSize().width because it doesn't cause any heap allocations.
| |
|
View Content
Hide Content
Salve a tutti, ho fatto una semplice applicazione contenente due bottoni. La pressione del primo crea altri bottoni ( che si dispongono ordinanatamente secondo il Flowlayout ) mentre la pressione del secondo li cancella ( partendo dall'ultimo creato ).
I problemi sono due:
- Il primo bottone mi crea si il bottone ma si vede soltanto se ingrandisco la finestra, il prof mi ha detto di fare la repaint ma non funziona lo stesso.
-Il secondo bottone non cancella niente....Ho usato una remove..non sò se è giusto...se qualcuno sa come fare vi ringrazio. Ciao
|
|
View Content
Hide Content
Non vedendo il codice è difficile rispondere.. Lo può aggiungere in allegato?
|
|
View Content
Hide Content
ECCO IL CODICE ( Non ho messo la classe che crea il JFrame perchè non serve nelle spiegazione dell'esercizio )
package ex_mio_1; import javax.swing.*; import java.awt.*; import java.awt.event.*;
public class Contenuto extends JFrame { JPanel contentPane; JPanel nord = new JPanel(); JPanel centro = new JPanel(); JButton bottone_1 = new JButton("Crea bottone"); JButton bottone_2 = new JButton("Cancella bottone");
private void settingJPanel() throws Exception { contentPane=(JPanel)this.getContentPane(); this.setSize(400,300);
contentPane.setLayout(new BorderLayout()); contentPane.add(nord,BorderLayout.NORTH); contentPane.add(centro,BorderLayout.CENTER); nord.setLayout(new FlowLayout()); nord.setBackground(Color.RED); centro.setLayout(new FlowLayout()); centro.setBackground(Color.RED); nord.add(bottone_1); nord.add(bottone_2); Eventi ascoltatore = new Eventi(bottone_1,bottone_2,centro); bottone_1.addActionListener(ascoltatore); bottone_2.addActionListener(ascoltatore); }
public Contenuto() //costruttore della classe che però richiama JbInit... { try { settingJPanel(); //inizializza la finestra } catch(Exception e) { e.printStackTrace(); } } public static void main (String args[]) { new Contenuto(); } }
EVENTI: package ex_mio_1; import javax.swing.*; import java.awt.*; import java.awt.event.*;
class Eventi implements ActionListener { JButton b_1 = new JButton(); JButton b_2 = new JButton(); JPanel p = new JPanel();
public Eventi (JButton bot_1 , JButton bot_2 , JPanel pan) { this.b_1=bot_1; this.b_2=bot_2; this.p=pan; }
public void actionPerformed (ActionEvent e) { JButton oggetto = (JButton)(e.getSource()); JButton newBotton = new JButton("Nuovo");
if (oggetto==b_1) { p.add(newBotton); } if ( oggetto==b_2) { p.remove(newBotton); } } }
|
|
View Content
Hide Content
1) Aggiunta bottoni: nella actionPerformed, dopo p.add(newBotton) occorre chiamare la p.repaint() come avevo suggerito a voce. In realtà tuttavia questo NON BASTA, perchè quando viene modificata la composizione di un Container occorre (prima di farne la repaint) chiamare il metodo validate. Quindi tra la add e la repaint occorre aggiungere una chiamata a p.validate().
2) Rimozione bottoni: varrebbe lo stesso discorso MA QUI C'E' UN ERRORE LOGICO NEL PROGRAMMA. Quello che si intenderebbe fare è RIMUOVERE UNO DEI BOTTONI GIA' PRESENTI, mentre quello che si fa è CREARE UN NUOVO BOTTONE e RIMUOVERLO (senza prima averlo aggiunto...)!. Per fare quel che si desidera, occorrerebbe avere una lista (una collezione, un array, una pila...) in cui tenere traccia dei bottoni già aggiunti ed eliminare l'ultimo!
| |
|
|
|
View Content
Hide Content
Ciao a tutti, ho creato una semplice calcolatrice, utilizzabile con mouse o con tastiera. Mi piacerebbe che deste un'occhiata al codice... cosa ne pensate?
Vi allego un archivio jar: con "java -jar Calcolatrice.jar" (oppure con un doppio click) potrete eseguire il programmino. I sorgenti sono nella cartella /src (potrete aprire il jar con WinZip o simili).
Se vi interessa, una semplice guida per creare i jar è la seguente: http://neptune.netcomp.monash.edu.au/JavaHelp/howto/jar.htm
Grazie per i vostri commenti.
| |
View Content
Hide Content
Stavo cercando di creare il programma della seconda prova degli anni passati,e avevo ipotizzato come soluzione,quella di creare nella finestra principale un BorderLayout,all'interno di questo,nella parte nord un'altro pannello con dentro dei componenti. Il problema è che se passo il tutto (la classe MyPanel con dentro il BorderLayout principale) non riesco ad accedere ai componenti piu interni della parte nord. Non trovo la sintassi corretta... Ho chiamato il pannello principale content , il pannello nord north,e non trovo la sintassi,credevo che facendo content.north potessi arrivarci ma non funziona. Come accedere quindi a campi di pannelli contenuti nel BorderLayout?
|
|
View Content
Hide Content
Per rispondere bisognerebbe vedere il codice, ma in generale il contenimento grafico non è in relazione con il contenimento di oggetti (has-A).
Faccio un esempio:
class MyFrame extends JFrame { JPanel content=new JPanel(); JPanel north=new JPanel(); JButton b= new JButton(); MyFrame () { this.setContentFrame(content); content.setLayout(new BorderLayout); content.add(north,Border.NORTH); north.add(b); ... } ... }
Ho costruito un pannello regolato da un BorderLayout, a nord ho aggiunt un pannello chiamato north che contiene un bottone chiamato b.
Supponiamo ora che io abbia una classe esterna (ad esempio da un listener) a cui è stato passato il mio MyFrame, e supponiamo che in tale classe il mio MyFrame sia chiamato mf. Se voglio accedere al bottone (ammesso che le regole di visibilità public-private ecc. lo permettano), non devo seguire il contenimento dicendo mf.content.north.b
ma semplicemente
mf.b
perchè b è una variabile di istanza di MyFrame, e non importa dove graficamente essa sia stata collocata...
|
|
View Content
Hide Content
ok,grazie mille,ho capito dove sbagliavo,alla radice.. Grazie mille dell'aiuto,ora va tutto alla perfezione
| |
|
View Content
Hide Content
Non ho ben capito il problema, cosa significa che devi accedere ai componenti più interni?
Se devi modificare ad esempio qualche jbutton, basta che fai 'nomejbutton'.'azionedesiderata', senza bisogno di accedere a nulla...
Spero di essere stato di aiuto...
| |
|
View Content
Hide Content
Salve a tutti... Ho una domanda: dopo aver impostato il layout come Flow o Border su un JPanel, è ancora
possibile cambiare le dimensioni degli oggetti creati all'interno?
Mi spiego meglio: io creo un JPanel, successivamente imposto un layout ad esempio di tipo Border, dopodichè inserisco una TextArea che chiamo "testo", diciamo in posizione Center nel Layout, a questo punto provo a fare per definirne le dimensioni, ma non cambia nulla...
C'è un modo per ottenere la dimensione dell'oggetto desiderata pur usando tipi predefiniti di Layout?
O devo porre il Layout a null e impostare manualmente il tutto?
Grazie.
|
|
View Content
Hide Content
Utilizzando un BorderLayout o un FlowLayout non è possibile specificare le dimensioni dei componenti. Sono disponibili altri gestori di layout più flessibili ma meno semplici da utilizzare (ad esempio il GridBagLayout). Tieni presente che anche in questo caso è possibile specificare dei vincoli a cui il componente è soggetto (come per il BorderLayout) che saranno utilizzati per "impaginare" l'interfaccia, e le dimensioni effettive dei componenti saranno calcolate in base a queste e non a quelle esplicitamente specificate da te. Composizioni più complicate si ottengono con il metodo suggerito dal tuo collega, e cioè utilizzando dei pannelli di appoggio sui quali impostare dei gestori di layout opportuni (non null). In generale è buona regola utilizzare questo metodo e non affidarsi al posizionamento assoluto dei componenti.
| |
|
View Content
Hide Content
Io credo che una volta impostato il layout ( a meno che non sia null ovviamente ) non puoi ridimensionare le componenti.....Però hai fatto una domanda interessante....vediamo cosa dicono gli altrivo il prof.
|
|
View Content
Hide Content
Da quanto ho capito io,il Border layout è quello con i punti cardinali no? Il prof non aveva detto che ad esempio nel CENTER si può mettere un'altro JPanel? perche in tal caso se metti un'altro JPanel li dentro,lo puoi mettere con layout null e puoi inserire ogni cosa dove vuoi,spero di non sbagliarmi....
| |
|
|
View Content
Hide Content
Salve a tutti, ho un problema...Io ho fatto un'applicazione, in particolare un orologio....Ora vi spiego il mio problema:
Ho disegnato le lancette con la " fillArc" con lo stesso meccanismo dell'esercizio fatto in classe dal prof che ad ogni click
del mouse si spostava in senso orario il "quarto all'interno del cerchio" ( Il primo dell'animazione) , ovviamente ho aggiunto
un MouseListener che come azione decrementa il grado dell'Arco (la nostra lancetta)...Fino a qui tutto apposto.
-Vorrei modificare l' esercizio: vorrei che lancetta non si spostasse con il click del mouse, cioè usando gli eventi ma
vorrei usare la " Thread.sleep(millisec) " ( messa all'interno del blocco try catch e ad un ciclo while(true) come nell'esempio
del professore riguardante l'esercizio in cui il contentPane cambiava colore da solo dopo 800 Millisec)
Io ho già provato a farlo ma non mi viene giusto, anzi non si vede più niente nel contentPane ( come se fosse = null )
Qualcuno mi potrebbe aiutare?
Grazie, se volete vi posto il codice sorgente.
|
|
View Content
Hide Content
Non è un problema banale! Per fare una animazione di questo tipo occorre avere DUE threads. Ne discuteremo a lezione più avanti. Per ora dovrà portare un pò di pazienza!
| |
|
|
View Content
Hide Content
Salve a tutti, ho un piccolo problema.... quando uso un ImageIcon per personalizzare pulsanti e varie non riesco a impostare il percorso relativo. Mi spiego meglio. Se nel path dell'immagine da caricare scrivo il percorso assoluto (C:\\Documents and Settings\\Mauro\\jbproject\\Agenda\\classes\\agenda\\img\\immagine.jpg ) l'immagine viene corretamente caricata e visualizzata. Il fatto di usare un percorso assoluto però non mi piace (per il soolito problema della distribuzione ad altri utenti...). Allora ho provato a inserire il percorso relativo, rispetto alla certella contenente i file class ma le immagini non vengono trovate! i file class si trovano in C:\\Documents and Settings\\Mauro\\jbproject\\Agenda\\classes\\agenda\\
Non so come fare, questa è l'istruzione che dovrebbe caricare l'imamgine e metterla al posto del pulsante:
Save_floppy.setIcon(new ImageIcon("img\\immagine.jpg"));
|
|
View Content
Hide Content
Se stai usando JBuilder, puoi salvare la tua directory img in quella che per JBuilder e' la "Working Directory" del progetto. Una volta fatto puoi indirizzare l'immagine come hai fatto sopra.
In generale, quando si vogliono distribuire delle risorse associate al programma (come file immagine, gli stessi .class, file di configurazione, ecc..) in modo indipendente dal percorso in cui viene salvata l'applicazione, si puo' "impacchettare" tutto in un archivio con particolari caratteristiche (file .jar). Per approfondimenti si puo' leggere: http://java.sun.com/docs/books/tutorial/deployment/jar/index.html
| |
|
View Content
Hide Content
scusi per il ritardo!
ecco il mio codice:
import java.awt.event.*; import java.awt.*; import javax.swing.*;
public class Pannello extends JPanel { JFrame f; public static final String testolabel="N° click: ";
public Pannello() { this.setupGraphicEnvironement(); this.addComponent();
}
public void setupGraphicEnvironement () { // creazione della finestra f=new JFrame("Counter click"); f.getContentPane().setLayout(null); f.getContentPane().setBackground(Color.GREEN); f.setBackground(Color.GREEN); f.setVisible(true); Dimension d= Toolkit.getDefaultToolkit().getScreenSize(); f.setSize(d.width,d.height); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void addComponent () { // creazione della label e inserimento nel pannello JLabel l=new JLabel(testolabel+0); l.setSize(200,200); f.getContentPane().add(l);
Listen L=new Listen(l); f.getContentPane().addMouseListener(L);
}
public static void main(String[] args) { new Pannello(); } }
|
|
View Content
Hide Content
credo che il tuo problema sia dato dal fatto che fai: f.setVisible(true); prima di aggiungere bottone label ecc... Tu quando crei un Pannello richiami setupGraphicEnvironement e dopo addcomponent. Il problema è che rendi la finestra visibile non appena è creata,e non alla fine di tutto!!dovresti provare a spostare f.setVisible(true); ad esempio nell'ultima riga di addComponent. se non sbaglio non visualizzi i bottoni finche non fai il resize perchè dopo aver reso la finestra visibile non la aggiorni piu,mentre quando fai il resize si aggiorna. Spero sia corretto Comunque sia mancando la classe Listen il programma non funziona correttamente,cioè non vengono contati i click del mouse. ciao ciao
|
|
View Content
Hide Content
Si la diagnosi è esatta.
In alternativa si potrebbe aggiungere una f.repaint(); alla fine della addComponent ().
NOTA: Listen L=new Listen(l); non mi piace. Il nome degli oggetto dovrebbe SEMPRE essere minuscolo, qui è maiuscolo (L).
| |
View Content
Hide Content
grazie adesso provo e poi ti faccio sapere. comunque la classe listener non l'ho inserita perchè non mi sembrava inerente alla domanda in realtà l'avevo fatta. ciao
| |
|
|
View Content
Hide Content
Buon giorno a tutti! volevo chiedere a qualcuno il perchè quando creo una finestra con dei componenti all'interno come dei bottoni,label, ecc per riuscirle a visualizzare devo fare un resize della stessa. ciao e grazie a tutti.
| |
|
View Content
Hide Content
Progammando un po' in java a volte sorge la necessità di associare un listener a due oggeti completamente diversi. Si possono adottare molte soluzioni, tra cui creare listener appositi, passare gli oggetti per riferimento, ecc ...
Volendo sfruttare il parametro "e" degli eventi, ho notato che tra i suoi metodi esiste un getClass( ) e getComponent( )..
É possibile sfruttarli per referenziarsi direttamente all'oggetto che è stato cliccato ? e quindi potervi accedere direttamente senza istanziare una nuova classe? (in questo caso eviterei anche import ripetuti in cima alla classe MouseListener ).
Spero di essere stato abbastanza chiaro...
|
|
View Content
Hide Content
In genere si usa chiamare il metodo getSource sull'evento. Questo restituisce l'oggetto per cui l'evento è stato generato. Avendo quindi ad esempio due bottoni collegati allo stesso ActionListener, si può in questo modo disambiguare quale dei due bottoni è stato premuto.
| |
|
View Content
Hide Content
Non è più conveniente formalizzare una classe che non estenda nessuna altra classe grafica? facendo così non ci siamo già sfumati l'opportunità di ereditarietà della classe stessa?
Mi sto riferendo in particolare alle slide del professore in cui, ad ogni esempio il JFrame viene esteso dalla classe esempio che facciamo.
Ci sono dei pro "computazionali" oppure è solo a scopo didattico?
Grazie
|
|
View Content
Hide Content
In genere si costruiscono sottoclassi delle componenti grafiche primitive (es. di JFrame) per ottenere componenti customizzate che abbiano i requisiti richiesti per il programma. Nella maggior parte dei casi questo approccio va bene. Responsabilità di tipo diverso (ad esempio gestionali) vengono di solito incapsulate in altre classi che possono essere collegate alla finestra stessa. In genere si segue una scomposizione "Model - View - Controller" in cui il Model contiene i dati, la View la presentazione degli stessi, il Controller tutta la logica di business (ovvero di controllo). La parte "View" può essere fatta sottoclassando classi della libreria grafica.
| |
View Content
Hide Content
ciao,io credo che il professore abbia utilizzato quel modo per mostrarci una via possibile,ma non l'unica o la migliore,poichè se guardi la documentazione,il primo programma swing è quello del count dei click del mouse,in cui viene implementata la classe ActionListener e non quella JFrame.. da quanto detto fin'ora ereditare una classe ha la maggior parte delle volte lo scopo di utilizare un istanza di quella classe ed aggiungierci funzionalità,ma se devi creare un semplice frame e inserirci bottoni,beh,credo che entrambi i metodi siano corretti,in fondo ActionListener la devi estendere lo stesso no? Questo è quello che penso di aver capito,correggetemi se sbaglio!
| |
|
View Content
Hide Content
Un ciao a tutti, volevo chiedere al forum un consiglio su come poter sviluppare un layout liquido sulla mia semplicissima applicazione: una finestra con un bottone: cliccando sul bottone il bottone si sposta altrove nella finestra. Vi allego anche il mio codice. Come potete vedere, ho inserito il settaggio della dimensione del frame all'interno della classe ButtonPanel, in modo da poter avere le dimensioni della finestra anche nell'actionPerformed , oltre che nel main. Quello che vorrei fare è avere un solo punto in cui settare le dimensioni della finestra (nell'esempio 400 x 300). Come posso fare?
Ciao e grazie anticipatamente per la risposta.
Giampaolo
/** Author: Franco Giampaolo Date: 20 apr 2006 / (Copyright. 2006) - University / Exercise of Prog II When the user clicks the button, it moves to another position. */ import java.util.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*;
class ButtonPanel extends JPanel implements ActionListener { // create the button JButton bottone = new JButton("Click!"); // set the dimension of the window int rangeX = 400; int rangeY = 300; // constructor : add the button to the ButtonPanel - set size & random position ButtonPanel() { this.add(bottone); this.setLayout(null); bottone.setBounds(rangeX /2 - 50, rangeY /2 - 30, 50, 30); // register the panel as listener at the button bottone.addActionListener(this); bottone.setActionCommand("moving"); }
// this method of ButtonPanel is called when a button is clicked public void actionPerformed(ActionEvent e) { if (e.getActionCommand()=="moving") { int posX, posY; Random generatore = new Random(System.currentTimeMillis()); posX = generatore.nextInt(rangeX - 60); posY = generatore.nextInt(rangeY - 60); System.out.println("The button now in (" + posX + "," + posY + ")"); bottone.setBounds(posX , posY , 50, 30); } } } public class MoveBottone { public static void main(String[] args) {
JFrame frame = new JFrame("Muovi il bottone"); // creo il bottone nel pannello in posizione (x,y) ButtonPanel panel = new ButtonPanel(); frame.getContentPane().add(panel); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400, 300); frame.setVisible(true); } }
|
|
View Content
Hide Content
non capisco bene quello che intendi,ma immagino che vuoi fare una cosa del genere: frame.setSize(DIMENSIONI_IN_BUTTONPANEL) non vorrei dirti una cavolata,ma te li hai inseriti appunto in button panel,giusto? definendoli cosi: int rangeX = 400; int rangeY = 300; quindi non sono private e li dovresti poter richiamare dall'esterno se crei un'istanza di ButtonPanel,cosa che nel main fai quasi subito. Hai provato a fare: frame.setSize(panel.rangeX,panel.rangeY); ? A me funziona senza problemi. Un'altra cosa,ti consiglio di inserire una riga tipo: Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); f.setLocation((screenSize.width - panel.rangeX)/2,(screenSize.height - panel.rangeY)/2);
almeno cosi hai la finestra centrata,è un pò piu bella esteticamente al centro piuttosto che in cima. saluti
|
|
View Content
Hide Content
ok ho fatto le modifiche da te consigliate e funziona! Ho capito come gestire questa casistica di problemi, grazie. Ciao
| |
|
|
View Content
Hide Content
Buongiorno a tutti! Secondo voi esiste una priorità particolare nell'inserimento e/o creazione delle componenti grafiche per costruire la GUI all'interno di una classe? Quale sarebbe la priorità per costruire una finestra con un bottone ? Il bottone lo creo prima o dopo aver creato la finestra ? Rendo visibile il JFrame prima o dopo aver creato tutte le componenti ?
Grazie mille per la risposta
giampaolo
|
|
View Content
Hide Content
Se ho ben capito stai chiedendo in che ordine creare i componenti,giusto? Bene,se quello che ho imparato è corretto,penso che per prima cosa si debba creare un JFrame,in cui verrà posizionato il contentpane,dentro il quale ci puoi inserire i bottoni. Poi dipende da come fai la tua classe,ad esempio nell'esempio precedente la classe estendeva il JFrame,quindi al suo interno si creavano un contentpane e uno o piu bottoni (prima il new ecc... e poi contentpane.add(bottone) ) e l'istanza del JFrame veniva creata o nel main,o in un metodo di appoggio. Per il rendere visibile il tutto,come consigliato dal professore è piu corretto rendere visibile la finestra DOPO aver creato l'intera GUI,altrimenti ti vedi una finestra che si muove,ingrandisce e crea bottoni davanti agli occhi,e non mi pare molto corretto. Spero di aver risposto correttamente e in modo chiaro, in ogni caso ti consiglio di guardare l'esemprio nella documentazione: Vai su Java Tutorials,creating a GUI with JFC/Swing,Learning by example,e segli il secondo esempio. Piu precisamente l'indirizzo è: http://java.sun.com/docs/books/tutorial/uiswing/learn/example2.html Se ti guardi il sourcecode del programma è semplice e ti mostra anche come impostare il look & feel (attento però,ho notato che il GTK su win non è installato). saluti.
|
|
View Content
Hide Content
La risposta di Dorigatti è sostanzialmente corretta. Ci sono tre fasi nella costruzione di un pezzo di interfaccia: - creazione - inizializzazione-composizione - visualizzazione Suggerisco di rispettare l'ordine delle fasi. PRIMA si creano gli elementi (non importa i che ordine, anche prima un bottone e poi la finestra che lo conterrà). SUCCESSIVAMENTE si inizializzino le componenti specificandone le proprietà (ad es. settando il colore di background, definendo i listeners ecc.). QUINDI s effettui la composizione, pondendo bottoni, labels ecc. nei pannelli (se si prevedono questi contenitori intemedi) e i disponendo i pannelli dentro la finestra. INFINE si visualizzi il tutto.
| |
|
|
View Content
Hide Content
Questa mattina ero in laboratorio per provare uno dei programmi assegnati dal professore,con un compagno siamo arrivati alla soluzione,ma tale programma non funzionava a dovere. trovate il source qui: http://www.turricatch.altervista.org/SelPosition.java il programma dovrebbe spostare il bottone dove si clicca con il mouse,e se si clicca il bottone quest'ultimo torna alla posizione iniziale. Bene,in laboratorio non funzionava a dovere,cioè spostava il bottone ovunque,ma premendolo non ritornava alla posizione iniziale,lo faceva solo se si trovava nell'area in cui veniva posizionato al momento della creazione. Nel pomeriggio poi ho provato lo stesso file da casa e funzionava alla perfezione,utilizzando Windows. Volevo sapere se qualcuno ha provato qualche programma e ha avuto problemi analoghi.
|
|
View Content
Hide Content
Ecco in attachmentl file di cui parla Dorigatti. Bravi per essere riusciti a fare una implementazione. Non mi è chiarissimio dalla descrizione quale sia il probleme riscontrato. Devo dire che a prima vista una cosa che sicuramente NON mi piace l'uso delle variabili dichiarate static (anche se questo non ha nulla a che vedere con il problema riferito). In un compito di esame una soluzione basata su static in questo tipo porterebbe ad una sottrazione di punti... Riuscite a riaggiustarlo eliminando lo static usato a spoposito? RIcordate che static si usa quando serve definire una proprietà che deve essere condivisa da tutte le istanze della classe, cosicchè se una la cambia, cambia anche per gli altri. Qui static è usato per risolvere artificiosamente un altro problema. Quale? Qual'è la soluzione corretta?
|
|
View Content
Hide Content
riguardando il codice mi sono accorto che le righe static int xb e static int yb sono obsolete e non usate. la riga successiva: static Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); viene utilizzata solo in questa riga: f.setLocation((f.screenSize.width - frameSize.width)/2,(f.screenSize.height - frameSize.height)/2); che si trova nel metodo appoggio nella classe,quindi static è inutile,o meglio si può togliere senza danni. D'altro canto,se è vero che stati è usato per proprietà condivise da tutte le istanze di classe,è vero che screenSize è una variabile che dovrebbe essere presa una volta e vale per tutti,poichè solitamente la risoluzione dello schermo è una unica per ogni oggetto. In ogni caso static si può rimuovere,e quindi mi pare che il problema delle variabili static sia passato. Per quanto riguarda il mio problema intendevo dire che,in laboratorio, fintanto che volevo spostare il bottone in base alla posizione del mouse tutto andava perfettamente,ma quando volevo premere il pulsante per farlo tornare alla posizione iniziale,non accadeva nulla,come se tutto fosse coperto da un layer invisibile che gestiva solo il MouseListener. Ora a casa però lo stesso codice funziona,e chiedevo appunto se qualcuno ha riscontrato questa anomalia. Settimana prossima ad ogni modo voglio riprovare il codice.
Ps:Su windows e con Firefox 1.5.0.2 L'RSS non funziona,mi rimanda al sorgente della pagina dicendo: Il file XML specificato apparentemente non ha un foglio di stile associato. L'albero del documento è mostrato di seguito.
saluti.
|
|
View Content
Hide Content
Per L'RSS occorre avere un lettore RSS, da installare ad esempio come plug in di Firefox (vedere sotto la voce "Benevenuti al Forum").
| |
|
|
|
View All Content
Hide All Content
|
Benvenuti al Forum > in depth |
|
|
|