Newsgroup: it.comp.java
Titolo: Impostare lo spessore della linea

Vorrei disegnare sullo schermo una "X" e una "O", pero' vorrei che la
linea della "X" e il cerchio della "O" fossere SPESSI, non sottili.
 
Come si fa in Java a impostare lo spessore della linea (o del cerchio)?
 
 

 Come si fa in Java a impostare lo spessore della linea (o del cerchio)?
 
 
RISOLTO, bisogna usare il metodo setStroke() della classe Graphics2D.
 
Ora ho un altro problema:
ho una finestra con un JTextField, un JComboBox e due JButton "OK" e
"Annulla".
 
Ovviamente quando si clicca su "OK" oppure "Annulla" la finestra si
chiude.
 
Vorrei fare in modo che la finestra si chiudesse automaticamente
quando si preme INVIO o ESC sulla tastiera, come se si cliccasse
rispettivamente su "OK" o "Annulla", qualcuno sa' come fare?
 
 

 rispettivamente su "OK" o "Annulla", qualcuno sa come fare?
 
http://download.oracle.com/javase/1.4.2/docs/api/java/awt/event/KeyListener.html
 

Marco (30/10/2011):

Mi spiace Marco, ma per questo tipo di problemi la JavaDoc non basta.
 
Prima di tutto consiglierei a Bracco Baldo di studiare BENE questo:
 
http://download.oracle.com/javase/tutorial/uiswing/misc/keybinding.html
 
 
Questo è quanto ne ho ricavato: inizia spostando le reazioni
corrispondenti a "OK" e "Annulla" in oggetti derivati da
javax.swing.Action (è più comodo AbstractAction). Puoi usare senza
problemi le classi anonime:
 
import javax.swing.*;
import java.awt.event.*;
 
...
Action okAction=new AbstractAction("OK") {
  public void actionPerformed(ActionEvent e) {
    ...
  }
};
 
Action cancelAction=new AbstractAction("Annulla") {
  public void actionPerformed(ActionEvent e) {
    ...
  }
};
...
 
Usi poi queste due Action a tuo vantaggio quando andrai a costruire i
due JButton "OK" e "Annulla":
 
JButton okButton=new JButton(okAction);
JButton cancelButton=new JButton(cancelAction);
 
L'obiettivo a questo punto è di richiamare le due azioni quando vengono
premuti i tasti Invio o Esc, a prescindere dal componente della
finestra che possiede il focus in qualsiasi momento. Tieni conto che un
evento finchè non viene consumato (che sia la pressione di un tasto o
un click) viene trasmesso risalendo di parent in parent, fino ad
arrivare al "root pane" (per maggiori info
http://download.oracle.com/javase/tutorial/uiswing/components/rootpane.html
).
Quindi è il "root pane" che dovrà reagire alla pressione dei due tasti.
 
Bisogna però informarlo che tale reazione va lanciata quando un
qualsiasi componente contenuto ha il focus (così se premi INVIO mentre
stai editando un JTextField la reazione è identica al pulsante OK).
 
Per arrivare a questo punto è necessario compilare un paio di
"registri" di JRootPane, una "input map" e una "action map". La prima
associa una combinazione di tasti ad un nome univoco, la seconda
associa un nome univoco alla Action concreta:
 
JRootPane rp=mioFrame.getRootPane();
InputMap im=
   rp.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
ActionMap am=rp.getActionMap();
 
//Compiliamo le combinazioni di tasti che ci servono
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0), "conferma");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE,0), "annulla");
 
//Associamo i nomi univoci alle action
am.put("conferma", okAction);
am.put("annulla",cancelAction);
 
Questo dovrebbe bastare. Hope that helps.
 
-- 
erk: C0 CE FE 84 C2 27 F7 5B D0 7A 7E B8 46 50 9F 93 B2 38 E7 70 DA CB
9F F4 A3 88 F8 12 48 2B E2 1B riv: 47 EE 74 54 E4 77 4C C9 B8 96 0C 7B
59 F4 C1 4D - further info: Google it!
(per rispondere personalmente leva IlDitoDalCulo)
 
 

 problemi le classi anonime:
 
 
Grazie OcchioDiDrago per l'ottima spiegazione.
 
Ho seguito le tue istruzioni e il programma funziona, solo che quando
il focus e' del JComboBox mi viene riconosciuto solo il tasto ESC,
l'INVIO non funziona.
Ci si puo' fare qualcosa o non ci si puo' fare nulla?
 
 

Bracco Baldo (31/10/2011):

Sono contento che funzioni, anche perchè ho scritto quel codice di
getto senza nemmeno provarlo...
 
Prova a cambiare JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT con
JComponent.WHEN_IN_FOCUSED_WINDOW . Rileggendo quel tutorial ho visto
che la prima costante è usata per i "componenti compositi", vale a dire
per componenti interattivi che aggregano più componenti di base, come
ad esempio una JTable editabile, mentre la seconda è da usare proprio
con gli "accelerators", il nostro caso.
 
Fammi sapere!


 con gli "accelerators", il nostro caso.
 
 
Ho cambiato JComponent in JComponent.WHEN_IN_FOCUSED_WINDOW e adesso
mi vengono riconosciuti sia ESC che INVIO anche quando il focus e'
del JComboBox, grazie.