Newsgroup: it.comp.java
Titolo: Modificare lo stile JComboBox

Vorrei personalizzare lo stile di una JComboBox editabile in modo tale da
allineare il testo inserito a destra, ed inserendo dei margini in modo tale
che il testo non risulti attaccato al bordo della JComboBox.
Avevo pensato di implementare ListCellRenderer estendendo un JTextField, ma
riesco a modificare l'aspetto del menù a tendina, non del JComboBox.
Cosa posso fare ???
Vi ringrazio, Claudio
________________________________________________
Se c'è soluzione perché ti preoccupi ??
Se non c'é soluzione perché ti preoccupi ???
________________________________________________

 Cosa posso fare ???
Hai provato con:
combobox.setAlignmentX(java.awt.Component.RIGHT_ALIGNMENT);
Ciao.
  -Ema-

 combobox.setAlignmentX(java.awt.Component.RIGHT_ALIGNMENT);
Si, ma niente da fare !!!


 Si, ma niente da fare !!!
Certo, perche' sono stupido!
devi fare qualcosa del tipo:
cellListRenderer = new DefaultListCellRenderer();
cellListRenderer.setHorizontalAlignment( SwingConstants.RIGHT );
comboBox = new JComboBox();
comboBox.setRenderer(cellListRenderer);
Ciao.
  -Ema-

 comboBox.setRenderer(cellListRenderer);
Sai come diciamo noi a Roma ???
Nun je ne po' fregà de meno !!!
Come ti dicevo l'interfaccia ListCellRenderer serve a specificare l'aspetto
delle celle del menù a tendina che ti appare quando visualizzi gli elementi
presenti nel JComboBox, quindi devo implementare qualche altra interfaccia.
Io pensavo a qualcosa tipo ComboBoxEditor visto che si tratta di una
JComboBox editabile, ma non ne sono sicuro. Ho provato a farlo ma senza
risultati


 risultati
Oggi sono evidentemente un po' stordito. Non ho riletto il tuo primo 
post. Forse cosi'?
JTextField cbeditor;
cbeditor = (JTextField)comboBox.getEditor().getEditorComponent();
cbeditor.setHorizontalAlignment( SwingConstants.RIGHT );
Ciao.
  -Ema-

 risultati
Ciao,
non è vero(a meno che non ho capito correttamente cosa intendi).
Il componente definito come renderer vale sia per l'item selezionato che per la 
tendina. La parte che agisce solo sulla tendina è quella definita nel metodo 
getListCellRendererComponent.
In teoria l'esempio seguente fa quello che vorresti.
Marco
import java.awt.Color;
import java.awt.Component;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
public class Combo extends JFrame {
   public Combo() {
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
     JComboBox cb = new JComboBox(new String[] {"uno", "due", "tre"});
     cb.setRenderer(new MyCellRenderer());
     getContentPane().add(cb);
   }
   public static void main(String[] args) {
     JFrame frame = new Combo();
     frame.pack();
     frame.setVisible(true);
   }
}
class MyCellRenderer extends JLabel implements ListCellRenderer {
   public MyCellRenderer() {
     setOpaque(true);
     setHorizontalAlignment(SwingConstants.RIGHT);
     setBorder(new EmptyBorder(2, 10, 2, 10));
   }
 
   public Component getListCellRendererComponent(JList list, Object value,
                        int index, boolean isSelected, boolean cellHasFocus) {
     setText(value.toString());
     setBackground(isSelected ? Color.red : Color.white);
     setForeground(isSelected ? Color.white : Color.black);
     return this;
   }	
}

Hmmm..forse ho capito cosa intendi.
Se al posto di una JLabel usi un JTextField come renderer e lo rendi editabile
cb.setEditable(true);
l'item selezionato viene allineato a sinistra.
Se inveci lo metti non editabile lo allinea a destra...
Humz humz, puzza alquanto di bug...
Marco

cthulhu wrote:

Ok, ho capito. Come dicevi tu bisogna usare l'editor.
Il fatto è che se il comboBox è non editabile per visualizzare l'item 
selezionato usa quello specificato dal CellRenderer mentre se è editabile 
utilizza quello specificato dall'editor.
Marco

 
Guarda che ho dato la soluzione (penso) piu' di un ora fa'!
Ciao.
  -Ema-

 
Si lo so, ma io stavo ribattendo alla seguente affermazione
 > ListCellRenderer serve a specificare l'aspetto
 > delle celle del menů a tendina che ti appare quando visualizzi gli elementi
 > presenti nel JComboBox
che credevo errata.
Marco

 cbeditor.setHorizontalAlignment( SwingConstants.RIGHT );
Ti ringrazio, comunque voglio segnalarti una cosa buffa : è impossibile
impostare dei margini !! Volevo fare in modo che il testo apparisse un po'
distante dal bordo del JComboBox, per maggiore chiarezza, ma il metodo
		setMargin(new Insets(0, 10, 0, 10))
non produce nessuna modifica. Possono cambiare il colore di sfondo, il
colore di primo piano, il font....moltissime cose tranni i margini !!!
.......I misteri di Swing
Ti ringrazio per l'aiuto, Claudio


 
Se usi
cbeditor.setBorder(new EmptyBorder(0, 10, 0, 10));
funziona.
Marco

 funziona.
No, ti assicuro di no. Ho anche provato a creare il bordo usando
BorderFactory, ma non c'è stato niente da fare


 
Hmm, strano.
A me questo esempietto funziona.
Marco
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
public class Combo extends JFrame {
   public Combo() {
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
     JComboBox comboBox = new JComboBox(new String[] {"uno", "due", "tre"});
     JTextField cbeditor = (JTextField)comboBox.getEditor().getEditorComponent();
     cbeditor.setHorizontalAlignment(JTextField.RIGHT );
     cbeditor.setBorder(new EmptyBorder(0, 15, 0, 15));
     comboBox.setEditable(true);
     getContentPane().add(comboBox);
