Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Acer TravelMate P4 14: tanta sostanza per l'utente aziendale
Acer TravelMate P4 14: tanta sostanza per l'utente aziendale
Forte di soluzioni tecniche specifiche, il notebook Acer TravelMate P4 14 abbina dimensioni compatte e buona robustezza per rispondere alle necessità specifiche degli utenti aziendali. La piattaforma AMD Ryzen 7 Pro assicura prestazioni elevate con i tipici ambiti di produttività personale e sul lavoro, mantenendo un'elevata autonomia.
Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque
Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque
Dal salotto al giardino, il nuovo proiettore laser di Hisense promette esperienze cinematografiche in qualsiasi contesto: qualità d’immagine, semplicità d’uso, versatilità e prezzo competitivo il suo poker d'assi
Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il convertibile di classe
Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il convertibile di classe
La flessibilità di configurazione è il punto di forza di questo 2-in-1, che ripropone in un form factor alternativo tutta la tipica qualità dei prodotti Lenovo della famiglia ThinkPad. Qualità costruttiva ai vertici, ottima dotazione hardware ma costo che si presenta molto elevato.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-05-2007, 12:11   #1
bouncey2k
Member
 
Iscritto dal: Jan 2006
Messaggi: 271
[java] inserire botton in JFrame

Dopo aver creato una Finestra (vedi codice sottostante), come posso inserire un bottone all'interno della finestra?

JFrame finestra = new JFrame("Finestra");
finestra.setSize(400,600);
finestra.setVisible(true);
bouncey2k è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2007, 12:16   #2
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Dipende da dove lo vuoi inserire. Supponendo che tu voglia metterlo in alto a sinistra puoi dire:

JFrame finestra = new JFrame("Finestra");

JPanel pannelloPulsanti = new JPanel(new FlowLayout(FlowLayout.LEFT));
JButton pulsante = new JButton("Maramao");
pannelloPulsanti.add(pulsante);
finestra.add(pannelloPulsanti, BorderLayout.NORTH);

finestra.setSize(400,600);
finestra.setVisible(true);
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!

Ultima modifica di PGI-Bis : 23-05-2007 alle 12:17. Motivo: north al posto di top
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2007, 12:17   #3
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da bouncey2k Guarda i messaggi
Dopo aver creato una Finestra (vedi codice sottostante), come posso inserire un bottone all'interno della finestra?

JFrame finestra = new JFrame("Finestra");
finestra.setSize(400,600);
finestra.setVisible(true);
Innanzitutto in genere è meglio creare una sottoclasse di JFrame, non creare un JFrame così .. al volo.

Comunque per aggiungere componenti si usa uno dei metodi add() in overload di Container. Poi comunque bisogna anche tenere in considerazione il layout-manager utilizzato, che se non diversamente specificato per default è il BorderLayout.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2007, 12:20   #4
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Non concordo sul fatto che sia meglio creare sottoclassi. Anzi, credo che, se possibile, l'estensione andrebbe evitata ad ogni costo.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2007, 12:30   #5
bouncey2k
Member
 
Iscritto dal: Jan 2006
Messaggi: 271
è normale che oltre ai bordi del pulsante compaiano dei bordi anche intorno alla scritta?
bouncey2k è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2007, 12:37   #6
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
In un AbstractButton (tra cui JButton) il bordo interno segnala il possesso del focus. Se aggiungi un altro pulsante:

JFrame finestra = new JFrame("Finestra");

JPanel pannelloPulsanti = new JPanel(new FlowLayout(FlowLayout.LEFT));
JButton pulsante = new JButton("Maramao");
pannelloPulsanti.add(pulsante);
JButton altroPulsante = new JButton("Marameo");
pannelloPulsanti.add(altroPulsante);

finestra.add(pannelloPulsanti, BorderLayout.NORTH);

finestra.setSize(400,600);
finestra.setVisible(true);

noterai come il bordo interno è presente solo in uno dei due. Puoi dire ad un pulsante di non disegnare questo bordo con setFocusPainted(false).

pulsante.setFocusPainted(false);

Trattandosi di un segnale utile nel caso in cui l'utente interagisca con l'interfaccia attraverso la tastiera sarebbe preferibile lasciarlo o, nel caso in cui sia rimosso, sostituirlo con un qualche genere di "highlight" (da fare a mano).
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2007, 12:42   #7
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Non concordo sul fatto che sia meglio creare sottoclassi. Anzi, credo che, se possibile, l'estensione andrebbe evitata ad ogni costo.
Eh? E perché?
E tutte le ben note questioni sulla "coesione", sul riutilizzo, ecc..?? Le friggiamo?
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2007, 13:23   #8
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Premetto che è un certo (ab)uso dell'estensione ad essere problematico più che l'estensione in sè. E' come il martello che qualcuno amava citare nei suoi messaggi: puoi piantarci un chiodo o darlo in testa al tuo vicino. In entrambi i casi adoperi lo strumento ma nel secondo caso è abuso.

