Color of JComboBox

  • Thread starter Timo Geissberger
  • Start date
T

Timo Geissberger

Hello,
I like to change the color of the JComboBox, my code so far:

JComboBox piclist = new JComboBox(pics);
piclist.setEditable(true);
ComboBoxRenderer renderer = new ComboBoxRenderer();
class ComboBoxRenderer extends JLabel implements ListCellRenderer
{
public ComboBoxRenderer()
{
setOpaque(true);
}

public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus)
{
list.setForeground(Color.green);
list.setBackground(Color.black);
return this;
}
}

thank you timo
 
C

Christian Kaufhold

Timo Geissberger said:
I like to change the color of the JComboBox, my code so far:


Have you tried comboBox.setFore-/Background?
For editable comboBox, also configure the editor component.


Christian
 
R

raven

JComboBox piclist = new JComboBox(pics);
piclist.setEditable(true);
ComboBoxRenderer renderer = new ComboBoxRenderer();
piclist.setRenderer(renderer);
//...
class ComboBoxRenderer extends JLabel implements ListCellRenderer
{
public ComboBoxRenderer()
{super();
setOpaque(true);
}

public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus)
{
setForeground(Color.green);
setBackground(Color.black);
return this;
}
}

http://www.DevPlug.com --Connecting Developers
Posted from: http://www.devplug.com/ftopic28190.htm
 
T

Timo Geissberger

this does not help the textfield and the butten remain gray black
thanks anyway
 
T

Timo Geissberger

I tryed it with no success.
thanks anyway

Christian Kaufhold said:
Have you tried comboBox.setFore-/Background?
For editable comboBox, also configure the editor component.


Christian
 
C

Christian Kaufhold

Timo Geissberger said:
I tryed it with no success.
thanks anyway

Please post a complete example that shows that behaviour.

Please don't top post.

Please don't whine.


Christian
 
T

Timo Geissberger

what do you mean by don't top post?
here is the program:

import java.awt.*;
import javax.swing.*;

class vo extends JFrame
{
public vo()
{
super("vo");
try{UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());}
catch (Exception e){e.printStackTrace();}
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setBackground(Color.black);
this.setForeground(Color.green);
this.setSize(500,400);
this.setVisible(true);
String[] pics = {"Hello World"};
JComboBox piclist = new JComboBox(pics);
piclist.setEditable(true);
ComboBoxRenderer renderer = new ComboBoxRenderer();
piclist.setBackground(Color.black);
piclist.setForeground(Color.green);
piclist.setOpaque(true);
this.getContentPane().add(piclist);
}

public static void main(String args[])
{
vo wnd = new vo();
wnd.pack();
}

class ComboBoxRenderer extends JLabel implements ListCellRenderer
{
public ComboBoxRenderer()
{
setOpaque(true);
}

public Component getListCellRendererComponent(JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus)
{
setForeground(Color.green);
setBackground(Color.black);
list.setForeground(Color.green);
list.setBackground(Color.black);
return this;
}
}

}
 
T

Timo Geissberger

Christian Kaufhold said:
For editable comboBox, also configure the editor component.

I have seen some code about the EditorComponent, but don't found anything
about the Textfield and the Button in the API.
My tryings with the Editor Component were without success. I got the old
cannot resolve symbol error!?
My code is so far:

import java.awt.*;
import javax.swing.*;

class vo extends JFrame
{
public vo()
{
super("vo");
try{UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());}
catch (Exception e){e.printStackTrace();}
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setBackground(Color.black);
this.setForeground(Color.green);
this.setSize(500,400);
this.setVisible(true);
String[] pics = {"Hello World"};
JComboBox piclist = new JComboBox(pics);
piclist.setEditable(true);
ComboBoxRenderer renderer = new ComboBoxRenderer();

((JComboBoxEditor)piclist.getEditor()).getTextField().setBackground(Color.bl
ack);

((JComboBoxEditor)piclist.getEditor()).getTextField().setForeground(Color.gr
een);

((JComboBoxEditor)piclist.getEditor()).getButton().setBackground(Color.black
);

((JComboBoxEditor)piclist.getEditor()).getButton().setForeground(Color.green
);
piclist.setBackground(Color.black);
piclist.setForeground(Color.green);
piclist.setOpaque(true);
this.getContentPane().add(piclist);
}

public static void main(String args[])
{
vo wnd = new vo();
wnd.pack();
}

class ComboBoxRenderer extends JLabel implements ListCellRenderer
{
public ComboBoxRenderer()
{
setOpaque(true);
}

public Component getListCellRendererComponent(JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus)
{
setForeground(Color.green);
setBackground(Color.black);
list.setForeground(Color.green);
list.setBackground(Color.black);
return this;
}
}

}
 
A

Arnaud Berger

Hi,

