Re: ultimate chalenge in JComboBox
In article <nospam-27FA94.06213022082008@aioe.org>,
"John B. Matthews" <nospam@nospam.invalid> wrote:
In article <890abd332fe0a@uwe>, "vaidhu" <u45630@uwe> wrote:
[...]
how do I change the font of individual combo box items, say if I
have 5 items in a combo box , how can I have each of them in a
different font ? I can do combo.setFont(Font f) but is there any
way I can set the font of the combo Items ?
Also,In my combobox i want to display more than one item of every
font type. I want the source code or logic.
[...]
You might look at this:
<http://java.sun.com/docs/books/tutorial/uiswing/components/combobox.html#renderer>
Let MyFontRenderer extend JLabel and implement ListCellRenderer. Let
it contain sufficient data to map the item index to your desired
font. Set the desired font in getListCellRendererComponent().
For example:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/**
* @author John B. Matthews
*/
public class FontCombo extends JPanel {
private static Font dialog = new Font("Dialog", Font.PLAIN, 18);
private static Font mono = new Font("Monospaced", Font.PLAIN, 18);
private static Font sans = new Font("SansSerif", Font.PLAIN, 18);
private static Font serif = new Font("Serif", Font.PLAIN, 18);
private JComboBox choices;
public FontCombo() {
this.setLayout(new BorderLayout());
choices = new JComboBox();
choices.addItem(new FontComboItem("Dialog one", dialog));
choices.addItem(new FontComboItem("Dialog two", dialog));
choices.addItem(new FontComboItem("Monospaced", mono));
choices.addItem(new FontComboItem("SansSerif", sans));
choices.addItem(new FontComboItem("Serif one", serif));
choices.addItem(new FontComboItem("Serif two", serif));
choices.setRenderer(new FontCellRenderer());
choices.setSelectedIndex(2);
choices.setFont(mono);
choices.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int index = choices.getSelectedIndex();
FontComboItem item =
(FontComboItem) choices.getItemAt(index);
choices.setFont(item.font);
}
});
this.add(choices, BorderLayout.CENTER);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.add(new FontCombo());
frame.setSize(250, 125);
frame.setVisible(true);
}
});
}
}
class FontCellRenderer extends JLabel implements ListCellRenderer {
public FontCellRenderer() {
setOpaque(true);
}
public Component getListCellRendererComponent (
JList list, Object value, int index,
boolean isSelected, boolean cellHasFocus) {
FontComboItem item = (FontComboItem) value;
setText(item.text);
setFont(item.font);
setBackground(isSelected ? Color.gray : Color.white);
setForeground(isSelected ? Color.white : Color.black);
return this;
}
}
class FontComboItem {
public String text;
public Font font;
public FontComboItem(String text, Font font) {
this.text = text;
this.font = font;
}
}
--
John B. Matthews
trashgod at gmail dot com
home dot woh dot rr dot com slash jbmatthews