Il problema dell'estensione è che, in quanto forma di ereditarietà, la specie (estensore) dichiara il possesso di tutte le caratteristiche del genere (esteso).

Nel momento in cui io estendo JFrame dichiaro il rispetto di un contratto costituito da 319 metodi pubblici a cui andrebbero aggiunti i protetti e gli innominabili.

Questo è quello che io, programmatore, devo leggere quando mi trovo di fronte a quel sorgente. Chi l'ha scritto ha "visto" un insieme di oggetti con 319 comportamenti. Una elementare considerazione di economia razionale, che in grammatica diventa regola, vuole che un oggetto dichiari tutti e soli i metodi di cui ha bisogno per assolvere al suo compito nel sistema di cui è parte.

E qui sta il punto. A meno che io non stia creando un oggetto che è parte del sistema swing, che non è un'interfaccia utente ma un framework per la creazione di ogni genere di interfacce utente, l'estensione viola l'elementare principio di economia razionale secondo cui uno dichiara ciò che è necessario ad esprimere un significato.

E' la stessa differenza che c'è tra dire:

<<Pierluigi, vai a prendere il pane.>>

e dire

<<Pierluigi, nel mezzo del cammin di nostra vita... e dopo una settimana ... l'amor che move il sole e l'altre stelle, vai a prendere il pane.>>

Dirò una blasfemia: si chiamano "linguaggi" perchè sono forme di comunicazione. E la comunicazione ha le sue regole anche quando il destinatario sia un calcolatore.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2007, 14:14   #9
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Il problema dell'estensione è che, in quanto forma di ereditarietà, la specie (estensore) dichiara il possesso di tutte le caratteristiche del genere (esteso).

Nel momento in cui io estendo JFrame dichiaro il rispetto di un contratto costituito da 319 metodi pubblici a cui andrebbero aggiunti i protetti e gli innominabili.
Su questo sono d'accordo, se estendo un JFrame allora MioFrame è-un JFrame, pertanto tutto quello che potrei fare su un JFrame potrei farlo pure sul MioFrame.

Tu però ti stai basando solo sul fatto che semplicemente non vuoi che tutto ciò che fa parte di un JFrame venga visto anche nella classe derivata. Ma bisogna anche valutare ben altri aspetti secondo me.

Se non volessi estendere JFrame, JDialog, ecc.... allora potrei fare una mega classe MiaApplicazione in cui butto dentro la gestione di tutti i vari JFrame, JDialog ecc... di cui posso avere bisogno. Bello ... verrebbe una cosa enorme e ingestibile!
E se i vari JFrame, JDialog li devo utilizzare più volte nella applicazione, che faccio? E se devono avere, come è tipico, uno "stato", cioè contenere informazioni varie, reference ad altri oggetti, ecc... cosa faccio? dove le metto queste informazioni?

Estendendo JFrame ecc... invece ho diversi vantaggi:
- coesione: la classe è ben focalizzata su un ben preciso scopo.
- incapsulazione: lo stato interno del frame posso nasconderlo.
- riutilizzo: la classe posso riutilizzarla, se necessario, più volte nella applicazione in modo semplice.

Insomma ... è vero quello che hai detto all'inizio ma secondo me non estendere JFrame & company porta più svantaggi che vantaggi. Percui si dovrebbe privilegiare l'ereditarietà piuttosto che il voler evitare che un tuo frame venga visto con tutto quello che ha un JFrame.

Dopotutto se sviluppo una applicazione, allora l'utilizzo dei vari frame/dialog è ben specifico e se è una applicazione non è una libreria, pertanto deve essere subito ben chiaro a tutti che non si può utilizzare quel tal frame o dialog per farci chissà che cosa a mo' di libreria.

Tutto questo ovviamente secondo la mia (modesta e insignificante) opinione.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2007, 14:47   #10
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Sì, ma tutto quello che potresti fare con un JFrame non è tutto quello che fai con un JFrame. Tra l'altro non vedo come questo possa condurre alla creazione della megaclasse MiaApplicazione. La soluzione sta nell'uso del semplicissimo composition and forwarding.

Codice:
public class FinestraApplicazione {
    private JFrame frame = new JFrame("Hello");

    public void show() {
        frame.setVisible(true);
    }
}
Ciò che FinestraApplicazione può fare a differenza di FinestraApplicazione extends JFrame è esprimere l'insieme necessario di comportamenti che qualificano il concetto di "finestra" non per il framework Swing, che ha i suoi scopi e le sue necessità, ma per la mia applicazione, che ne certamente ben altri.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2007, 15:02   #11
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
La soluzione sta nell'uso del semplicissimo composition and forwarding.