Try to create your own ComboBoxEditor :

private class MyComboBoxEditor extends BasicComboBoxEditor{

public Component getEditorComponent(){
Component comp=super.getEditorComponent();
comp.setBackground(Color.red);
return comp;
}

}

Then,

piclist.setEditor(new MyComboBoxEditor() );

Regards,

Arnaud




Timo Geissberger said:
Christian Kaufhold said:
For editable comboBox, also configure the editor component.

I have seen some code about the EditorComponent, but don't found anything
about the Textfield and the Button in the API.
My tryings with the Editor Component were without success. I got the old
cannot resolve symbol error!?
My code is so far:

import java.awt.*;
import javax.swing.*;

class vo extends JFrame
{
public vo()
{
super("vo");
try{UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());}
catch (Exception e){e.printStackTrace();}
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setBackground(Color.black);
this.setForeground(Color.green);
this.setSize(500,400);
this.setVisible(true);
String[] pics = {"Hello World"};
JComboBox piclist = new JComboBox(pics);
piclist.setEditable(true);
ComboBoxRenderer renderer = new ComboBoxRenderer();

((JComboBoxEditor)piclist.getEditor()).getTextField().setBackground(Color.bl
((JComboBoxEditor)piclist.getEditor()).getTextField().setForeground(Color.gr
((JComboBoxEditor)piclist.getEditor()).getButton().setBackground(Color.black
((JComboBoxEditor)piclist.getEditor()).getButton().setForeground(Color.green
);
piclist.setBackground(Color.black);
piclist.setForeground(Color.green);
piclist.setOpaque(true);
this.getContentPane().add(piclist);
}

public static void main(String args[])
{
vo wnd = new vo();
wnd.pack();
}

class ComboBoxRenderer extends JLabel implements ListCellRenderer
{
public ComboBoxRenderer()
{
setOpaque(true);
}

public Component getListCellRendererComponent(JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus)
{
setForeground(Color.green);
setBackground(Color.black);
list.setForeground(Color.green);
list.setBackground(Color.black);
return this;
}
}

}
 
C

Christian Kaufhold

Timo Geissberger said:
here is the program:
[snip]

So, which behaviour do you *expect* to be different and how?
It works exactly as expected.


Christian
 
T

Timo Geissberger

Christian said:
So, which behaviour do you *expect* to be different and how?
It works exactly as expected.


I like to change the color of the ComboBox Button and the TextField. The
solution for the TextField is:

mytextfield.setEditor(new MyComboBoxEditor());

class MyComboBoxEditor extends BasicComboBoxEditor
{
public Component getEditorComponent()
{
Component comp = super.getEditorComponent();
comp.setBackground(Coloer.black);
comp.setForeground(Color.green);
return comp;
}
}

and that works okay :)
but now I have a problem with the Button. I have made my own class from the
metal Look and Feel(below) and call it with:

piclist.setUI(new MyUIButton());

and got the error:

..\XerxesMain.java:155: cannot access MyUIButton
bad class file: .\MyUIButton.java
file does not contain class MyUIButton
Please remove or make sure it appears in the correct subdirectory of the
classpa
th.
piclist.setUI(new MyUIButton());
^
1 error

the class is:

package javax.swing.plaf.metal;

import java.awt.*;
import java.awt.event.*;
import javax.swing.plaf.basic.*;
import javax.swing.*;
import javax.swing.plaf.*;
import javax.swing.border.*;
import java.io.Serializable;

class MyUIButton extends MetalComboBoxUI
{
protected JComboBox comboBox;
protected JList listBox;
protected CellRendererPane rendererPane;
protected Icon comboIcon;
protected boolean iconOnly = false;

public final JComboBox getComboBox() { return comboBox;}
public final void setComboBox( JComboBox cb ) { comboBox = cb;}

public final Icon getComboIcon() { return comboIcon;}
public final void setComboIcon( Icon i ) { comboIcon = i;}

public final boolean isIconOnly() { return iconOnly;}
public final void setIconOnly( boolean isIconOnly ) { iconOnly =
isIconOnly;}

MyUIButton() {
super( "" );
DefaultButtonModel model = new DefaultButtonModel() {
public void setArmed( boolean armed ) {
super.setArmed( isPressed() ? true : armed );
}
};
setModel( model );
}

public MyUIButton( JComboBox cb, Icon i,
CellRendererPane pane, JList list ) {
this();
comboBox = cb;
comboIcon = i;
rendererPane = pane;
listBox = list;
setEnabled( comboBox.isEnabled() );
}

public MyUIButton( JComboBox cb, Icon i, boolean onlyIcon,
CellRendererPane pane, JList list ) {
this( cb, i, pane, list );
iconOnly = onlyIcon;
}

public boolean isFocusTraversable() {
return false;
}

public void setEnabled(boolean enabled) {
super.setEnabled(enabled);

// Set the background and foreground to the combobox colors.
if (enabled) {
setBackground(Color.black);
setForeground(Coloer.green);
} else {
setBackground(UIManager.getColor("ComboBox.disabledBackground"));
setForeground(UIManager.getColor("ComboBox.disabledForeground"));
}
}

public void paintComponent( Graphics g ) {
boolean leftToRight = MetalUtils.isLeftToRight(comboBox);

// Paint the button as usual
super.paintComponent( g );

Insets insets = getInsets();

int width = getWidth() - (insets.left + insets.right);
int height = getHeight() - (insets.top + insets.bottom);

if ( height <= 0 || width <= 0 ) {
return;
}

int left = insets.left;
int top = insets.top;
int right = left + (width - 1);
int bottom = top + (height - 1);

int iconWidth = 0;
int iconLeft = (leftToRight) ? right : left;

// Paint the icon
if ( comboIcon != null ) {
iconWidth = comboIcon.getIconWidth();
int iconHeight = comboIcon.getIconHeight();
int iconTop = 0;

if ( iconOnly ) {
iconLeft = (getWidth() / 2) - (iconWidth / 2);
iconTop = (getHeight() / 2) - (iconHeight / 2);
}
else {
if (leftToRight) {
iconLeft = (left + (width - 1)) - iconWidth;
}
else {
iconLeft = left;
}
iconTop = (top + ((bottom - top) / 2)) - (iconHeight / 2);
}

comboIcon.paintIcon( this, g, iconLeft, iconTop );

// Paint the focus
if ( comboBox.hasFocus() ) {
g.setColor( Coloer.green );
g.drawRect( left - 1, top - 1, width + 3, height + 1 );
}
}

// Let the renderer paint
if ( ! iconOnly && comboBox != null ) {
ListCellRenderer renderer = comboBox.getRenderer();
Component c;
boolean renderPressed = getModel().isPressed();
c = renderer.getListCellRendererComponent(listBox,

comboBox.getSelectedItem(),
-1,
renderPressed,
false);
c.setFont(rendererPane.getFont());

if ( model.isArmed() && model.isPressed() ) {
if ( isOpaque() ) {
c.setBackground(Color.black);
}
c.setForeground(Color.green);
}
else if ( !comboBox.isEnabled() ) {
if ( isOpaque() ) {

c.setBackground(UIManager.getColor("ComboBox.disabledBackground"));
}

c.setForeground(UIManager.getColor("ComboBox.disabledForeground"));
}
else {
c.setForeground(Color.green);
c.setBackground(Color.black);
}


int cWidth = width - (insets.right + iconWidth);

// Fix for 4238829: should lay out the JPanel.
boolean shouldValidate = false;
if (c instanceof JPanel) {
shouldValidate = true;
}

if (leftToRight) {
rendererPane.paintComponent( g, c, this,
left, top, cWidth, height, shouldValidate );
}
else {
rendererPane.paintComponent( g, c, this,
left + iconWidth, top, cWidth, height, shouldValidate );
}
}
}
}

thank you timo
 
A

Arnaud Berger

Hi,

The package for your class is wrong :

1) You should NEVER create classes with package containing "java" or
"javax", let alone using an "official" package
like javax.swing.plaf.metal
2) Since javax.swing.plaf.metal is already in another place of the classpath
(i.e the jars of the JDK) you are
running into a "competition" between two paths containing the same package
(generallly, the first which appears in the classpath, is the one taken into
account ; here it is the jars from the JDK, which obviously don't have your
MyUIButton class)

