2017-04-26 6 views
0

Aktualisiert Frageindividuelle JComboBoxRenderer ändern Hintergrundfarbe je nach Textauswahl

Teil 1: Ursprünglich war ich zuerst die Highlight Auswahl entfernen gehen, nachdem ein Element ausgewählt wurde (weil dies den Hintergrund vermasselt war Farbe für die getroffene Auswahl). Ich sah dies von hier getan werden könnte>Delete highlighting in JComboBox - (Gelöst)

Teil 2: Jetzt ... Ich versuche es den markierten Text, zu haben, zu identifizieren und die Hintergrundfarbe ändern (wenn ausgewählt, und nicht, wenn die Maus über das Element in der Liste schwebt), abhängig davon, welcher Text ausgewählt wurde. Es macht die Farbe ändern, um den Text zu passen, aber wenn ein anderes Objekt (Abwahl der Combobox) Auswahl der Hintergrundfarbe wechselt wieder auf den Standard - (Gelöst - meine Lösung Siehe)

Teil 3: Außerdem würde ich gerne die Hintergrundfarbe für den Text in der Dropdown-Liste anzeigen lassen (während die Maus nicht darüber schwebt). - (Gelöst)

Hier ist der Code ...

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; 
    } 
} 

Edit: Auch ... Hier ist der Code trommeln eine GUI, also können Sie sehen, wie es sich verhält. ..

Edit2: Code Herausgegeben ohne in Bildern gezeigt Hintergrund zu kompilieren

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(); 
    } 
} 

Schritte zum Reproduzieren des Problems:

Klicken Sie auf die "select Zeichen" Combobox

enter image description here

Klicken Sie auf die "selectedTextOne" Element in der Liste. Note: "selectedTextThree" is only a different color because my mouse is hovered over it. This is behaving properly.

enter image description here

den Button klicken. Note: the button doesn't actually do anything, we just do this so the combo box is no longer selected.

enter image description here

Beachten Sie, wie die Combo-Box wechselt von grün bis grau (wir wollen es grün bleiben).

enter image description here

Wer noch keine Ahnung, wie die Hintergrundfarbe, um sicherzustellen, (in der Combo-Box selbst und nicht die Liste) für die Farbe des Textes Wert festgelegt ist?

Antwort

0

fand ich endlich die richtige Kombination zu reduzieren. Hier ist der Code ...

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

class ComboBoxRenderer extends JLabel implements ListCellRenderer 
{ 
    private Color selectionBackgroundColor; 
    private Color defaultBackgroundColor; 
    private DefaultListCellRenderer dlcr = new DefaultListCellRenderer(); 

    // Constructor 
    public ComboBoxRenderer() 
    { 
     setOpaque(true); 
     setHorizontalAlignment(CENTER); 
     setVerticalAlignment(CENTER); 
     defaultBackgroundColor = 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) 
     selectionBackgroundColor = null; 
     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 
      String selectedText = getText(); 
      if (selectedText.equals("SelectedTextOne")){ 
       list.setSelectionBackground(Color.GREEN); 
      } else if (selectedText.equals("SelectedTextTwo")){ 
       list.setSelectionBackground(Color.RED); 
      } else { 
       list.setSelectionBackground(defaultBackgroundColor); 
      } 
      setBackground(mouseHoverHighlight); 
     } 
     else 
     { 
      // Set background to specific color depending on text value 
      String selectedTextInDropdownList = getText(); 
      if (selectedTextInDropdownList.equals("SelectedTextOne")) { 
       selectionBackgroundColor = Color.GREEN; 
      } else if (selectedTextInDropdownList.equals("SelectedTextTwo")) { 
       selectionBackgroundColor = Color.RED; 
      } else { 
       selectionBackgroundColor = defaultBackgroundColor; 
      } 
     } 


     return this; 
    } 

    @Override 
    public boolean isOpaque() { 
     return true; 
    } 

    @Override 
    public void setBackground(Color bg) { 
     super.setBackground(bg); //To change body of generated methods, choose Tools | Templates. 
    } 

    @Override 
    public Color getBackground() { 
     return selectionBackgroundColor == null ? super.getBackground() : selectionBackgroundColor; 
    } 
} 
2

So spielen nach viel herum, diese ...

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; 
    } 
} 

scheint zu funktionieren.Es scheint, den Text einzustellen, nachdem die Hintergrundfarbe Probleme verursacht hat, wahrscheinlich ein Repaint oder etwas auszulösen.

diesem Grund habe ich stattdessen einen DefaultListCellRenderer verwenden würde empfehlen, es auf einem JLabel basiert und optimiert wurde diese Art von Updates

+0

So weit so gut, das einzige Problem ist jetzt nach der Auswahl, die Combobox ist immer noch mit einem hellen Grau markiert (bis Sie etwas anderes auswählen). Irgendeine Idee, wie man das repariert? –

+0

In meinen Tests wurde es durch das Aussehen und Gefühl (MacOS) überschrieben. Ich habe auch bemerkt, dass 'cellHasFocus'' false' ist, wenn Sie versuchen, den Wert von der Liste auszuwählen, aber 'true', wenn es das" ausgewählte "Element ist, also vielleicht mit dem – MadProgrammer

+0

herumspielen. Ich habe die Frage und den Code so aktualisiert Sie könnten das Problem sehen, das ich immer noch habe. –

Verwandte Themen