Codice:
public class FinestraApplicazione {
    private JFrame frame = new JFrame("Hello");

    public void show() {
        frame.setVisible(true);
    }
}
È vero ... mi ero dimenticato di questa possibilità.
Non mi dò dello scemo perché non lo sono .... posso rimangiarmi un pezzettino di quello che ho scritto prima?

Io in effetti ho sempre esteso JFrame & company .... da ora in poi proverò a usare la composizione. Però stavo pensando ... questo cosa comporta? Intendo il fatto che frame è private. Se per caso fosse necessario dall'esterno (da altre classi) fare riferimento a quel frame?
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2007, 16:06   #12
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12103
Codice:
public class FinestraApplicazione {
    private JFrame frame = new JFrame("Hello");

    public void show() {
        frame.setVisible(true);
    }

    public JFrame frame() {
        return frame;
    }
}
è la prima cosa che m'è venuta in mente
... oppure getFrame() se si vogliono rispettare le care convenzioni Java
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2007, 16:15   #13
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Dal punto di vista del significato comporta tutto e solo quello che è pubblico. Io vedo quella roba lì e dico che per chi l'ha scritta una "FinestraApplicazione" è qualcosa che può essere visualizzato.

"E se qualcuno avesse bisogno di quel frame"...sarebbe un bell'intoppo .

Penso che si dovrebbe analizzare quel bisogno per capire quale parte del contratto di JFrame lo soddisfi. Se i metodi che saltano fuori sono relativamente pochi si può continuare con il composition and forwarding. Altrimenti si riduce la classe con un'interfaccia e si pubblica questa.

Poi è anche possibile che sia richiesto tutto il contratto di JFrame. Anche in questo caso, tuttavia, prima di dichiarare una classe con 300 metodi io tenterei un "vampiro". Che è facile ma un po' lungo da spiegare .
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2007, 16:21   #14
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Quote:
Originariamente inviato da ^TiGeRShArK^ Guarda i messaggi
Codice:
    public JFrame frame() {
        return frame;
    }
e a quello che fa una cosa così noi ci tagliamo i ditini santi

Scherzi a parte è anche possibile che sia inevitabile pubblicare tutto il contratto di JFrame. Però è una faccenda piuttosto seria. JFrame serve per fare omnia mundi et quibusdam aliis. E' difficile riuscire a costringere l'utente del metodo "getFrame" a rispettare eventuali limiti imposti dalle necessità di FinestraApplicazione. Giusto una testa di cavallo nel letto...
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2007, 16:28   #15
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12103
cmq ora che ci penso mi sfugge perchè si dovrebbe avere accesso diretto al frame
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2007, 16:29   #16
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12103
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
e a quello che fa una cosa così noi ci tagliamo i ditini santi

Scherzi a parte è anche possibile che sia inevitabile pubblicare tutto il contratto di JFrame. Però è una faccenda piuttosto seria. JFrame serve per fare omnia mundi et quibusdam aliis. E' difficile riuscire a costringere l'utente del metodo "getFrame" a rispettare eventuali limiti imposti dalle necessità di FinestraApplicazione. Giusto una testa di cavallo nel letto...
infatti l'ho scritto nel commento precedente ke era rimasto in sospeso mentre facevo passare un junit
La soluzione + ovvia imho è mettere a disposizione solo i metodi strettamente necessari a meno ke non sia strettamente necessario
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Acer TravelMate P4 14: tanta sostanza per l'utente aziendale Acer TravelMate P4 14: tanta sostanza per l'uten...
Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque Hisense M2 Pro: dove lo metti, sta. Mini proiett...
Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il convertibile di classe Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il c...
Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart Intervista a Stop Killing Games: distruggere vid...
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione Samsung Galaxy S25 Edge: il top di gamma ultraso...
Motorola Moto G15 a soli 110€: 8/256GB d...
Hexagon strizza l'occhio ai sim racer e ...
Sennheiser HD 660S2 in offerta: le cuffi...
Broadcom impedirebbe di scaricare le pat...
Amazfit GTR 3 crolla a 69€: ma è solo l’...
Wyoming, un datacenter AI potrebbe consu...
Ancora più giù i prezzi de...
TIM aumenta i prezzi delle offerte mobil...
Apple aggiorna tutto: iOS 18.6, macOS Se...
YouTube saprà quanti anni hai, an...
Meta AI su WhatsApp: l'Antitrust apre un...
Tantissima sostanza, batteria da 7000mAh...
Legge sui social in Australia: YouTube i...
100€ di sconto reale, solo 399€ per la P...
Oggi i Macbook Air da 13 pollici con chi...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 11:28.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v