So, just change your package statement to something else (say
mypackage.myuis or whatever but avoid the terms "java" or "javax")

Regards,

Arnaud
 
T

Timo Geissberger

Arnaud Berger said:
The package for your class is wrong :

okay I have removed it. But now I get some errors I don't understand why
they apear:

..\MyUIButton.java:135: cannot resolve symbol
symbol : method isOpaque ()
location: class MyUIButton
if ( isOpaque() ) {
^
..\MyUIButton.java:141: cannot resolve symbol
symbol : method isOpaque ()
location: class MyUIButton
if ( isOpaque() ) {
^
..\MyUIButton.java:161: cannot resolve symbol
symbol : method paintComponent
(java.awt.Graphics,java.awt.Component,MyUIButton
,int,int,int,int,boolean)
location: class javax.swing.CellRendererPane
rendererPane.paintComponent( g, c, this,
^
..\MyUIButton.java:165: cannot resolve symbol
symbol : method paintComponent
(java.awt.Graphics,java.awt.Component,MyUIButton
,int,int,int,int,boolean)
location: class javax.swing.CellRendererPane
rendererPane.paintComponent( g, c, this,
^
23 errors

here is the class again:

import java.awt.*;
import java.awt.event.*;
import javax.swing.plaf.basic.*;
import javax.swing.*;
import javax.swing.plaf.*;
import javax.swing.border.*;
import java.io.Serializable;
import javax.swing.plaf.metal.*;

class MyUIButton extends MetalComboBoxUI
{
protected JComboBox comboBox;
protected JList listBox;
protected CellRendererPane rendererPane;
protected Icon comboIcon;
protected boolean iconOnly = false;

public final JComboBox getComboBox() { return comboBox;}
public final void setComboBox( JComboBox cb ) { comboBox = cb;}

public final Icon getComboIcon() { return comboIcon;}
public final void setComboIcon( Icon i ) { comboIcon = i;}

public final boolean isIconOnly() { return iconOnly;}
public final void setIconOnly( boolean isIconOnly ) { iconOnly =
isIconOnly;}

MyUIButton() {
super( "" );
DefaultButtonModel model = new DefaultButtonModel() {
public void setArmed( boolean armed ) {
super.setArmed( isPressed() ? true : armed );
}
};
setModel( model );
}

public MyUIButton( JComboBox cb, Icon i,
CellRendererPane pane, JList list ) {
this();
comboBox = cb;
comboIcon = i;
rendererPane = pane;
listBox = list;
setEnabled( comboBox.isEnabled() );
}

public MyUIButton( JComboBox cb, Icon i, boolean onlyIcon,
CellRendererPane pane, JList list ) {
this( cb, i, pane, list );
iconOnly = onlyIcon;
}

public boolean isFocusTraversable() {
return false;
}

public void setEnabled(boolean enabled) {
super.setEnabled(enabled);

// Set the background and foreground to the combobox colors.
if (enabled) {
setBackground(Color.black);
setForeground(Coloer.green);
} else {
setBackground(UIManager.getColor("ComboBox.disabledBackground"));
setForeground(UIManager.getColor("ComboBox.disabledForeground"));
}
}

public void paintComponent( Graphics g ) {
boolean leftToRight = MetalUtils.isLeftToRight(comboBox);

// Paint the button as usual
super.paintComponent( g );

Insets insets = getInsets();

int width = getWidth() - (insets.left + insets.right);
int height = getHeight() - (insets.top + insets.bottom);

if ( height <= 0 || width <= 0 ) {
return;
}

int left = insets.left;
int top = insets.top;
int right = left + (width - 1);
int bottom = top + (height - 1);

int iconWidth = 0;
int iconLeft = (leftToRight) ? right : left;

// Paint the icon
if ( comboIcon != null ) {
iconWidth = comboIcon.getIconWidth();
int iconHeight = comboIcon.getIconHeight();
int iconTop = 0;

if ( iconOnly ) {
iconLeft = (getWidth() / 2) - (iconWidth / 2);
iconTop = (getHeight() / 2) - (iconHeight / 2);
}
else {
if (leftToRight) {
iconLeft = (left + (width - 1)) - iconWidth;
}
else {
iconLeft = left;
}
iconTop = (top + ((bottom - top) / 2)) - (iconHeight / 2);
}

comboIcon.paintIcon( this, g, iconLeft, iconTop );

// Paint the focus
if ( comboBox.hasFocus() ) {
g.setColor( Coloer.green );
g.drawRect( left - 1, top - 1, width + 3, height + 1 );
}
}

// Let the renderer paint
if ( ! iconOnly && comboBox != null ) {
ListCellRenderer renderer = comboBox.getRenderer();
Component c;
boolean renderPressed = getModel().isPressed();
c = renderer.getListCellRendererComponent(listBox,

comboBox.getSelectedItem(),
-1,
renderPressed,
false);
c.setFont(rendererPane.getFont());

if ( model.isArmed() && model.isPressed() ) {
if ( isOpaque() ) {
c.setBackground(Color.black);
}
c.setForeground(Color.green);
}
else if ( !comboBox.isEnabled() ) {
if ( isOpaque() ) {

c.setBackground(UIManager.getColor("ComboBox.disabledBackground"));
}

c.setForeground(UIManager.getColor("ComboBox.disabledForeground"));
}
else {
c.setForeground(Color.green);
c.setBackground(Color.black);
}


int cWidth = width - (insets.right + iconWidth);

// Fix for 4238829: should lay out the JPanel.
boolean shouldValidate = false;
if (c instanceof JPanel) {
shouldValidate = true;
}

if (leftToRight) {
rendererPane.paintComponent( g, c, this,
left, top, cWidth, height, shouldValidate );
}
else {
rendererPane.paintComponent( g, c, this,
left + iconWidth, top, cWidth, height, shouldValidate );
}
}
}
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,997
Messages
2,570,241
Members
46,831
Latest member
RusselWill

Latest Threads

Top