Java 更改背景颜色可编辑JComboBox
我正在JFrame表单中编程一个可编辑的组合框,但我想更改te背景色 程序的工作原理: 如果我点击按钮“按下”,那么组合框他的背景需要变成黑色 我试过: 1.Java 更改背景颜色可编辑JComboBox,java,swing,jcombobox,java-7,setbackground,Java,Swing,Jcombobox,Java 7,Setbackground,我正在JFrame表单中编程一个可编辑的组合框,但我想更改te背景色 程序的工作原理: 如果我点击按钮“按下”,那么组合框他的背景需要变成黑色 我试过: 1. cbo.setBackground(Color.BLACK); 但它什么也没做 2 cbo.getEditor().getEditorComponent().setBackground(Color.BLACK); ((JTextField) cbo.getEditor().getEditorComponent()).setOpaque
cbo.setBackground(Color.BLACK);
但它什么也没做
2
cbo.getEditor().getEditorComponent().setBackground(Color.BLACK);
((JTextField) cbo.getEditor().getEditorComponent()).setOpaque(true);
这是否:
代码示例:
public class NewJFrame extends javax.swing.JFrame {
private JComboBox cboCategorie;
public NewJFrame() {
initComponents();
cboCategorie = new JComboBox();
cboCategorie.setBounds(10, 10, 250, 26);
cboCategorie.setVisible(true);
cboCategorie.setEditable(true);
this.add(cboCategorie);
}
private void pressActionPerformed(java.awt.event.ActionEvent evt) {
cboCategorie.getEditor().getEditorComponent().setBackground(Color.BLACK);
((JTextField) cboCategorie.getEditor().getEditorComponent()).setOpaque(true);
}
我正在使用JavaJDK7
有什么建议吗?请参阅我的代码示例
import java.awt.*;
import java.util.Vector;
import javax.swing.*;
import javax.swing.UIManager;
import javax.swing.plaf.ColorUIResource;
import javax.swing.plaf.metal.MetalComboBoxButton;
public class MyComboBox {
private Vector<String> listSomeString = new Vector<String>();
private JComboBox someComboBox = new JComboBox(listSomeString);
private JComboBox editableComboBox = new JComboBox(listSomeString);
private JComboBox non_EditableComboBox = new JComboBox(listSomeString);
private JFrame frame;
public MyComboBox() {
listSomeString.add("-");
listSomeString.add("Snowboarding");
listSomeString.add("Rowing");
listSomeString.add("Knitting");
listSomeString.add("Speed reading");
//
someComboBox.setPrototypeDisplayValue("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
someComboBox.setFont(new Font("Serif", Font.BOLD, 16));
someComboBox.setEditable(true);
someComboBox.getEditor().getEditorComponent().setBackground(Color.YELLOW);
((JTextField) someComboBox.getEditor().getEditorComponent()).setBackground(Color.YELLOW);
//
editableComboBox.setPrototypeDisplayValue("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
editableComboBox.setFont(new Font("Serif", Font.BOLD, 16));
editableComboBox.setEditable(true);
JTextField text = ((JTextField) editableComboBox.getEditor().getEditorComponent());
text.setBackground(Color.YELLOW);
JComboBox coloredArrowsCombo = editableComboBox;
Component[] comp = coloredArrowsCombo.getComponents();
for (int i = 0; i < comp.length; i++) {// hack valid only for Metal L&F
if (comp[i] instanceof MetalComboBoxButton) {
MetalComboBoxButton coloredArrowsButton = (MetalComboBoxButton) comp[i];
coloredArrowsButton.setBackground(null);
break;
}
}
//
non_EditableComboBox.setPrototypeDisplayValue("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
non_EditableComboBox.setFont(new Font("Serif", Font.BOLD, 16));
//
frame = new JFrame();
frame.setLayout(new GridLayout(0, 1, 10, 10));
frame.add(someComboBox);
frame.add(editableComboBox);
frame.add(non_EditableComboBox);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocation(100, 100);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
UIManager.put("ComboBox.background", new ColorUIResource(Color.yellow));
UIManager.put("JTextField.background", new ColorUIResource(Color.yellow));
UIManager.put("ComboBox.selectionBackground", new ColorUIResource(Color.magenta));
UIManager.put("ComboBox.selectionForeground", new ColorUIResource(Color.blue));
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
MyComboBox aCTF = new MyComboBox();
}
});
}
}
import java.awt.*;
导入java.util.Vector;
导入javax.swing.*;
导入javax.swing.UIManager;
导入javax.swing.plaf.ColorUIResource;
导入javax.swing.plaf.metal.metalcomboxButton;
公共类MyComboBox{
私有向量listSomeString=新向量();
私有JComboBox-someComboBox=新的JComboBox(listSomeString);
private JComboBox editableComboBox=新的JComboBox(listSomeString);
私有JComboBox non_EditableComboBox=新JComboBox(listSomeString);
私有JFrame;
公共邮箱(){
添加(“-”);
添加(“滑雪板”);
添加(“划船”);
添加(“编织”);
添加(“快速读取”);
//
setPrototypeDisplayValue(“XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”);
setFont(新字体(“衬线”,Font.BOLD,16));
someComboBox.setEditable(true);
someComboBox.getEditor().getEditorComponent().setBackground(颜色.黄色);
((JTextField)someComboBox.getEditor().getEditorComponent()).setBackground(颜色.黄色);
//
editableComboBox.setPrototypeDisplayValue(“XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”);
setFont(新字体(“衬线”,Font.BOLD,16));
editableComboBox.setEditable(true);
JTextField text=((JTextField)editableComboBox.getEditor().getEditorComponent());
文本.背景(颜色.黄色);
JComboBox coloredArrowsCombo=editableComboBox;
Component[]comp=coloredArrowsCombo.getComponents();
对于(int i=0;i
我可以更改JComboBox中所选项目的颜色
JComboBox cmb = new JComboBox();
cmb.setEditable(true);
cmb.setEditor(new WComboBoxEditor(getContentPane().getBackground()));
// To change the arrow button's background
cmb.setUI(new BasicComboBoxUI(){
protected JButton createArrowButton()
{
BasicArrowButton arrowButton = new BasicArrowButton(BasicArrowButton.SOUTH, null, null, Color.GRAY, null);
return arrowButton;
}
});
cmb.setModel(new DefaultComboBoxModel(new String[] { "a", "b", "c" }));
如果要更改JCombobox中项目的颜色(所选项目除外),请自定义ListCellRenderer。结果很简单。创建渲染器并设置背景色。然后重写渲染器的setOpaque方法以始终将不透明度设置为true
class PDFChooser extends JComboBox<String> {
PDFChooser() {
setRenderer(new Renderer());
}
class Renderer extends DefaultListCellRenderer {
@Override
public void setOpaque(boolean makeBackGroundVisible) {
super.setOpaque(true); // THIS DOES THE TRICK
}
@Override
public Component getListCellRendererComponent(JList<?> list,
Object value, int index,
boolean isSelected, boolean cellHasFocus) {
setText((String)value);
setBackground(Color.cyan);
return this;
}
}
}
类PDFChooser扩展JComboBox{
PDFChooser(){
setRenderer(新渲染器());
}
类呈现器扩展了DefaultListCellRenderer{
@凌驾
public void setOpaque(布尔makeBackGroundVisible){
super.setOpaque(true);//这样就可以了
}
@凌驾
公共组件GetListCellRenderComponent(JList列表,
对象值,int索引,
布尔值(已选择,布尔单元格已聚焦){
setText((字符串)值);
挫折背景(颜色:青色);
归还这个;
}
}
}
如果您想让弹出菜单使用LAF背景,可以添加一个PopupMenuListener,以便在弹出菜单时进行记录。那时,setOpaque方法会将不透明度设置为false。如果我错了,会纠正我。您正在Java主类中运行它,而我正在JFrame表单中工作。您的代码正在工作,但是如果我将您的代码复制到新的JFrame表单(进行必要的更新),并运行该文件。没有颜色。我需要做一些特殊的事情才能让它工作吗?@morpheus05需要一些Java7中的woodoo才能在UIManager@mKorbel我复制了你的代码,添加了nimbus LAF并运行了程序。我看不出有什么不同。OP询问了nimbus(屏幕截图),所以我认为这个例子适用于nimbus和Java 7。你们能解决你们的问题吗?不,问题永远不会解决。如果您有解决方案,请随意分享:)问题是针对一个学校项目,我从未解决过……相关的,可能重复的,无法决定:
class PDFChooser extends JComboBox<String> {
PDFChooser() {
setRenderer(new Renderer());
}
class Renderer extends DefaultListCellRenderer {
@Override
public void setOpaque(boolean makeBackGroundVisible) {
super.setOpaque(true); // THIS DOES THE TRICK
}
@Override
public Component getListCellRendererComponent(JList<?> list,
Object value, int index,
boolean isSelected, boolean cellHasFocus) {
setText((String)value);
setBackground(Color.cyan);
return this;
}
}
}