View Full Version : [JAVA] Come si visualizza del testo alle coordinate (x, y) dentro una nuova finestra?
Ciao a tutti, volevo chidere il vostro aiuto per riuscire a visualizzare stringhe, alle coordinate desiderate, all'interno di una nuova finestra.
Esattamente che classi devo usare?
P.s. Nei miei primi tentativi ho provato ad aprire la nuova finestra con jframe, ed in seguito a fare un add di una jlabel con del testo scritto... Ammetto che ho fatto un fatica bestia per riuscire anche solo a far comparire la stringa (ogni volta che voglio aggiornare la finestra devo usare il comando <oggettoJFrame>.setVisible(true);??? Perchè ho notato che altrimenti non compare nulla nella finestra...) quindi se mi spigaste anche che metodi delle classi usare per avere un controllo di base su quello che faccio ve ne sarei davvero grato...
Grazie in anticipo :help:
Spero tanto che qualcuno riesca a darmi una dritta entro domani sera :p
sottovento
03-02-2013, 07:57
Probabilmente non hai ancora ricevuto risposta perche' la domanda non e' proprio chiara.
Dalla prima frase, sembrerebbe che tu voglia disegnare all'interno di una finestra. In tal caso, per esempio potresti creare una sottoclasse di una JFrame e ridefinire il metodo paint(Graphics g). Avresti quindi a disposizione i metodi drawString().
Nel P.s. invece sembra che la tua intenzione sia creare una HMI. In tal caso non e' necessario "disegnare" come detto precedentemente, ma occorre usare per esempio Swing per creare l'interfaccia grafica di tuo gradimento con scritte, bottoni, menu e quant'altro.
Normalmente gli sviluppatori Java, in questo caso, non posizionano gli elementi fornendone le coordinate ma utilizzando dei "layout", cioe' degli oggetti invisibili usati solo per il posizionamento dei controlli sulla finestra.
Ovviamente puoi anche disabilitare questo modo di operare e posizionare i tuoi controlli "a mano" (i.e. mediante coordinate) ma tale sistema e' raramente utilizzato in java.
Ho risposto alla tua domanda? In caso affermativo e nel caso voglia saperne di piu', puoi guardare il tutorial di PGI-Bis (che sarebbe bello rivedere) su questo forum:
http://www.hwupgrade.it/forum/showthread.php?t=2005654
Innanzitutto grazie per la risposta. :)
Chiedo scusa per come ho posto la domanda, purtroppo a causa della mia ingoranza sull'argomento non sono riuscito a spiegarmi correttamente :(
Quello che devo fare è:
1) Aprire una nuova finestra.
2) Utilizzare questa finestra come output su schermo.
3) Le stringhe dovranno comparire a coordinate specifiche all'interno della finestra.
Spero si capisca meglio, grazie mille del tuo tempo :)
Precisamente sono interessato a questo, fra i vari esempi che mi hai esposto: Ovviamente puoi anche disabilitare questo modo di operare e posizionare i tuoi controlli "a mano" (i.e. mediante coordinate) ma tale sistema e' raramente utilizzato in java.
Ma il mio intento non è creare un'interfaccia utente (niente controlli, bottoni, ecc), ma solo far comparire informazioni nella finestra sotto forma di testo.
Ora mi leggo la guida che mi hai dato :)
sottovento
03-02-2013, 12:24
Se vuoi utilizzare una finestra come una console
- potresti usare la "solita" System.out.println() cosi' da fare output in formato test;
- Potresti aprire un JFrame, inserirvi una JTextArea che tenga tutta la finestra ed appendere le scritte che ti servono, per esempio:
import java.awt.*;
import javax.swing.*;
class MyConsole extends JFrame
{
private JTextArea ta;
public MyConsole()
{
setSize(800, 600);
setTitle("My console");
buildGUI();
}
private void buildGUI()
{
ta = new JTextArea();
getContentPane().add(new JScrollPane(ta), BorderLayout.CENTER);
}
public void print (String str)
{
ta.append(str);
}
public void println(String str)
{
ta.append (str + "\n");
}
public static void main(String[] args)
{
MyConsole myConsole = new MyConsole();
myConsole.setVisible(true);
myConsole.println ("Ciao da sottovento");
myConsole.println ("Oggi e' il mio compleanno");
}
}
NOTA - questo e' solo un esempio scritto in 2 secondi. La qualita' e' quella di un esempio scritto in 2 secondi. Serve solo a rendere l'idea :D
- Se proprio vuoi sempre scrivere alla stessa posizione, allora fai cosi':
import java.awt.*;
import javax.swing.*;
class MyConsole extends JFrame
{
private String message;
public MyConsole()
{
message = null;
setSize(800, 600);
setTitle("My console");
}
public void print (String str)
{
message = str;
repaint();
}
public void paint(Graphics g)
{
Graphics2D g2d = (Graphics2D)g;
if (message != null)
g2d.drawString(message, 100, 100);
}
public static void main(String[] args)
{
MyConsole myConsole = new MyConsole();
myConsole.setVisible(true);
myConsole.print ("Ciao da sottovento");
}
}
NOTA - questo e' solo un esempio scritto in 2 secondi. La qualita' e' quella di un esempio scritto in 2 secondi. Serve solo a rendere l'idea :D
Ok, credo che ci siamo quasi... :D
Quindi con il tuo secondo esempio posso far comparire una stringa sempre nelle specifiche coordinate(100, 100) della finestra...
Ma se io avessi bisogno di far comparire diverse stringhe in diverse posizioni specifiche di questa finestra?
P.S. Sempre nel tuo secondo esempio, nel metodo print(String str)
invochi il metoto repaint(), è un errore? volevi richiamare il paint poco sotto?
Non sai quanto ti sono grato del tuo aiuto! :cry:
P.S.2 Il metodo paint prende un oggetto graphics come parametro esplicito, come si crea quell'oggetto?
sottovento
03-02-2013, 13:50
Ok, credo che ci siamo quasi... :D
Quindi con il tuo secondo esempio posso far comparire una stringa sempre nelle specifiche coordinate(100, 100) della finestra...
Ma se io avessi bisogno di far comparire diverse stringhe in diverse posizioni specifiche di questa finestra?
P.S. Sempre nel tuo secondo esempio, nel metodo print(String str)
invochi il metoto repaint(), è un errore? volevi richiamare il paint poco sotto?
Non sai quanto ti sono grato del tuo aiuto! :cry:
P.S.2 Il metodo paint prende un oggetto graphics come parametro esplicito, come si crea quell'oggetto?
Il secondo esempio serve appunto per disegnare. Il testo e' disegnato alle coordinate indicate. Sei *veramente* sicuro che ti serve quella soluzione?
Non e' quella usuale per trattare il testo, normalmente si usa la prima.
Il repaint() non e' un errore. Infatti il metodo paint() viene chiamato dal Java quando e' necessario ridisegnare la finestra (o una sua porzione) per i motivi piu' disparati. repaint() forza il ridisegno. Era necessario poiche' Java non puo' sognarsi che ho cambiato una stringa e che essa deve essere ridisegnata.
L'oggetto Graphics in questo caso e' creato da Java e passato al momento del ridisegno.
Nel caso voglia usare questa strada, e debba far apparire piu' stringhe, e' probabile che vorrai fare in modo che non si sovrappongano.
In tal caso ti conviene usare la class FontMetrics.
La puoi ottenere dall'oggetto Graphics2D, per esempio
FontMetrics fm = g2d.getFontMetrics();
Questo oggetto contiene tutte le informazioni, per esempio, per poter andare a capo correttamente (incrementando per esempio la y di una quantita' pari a fm.getHeight()).
Puoi anche ottenere la lunghezza di una stringa, per esempio con
lunghezza = fm.stringWidth("mia stringa")
cosi' da sapere quanto occupera' a schermo.
Effettivamente utilizzare le stringhe come oggetti grafici sembra un po' macchinoso... :what:
Il problema è che nel primo esempio che mi hai fatto non posso sistemare le stringhe dove voglio, invece io ho bisogno che appaiano a coordinate da me decise, non mi interessa un controllo sulle sovrapposizioni, se mai ci fosse questo problema mi basterebbe cambiare le coordinate, giusto? :confused:
Ho letto tutta la giuda che mi hai indicato, dimmi se è giusto questo procedimento: creo una nuova finestra con un layout che la divide orizzontalmente in 2 semplici parti, nella parte sopra aggiungo un oggetto jLabel, nella parte sotto aggiungo un componente JTable che posso riempire riga a riga con stringhe per mezzo di un ciclo for... Posso farlo?
Vincenzo1968
03-02-2013, 15:10
Ho letto tutta la giuda che mi hai indicato, dimmi se è giusto questo procedimento: creo una nuova finestra con un layout che la divide orizzontalmente in 2 semplici parti, nella parte sopra aggiungo un oggetto jLabel, nella parte sotto aggiungo un componente JTable che posso riempire riga a riga con stringhe per mezzo di un ciclo for... Posso farlo?
Si tratta di una qualche guida traditrice?
No, nella fretta ho premuto prima la i della u :D
Vincenzo1968
03-02-2013, 15:53
No, nella fretta ho premuto prima la i della u :D
Si lo so, si capisce benissimo che si tratta di un errore di distrazione dovuto alla fretta. ;)
:D
Per caso mi sai dare anche una dritta per il mio problema? :help:
Vincenzo1968
03-02-2013, 16:15
Nonsi, mi dispiace. Di Java non me ne intendo.
:boh:
Segui i consigli di Sottovento ;)
sottovento
03-02-2013, 16:54
Ho letto tutta la giuda che mi hai indicato, dimmi se è giusto questo procedimento: creo una nuova finestra con un layout che la divide orizzontalmente in 2 semplici parti, nella parte sopra aggiungo un oggetto jLabel, nella parte sotto aggiungo un componente JTable che posso riempire riga a riga con stringhe per mezzo di un ciclo for... Posso farlo?
Si, puoi farlo ma e' difficile.
Forse hai dato pochi dettagli del tuo progetto, ma mi sembrava che il problema fosse solo quello di visualizzare qualche scritta.
A questo punto, invece della JTable potresti usare la JTextArea come ho fatto nell'esempio che ti ho dato, cosi' da accodare semplicemente le stringhe che vuoi mandare a schermo. Anche se lo puoi fare con una JTable, non mi sembra proprio l'oggetto indicato.
All'inizio il mio obbiettivo era di trovare un modo per far comparire varie stringhe in vari punti specifici della finestra, ma dato che, a quanto ho capito, non è possibile farlo con un semplice metodo che mi chieda le coordinate per l'inserimento della stringa, l'unico modo per farlo è usare un layout che suddivida la finestra in varie porzioni di pixel da riempire ognuno con un oggetto di tipo jLabel, giusto?
sottovento
03-02-2013, 18:22
All'inizio il mio obbiettivo era di trovare un modo per far comparire varie stringhe in vari punti specifici della finestra, ma dato che, a quanto ho capito, non è possibile farlo con un semplice metodo che mi chieda le coordinate per l'inserimento della stringa, l'unico modo per farlo è usare un layout che suddivida la finestra in varie porzioni di pixel da riempire ognuno con un oggetto di tipo jLabel, giusto?
Si, mi sembra una buona soluzione, e facile da realizzare.
Fantastico! Confermo che il risultato è perfetto!
Ti ringrazio tantissimo! :D
Posso farti un'altra domanda? Come si fa a ricevere un input da tastiera (un singolo tasto, senza dover premere invio) nella mia finestra JFrame?
Premetto che ho letto la guida, ma non riesco a capire quele sia il metodo più semplice per farlo...
sottovento
04-02-2013, 04:00
Fantastico! Confermo che il risultato è perfetto!
Ti ringrazio tantissimo! :D
Posso farti un'altra domanda? Come si fa a ricevere un input da tastiera (un singolo tasto, senza dover premere invio) nella mia finestra JFrame?
Premetto che ho letto la guida, ma non riesco a capire quele sia il metodo più semplice per farlo...
Ogni Component ha un metodo che si chiama addKeyListener() a cui si passa un listener, cioe' una classe che implementa l'interfaccia KeyListener.
Ogni qualvolta che un tasto verra' premuto, l'evento(i) corrispondente verra' inviato al key listener di default, i.e. quello che ha il focus al momento della pressione del tasto.
Questo e' quanto ti serve per poter implementare quello che vuoi fare
Quali classi realizzano keyListener?
Che intendi per "focus" in questo contesto?
Il programma si interrompe per attendere che venga premuto un tasto?
sottovento
05-02-2013, 12:17
Il Focus e' l'oggetto di default, quello che e' "evidenziato" da un bordo maggiore o in altro modo.
Nel caso di Windows e' normalmente bordato, e sai che se premi Enter o Space, se l'oggetto che ha il focus e' un bottone verra' premuto come se ci si facesse click sopra.
Utilizzando l'interfaccia che ti ho detto, puoi ricevere gli eventi di tipo "Tasto" quando l'utente digita sulla tastiera. Ovviamente i tasti digitati vengono inviati all'oggetto che ha il focus.
Non serve aspettare il tasto invio.
Domanda - scusami ma te la devo fare: sei sicuro che sia esattamente quello che ti serve? Se per esempio vuoi ottenere l'input dell'utente da tastiera, ci sono modi ben piu' semplici....
Sei davvero gentile! Grazie mille ancora per il tuo aiuto :D
Ti spiego esattamente quello che devo ottenere: ho un array di dati lungo lungo lungo, devo visualizzare questi dati su una finestra in modo ben ordinato, e fin qui ci sono riuscito, poi ad ogni pressione del tasto a (avanti) oppure del tasto i (indietro) della tastiera la finestra deve svuotarsi e riempirsi con la porzione di dati seguenti o precedenti dell'array suddetto :)
sottovento
07-02-2013, 04:48
Sei davvero gentile! Grazie mille ancora per il tuo aiuto :D
Ti spiego esattamente quello che devo ottenere: ho un array di dati lungo lungo lungo, devo visualizzare questi dati su una finestra in modo ben ordinato, e fin qui ci sono riuscito, poi ad ogni pressione del tasto a (avanti) oppure del tasto i (indietro) della tastiera la finestra deve svuotarsi e riempirsi con la porzione di dati seguenti o precedenti dell'array suddetto :)
Quanto lungo? Una JList puo' visualizzare milioni di dati senza problemi, basta qualche piccolo accorgimento. Sicuro che non ti puoi semplificare la vita cosi'?
Purtroppo no, il programma esegue dei calcoli e mi restituisce un centinaio di risultati, quando premo a, deve eseguire altri calcoli, diversi da prima, e restituirmi un altro centinaio di risultati...
E' fondamentale che i nuovi risultati compaiano nella medesima posizione dei precedenti... E così deve accadere ogni volta che premo il tasto a oppure il tasto i... :what:
Credo che implementare correttamente l'input da tastiera sia l'unico modo per ottenere questo risultato, il problema è che non riesco a trovare un semplice spezzone di codice che mi mostri come farlo... :(
sottovento
08-02-2013, 04:11
Scusa, mi sono un po' perso.
No, non sono d'accordo: se hai sempre lo stesso numero di risultati e' abbastanza semplice mantenerne l'ordine, e una JList o JTable ti aiuterebbero molto, rendendoti la vita molto facile. Ovviamente se vuoi puoi sempre svuotare e riempire ad ogni pressione dei tasti che ti interessano.
Se hai un pezzo di codice gia' fatto si puo' dare un'occhiata. Penso che l'uso dell'interfaccia KeyListener sia piuttosto chiaro, no?
Perfetto, allora questo pomeriggio butto giù una bozza del codice, se ho dei problemi posto qui :D
Grazie di tutto Sottovento :)
import java.awt.*; import javax.swing.*; import java.awt.event.*; import javax.swing.JComponent;
public class Finestra {
public static JFrame window = null; public static MovementAdapter ourKey = null; public static JPanel grid = null; public static int k = 0;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
grid = new JPanel(new GridLayout(5, 4));
grid.add(new JLabel("A", JLabel.CENTER));
grid.add(new JLabel("B", JLabel.CENTER));
grid.add(new JLabel("C", JLabel.CENTER));
grid.add(new JLabel("D", JLabel.CENTER));
for(int i = 0; i < 16; i++) {grid.add(new JLabel("" + i, JLabel.CENTER));}
window = new JFrame("Test");
window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
window.add(grid);
window.pack();
window.setLocationRelativeTo(null);
window.setVisible(true);
ourKey = new MovementAdapter();
window.addKeyListener(ourKey);
}
});
}
public static void outData(int s) {
grid = new JPanel(new GridLayout(2, 1));
JPanel titolo = new JPanel(new GridLayout(1, 1));
grid.add(titolo);
titolo.add(new JLabel("Ciao, come Stai?", JLabel.LEFT));
JPanel dati = new JPanel(new GridLayout(4, 30));
for(int i = 0; i < 120; i++) {
dati.add(new JLabel(" " + (float) s * 1000, JLabel.CENTER));
}
grid.add(dati);
}
public static class MovementAdapter extends KeyAdapter {
public void keyPressed(KeyEvent ke) { int kc = ke.getKeyCode();
if (kc == ke.VK_DOWN) {window.remove(grid); outData(--k); window.add(grid); window.pack(); window.setVisible(true);}
else {
if (kc == ke.VK_UP) {window.remove(grid); outData(++k); window.add(grid); window.pack(); window.setVisible(true);}
}
}
}
}
Ecco il codice, che te ne pare?! :D (Quando lo posto la formattazione delle parentesi va a quel paese)
sottovento
11-02-2013, 06:04
Ecco il codice, che te ne pare?! :D (Quando lo posto la formattazione delle parentesi va a quel paese)
Si presenta bene. Stai andando alla grande!
(per quanto riguarda la formattazione, non devi usare il bottone di quote ma quello di "CODE", fatto apposta. Cmq non ti preoccupare, e' ok)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.