更新问题
第1部分:最初,我首先要在选择一个项目后删除高亮选择(因为这会扰乱所做选择的背景色)。我看到这可以从这里完成>JComboBox中的删除高亮显示-(解决)
第二部分:现在...我试图让它识别选定的文本,并根据选定的文本改变背景色(当选定时,而不是当鼠标悬停在列表中的项上时)。它确实会改变颜色以匹配文本,但是当选择另一个对象(取消选择组合框)时,背景颜色会变回默认-(已解决-参见我的解决方案)
第3部分:另外,我希望在下拉列表中显示文本的背景色(当鼠标没有悬停在它上面时)。-(已解决)
这是代码...
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class ComboBoxRenderer extends JLabel implements ListCellRenderer
{
private Color selectionBackgroundColor;
private DefaultListCellRenderer dlcr = new DefaultListCellRenderer();
// Constructor
public ComboBoxRenderer()
{
setOpaque(true);
setHorizontalAlignment(CENTER);
setVerticalAlignment(CENTER);
selectionBackgroundColor = this.dlcr.getBackground(); // Have to set a color, else a compiler error will occur
}
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
{
// Set the list background color to default color (default color will show once selection is made)
setBackground(list.getBackground());
Color mouseHoverHighlight = Color.LIGHT_GRAY;
setText((String)value);
// Check which item is selected
if(isSelected)
{
// Set background color of the item your cursor is hovering over to the original background color
setBackground(mouseHoverHighlight);
}
else
{
// Set background to specific color depending on text value
String selectedTextInDropdownList = getText();
if (selectedTextInDropdownList.equals("SelectedTextOne")) {
setBackground(Color.GREEN);
} else if (selectedTextInDropdownList.equals("SelectedTextTwo")) {
setBackground(Color.RED);
}
}
String selectedText = getText();
if (selectedText.equals("SelectedTextOne")){
list.setSelectionBackground(Color.GREEN);
} else if (selectedText.equals("SelectedTextTwo")){
list.setSelectionBackground(Color.RED);
} else {
list.setSelectionBackground(this.dlcr.getBackground());
}
return this;
}
}
编辑:也...下面是鼓起GUI的代码,这样您就可以看到它是如何运行的...
Edit2:编辑的代码,用于在图像中不显示背景的情况下进行编译
import org.apache.commons.lang3.ArrayUtils;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.TitledBorder;
import javax.swing.plaf.ColorUIResource;
import javax.swing.plaf.metal.MetalComboBoxButton;
public class TestGui extends JFrame {
private final String[] guiCharSelDefault = {"--- Select Character ---"};
private final String[] characters = {"SelectedTextOne", "SelectedTextTwo", "SelectedTextThree", "SelectedTextFour"};
private final String[] guiCharSel = (String[]) ArrayUtils.addAll(guiCharSelDefault, characters);
private JComboBox charCombo = createStandardCombo(guiCharSel);
private JPanel topFrame = createTopFrame();
private JScrollPane topFrameScroll = createTopScrollPane();
private JPanel centerFrame = createCenterFrame();
//**************************************************************************************
// Constructor
TestGui(){
add(topFrameScroll, BorderLayout.NORTH);
add(centerFrame, BorderLayout.CENTER);
setSize(800,600);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//**************************************************************************************
// Support Methods
private static GridBagConstraints setGbc(int gridx, int gridy, int gridWidth, int gridHeight, int ipadx, int ipady, String anchorLocation, double weightx, double weighty, Insets insets){
GridBagConstraints gbc = new GridBagConstraints();
if (anchorLocation.toUpperCase().equals("NORTHWEST")){
gbc.anchor = GridBagConstraints.NORTHWEST;
} else if (anchorLocation.toUpperCase().equals("NORTH")){
gbc.anchor = GridBagConstraints.NORTH;
} else if (anchorLocation.toUpperCase().equals("NORTHEAST")){
gbc.anchor = GridBagConstraints.NORTHEAST;
} else if (anchorLocation.toUpperCase().equals("WEST")){
gbc.anchor = GridBagConstraints.WEST;
} else if (anchorLocation.toUpperCase().equals("EAST")){
gbc.anchor = GridBagConstraints.EAST;
} else if (anchorLocation.toUpperCase().equals("SOUTHWEST")){
gbc.anchor = GridBagConstraints.SOUTHWEST;
} else if (anchorLocation.toUpperCase().equals("SOUTH")){
gbc.anchor = GridBagConstraints.SOUTH;
} else if (anchorLocation.toUpperCase().equals("SOUTHEAST")){
gbc.anchor = GridBagConstraints.SOUTHEAST;
} else {
gbc.anchor = GridBagConstraints.CENTER;
}
gbc.gridx = gridx; // column
gbc.gridy = gridy; // row
gbc.gridwidth = gridWidth; // number of columns
gbc.gridheight = gridHeight; // number of rows
gbc.ipadx = ipadx; // width of object
gbc.ipady = ipady; // height of object
gbc.weightx = weightx; // shifts rows to side of set anchor
gbc.weighty = weighty; // shifts columns to side of set anchor
gbc.insets = insets; // placement inside cell
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.fill = GridBagConstraints.VERTICAL;
return gbc;
}
private Insets setInsets(int top, int left, int bottom, int right){
Insets insets = new Insets(top,left,bottom,right);
return insets;
}
//**************************************************************************************
// Interactive Object Methods
private JComboBox createStandardCombo(String[] defaultValues){
JComboBox comboBox = new JComboBox(defaultValues);
ComboBoxRenderer cbr = new ComboBoxRenderer();
DefaultListCellRenderer dlcr = new DefaultListCellRenderer();
dlcr.setHorizontalTextPosition(SwingConstants.CENTER);
comboBox.setRenderer(cbr);
comboBox.setPrototypeDisplayValue("X" + guiCharSelDefault + "X");
return comboBox;
}
//**************************************************************************************
// Object Action Methods
private void setComboBoxColorBackgroundWithMetalArrow(Color color){
int componentCount = charCombo.getComponentCount();
for (int i = 0; i < componentCount; i++) {
Component component = charCombo.getComponent(i);
if (component instanceof MetalComboBoxButton) {
MetalComboBoxButton metalComboBoxButton =
(MetalComboBoxButton) component;
Icon comboIcon = metalComboBoxButton.getComboIcon();
BufferedImage bufferedImage =
new BufferedImage(
comboIcon.getIconWidth(),
comboIcon.getIconHeight(),
BufferedImage.TYPE_INT_ARGB);
comboIcon.paintIcon(
metalComboBoxButton, bufferedImage.getGraphics(), 0, 0);
}
}
}
private void setCharComboAction(){
charCombo.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
String charName = ((JComboBox)(e.getSource())).getSelectedItem().toString();
if (!(charName.equals(guiCharSelDefault[0]))){
DefaultListCellRenderer dlcr = new DefaultListCellRenderer();
DefaultComboBoxModel model = new DefaultComboBoxModel(characters);
model.setSelectedItem(charName);
charCombo.setModel(model);
}
}
}
);
}
//**************************************************************************************
// Panel Methods
private JPanel createTopFrame(){
JPanel pnl = new JPanel();
pnl.setLayout(new GridBagLayout());
setCharComboAction();
pnl.add(charCombo, setGbc(0,0, 1,1, 0,0, "WEST", 0, 0, setInsets(0, 10, 0, 0)));
JButton button = new JButton("Button");
pnl.add(button, setGbc(0,1, 1,1, 0,0, "WEST", 0, 0, setInsets(0, 10, 0, 0)));
pnl.setOpaque(false);
return pnl;
}
private JScrollPane createTopScrollPane(){
JScrollPane scrollPane = new JScrollPane();
Border raisedBevel = BorderFactory.createRaisedBevelBorder();
Border lineBorder = BorderFactory.createMatteBorder(2, 2, 2, 2, new Color(224,224,224));
Border loweredBevel = BorderFactory.createLoweredBevelBorder();
Border compoundSetup = BorderFactory.createCompoundBorder(raisedBevel, lineBorder);
Border compoundFinal = BorderFactory.createCompoundBorder(compoundSetup, loweredBevel);
scrollPane.setBorder(compoundFinal);
scrollPane.setOpaque(false);
scrollPane.getViewport().setOpaque(false);
scrollPane.getViewport().setView(topFrame);
return scrollPane;
}
private JPanel createCenterFrame() {
JPanel pnl = new JPanel();
Border raisedBevel = BorderFactory.createRaisedBevelBorder();
Color lineColor = new Color(224, 224, 224);
Border lineBorder = BorderFactory.createMatteBorder(5, 5, 5, 5, lineColor);
Border loweredBevel = BorderFactory.createLoweredBevelBorder();
Border compoundSetup = BorderFactory.createCompoundBorder(raisedBevel, lineBorder);
Border compoundFinal = BorderFactory.createCompoundBorder(compoundSetup, loweredBevel);
TitledBorder topFrameTitle = BorderFactory.createTitledBorder(compoundFinal, "Stuff");
topFrameTitle.setTitleJustification(TitledBorder.CENTER);
pnl.setBorder(topFrameTitle);
pnl.setLayout(new GridBagLayout());
pnl.setOpaque(false);
return pnl;
}
//**************************************************************************************
public static void main(String[] args) {
new TestGui();
}
}
复制问题的步骤:
单击“选择字符”组合框
单击列表中的“SelectedTextOne”项。注意:“SelectedTextThree”只是不同的颜色,因为我的鼠标悬停在它上面。行为正常。
注意组合框是如何从绿色变成灰色的(我们希望它保持绿色)。
有人知道如何确保背景色(在组合框本身而不是列表中)被设置为文本值的颜色吗?
所以,在玩了很多次之后,这个...
class ComboBoxRenderer extends JLabel implements ListCellRenderer {
// Constructor
public ComboBoxRenderer() {
setOpaque(true);
setHorizontalAlignment(CENTER);
setVerticalAlignment(CENTER);
}
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
Color mouseHoverHighlight = Color.LIGHT_GRAY;
setBackground(list.getBackground());
setText((String) value);
// Check which item is selected
if (isSelected) {
// Set background color of the item your cursor is hovering over to the original background color
setBackground(mouseHoverHighlight);
} else {
// Set background to specific color depending on text value
String selectedText = getText();
if (selectedText.equals("SelectedTextOne")) {
setBackground(Color.GREEN);
} else if (selectedText.equals("SelectedTextTwo")) {
setBackground(Color.RED);
}
}
// Do nothing about the text and font to be displayed
setFont(list.getFont());
return this;
}
}
似乎管用。在背景色之后设置文本似乎会引起问题,可能会触发重绘或其他什么。
这就是为什么我建议使用DefaultListCellRenderer
,它基于JLabel
,并经过优化以减少此类更新
我有一个选择框,当选择框被单击并显示所有选项时,我正在尝试更改选项的背景颜色。
问题内容: 我有这个课: 问题是当我在JList中选择一个单元格时,我的背景不会变成红色。setText部分有效,但是我无法弄清楚为什么它不会更改单元格的背景颜色。任何人都有任何想法,谢谢! 问题答案: 主要问题是标签默认情况下是不透明的,因此您需要使标签不透明才能绘制背景。 但是您不需要为此创建自定义渲染器。默认渲染器是不透明的。您所需要做的就是设置列表的选择背景属性: 如果您尝试创建一个渲染器
我有一个自定义列表视图的应用程序,它有一个textview和一个imageview。当我点击图像视图时,背景颜色应该改变。我试图这样做,但是得到了。。。这是我的密码 CustomListViewAdapter。JAVA 任何建议都将不胜感激。谢谢
我有一个具有自定义列表视图的应用程序,它具有文本视图和图像(删除),当我单击图像时,该行的背景颜色应更改,当我再次单击相同的图像时,其背景应更改为默认颜色。我可以改变背景颜色,但只有一次,我不能改变它两次,我的意思是我不能恢复到它的默认颜色。 这是我的密码。。。 CustomListView.java 还有一个问题是,背景色不是我在《颜色》中提到的颜色。xml,我通过放置不同的颜色进行了测试,但是
问题内容: 我已经考虑了以下内容,所以现在我想知道您的意见,可能的解决方案等。 我正在寻找一种插件或技术来更改文本的颜色,或者根据其父级背景图像或-color覆盖像素的平均亮度在预定义的图像/图标之间切换。 如果背景覆盖的区域很暗,请将文本设置为白色或切换图标。 此外,如果脚本会注意到父级没有定义的background-color或-image,然后继续搜索最接近的值(从父元素到其父元素),那