Avatar billede mungojerrie Nybegynder
24. august 2005 - 14:19 Der er 9 kommentarer og
1 løsning

Baggrundsfarve i en JComboBox

Hej alle

Jeg har lidt problemer med at ændre baggrundsfarven for min JComboBox. Jeg vil gerne have det sådan
at hvis værdien af selectedItem for comboboxen er lig med "not ready" så er baggrundsfarven rød, eller er den grøn

Jeg har læst lidt om comboboxe her:

http://java.sun.com/docs/books/tutorial/uiswing/components/example-1dot4/CustomComboBoxDemo.java

og jeg har forsøgt at efterabe eksemplet.....dog uden held. Jeg er lidt på bar bund ang metoden: getListCellRendererComponent

Min kode ser sådan ud....har dog udeladt min JTable....
p.s. DefaultServerDataView extender DefaultTableModel

Er der nogen der kan hjælpe ?

----------------------kode-------------------------

public class ConverterServerDataView extends DefaultServerDataView {

    private static String[] sheetComboValues ={"not ready","ready"}; //valgmuligheder i combobox
    private static Integer[] sheetStatusIntArray;
   
    public ConverterServerDataView() {
        super(Server.fetchDataRows(), getColumnNames());
        ....
        sheetStatusIntArray = new Integer[sheetComboValues.length];
        ....
    }
   
    public static JComboBox getSheetStatusComboBox(){
        ComboBoxRenderer renderer = new ComboBoxRenderer();
        JComboBox sheetStatus = new JComboBox(getSheetStatusIntArray());
        sheetStatus.setRenderer(renderer);
        return sheetStatus;
    }
   
    public void setUpTableColumns(JTable table) {
        ......
        table.getColumnModel().getColumn(11).setCellEditor(new DefaultCellEditor(getSheetStatusComboBox()));
        ......
    }
   
    public static Integer[] getSheetStatusIntArray() {
        return sheetStatusIntArray;
    }
}


---------------------------------------------------------------------

public class ComboBoxRenderer extends JLabel implements ListCellRenderer {

    public ComboBoxRenderer() {
        setOpaque(true);
        setHorizontalAlignment(CENTER);
        setVerticalAlignment(CENTER);
    }
   
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus){
        //hvad skal jeg gøre her for at få ændret baggrundsfarven ift det valgte i comboboxen ????????
        return this;
   
    }


---------------------------------------------------------------------
Avatar billede _carsten Nybegynder
24. august 2005 - 14:30 #1
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus){
       
        if(value != null){
          if(value.toString().equals("not ready"))
              setBackground(Color.red);
          else
              setBackground(Color.green);
        }
        return this;
   
    }
Avatar billede mungojerrie Nybegynder
24. august 2005 - 14:51 #2
øhh, efter at du har vist mig at din kode duer, så tror jeg jeg har misforstået Suns kode lidt, jeg vil nemlig ikke manipulere med baggrundsfarven for valgmulighederne, men på baggrund af det valgte i comboboxen, vil jeg sætte baggrundsfarven for tabellens celle (som indeholder en combobox)....gav det mening ??
Avatar billede _carsten Nybegynder
24. august 2005 - 15:32 #3
Ja - jeg er med, vender tilbage senere, det er fyraften og jeg er på vej hjem!
Avatar billede mungojerrie Nybegynder
24. august 2005 - 15:33 #4
okay :)
Avatar billede _carsten Nybegynder
24. august 2005 - 17:38 #5
Strategien er stort det den samme, du laver bare en cellRenderer i stedet for og adder den til din tabel


        TableColumn col;
        TableColumnModel colModel = getColumnModel();
        col = colModel.getColumn(3); /NUMMER PÅ KOLONNE
        col.setCellRenderer(new MyRenderer());

public class MyRenderer extends DefaultTableCellRenderer{
   
    public MyRenderer() {
    }

    public Component getTableCellRendererComponent(JTable tbl, Object o,
                boolean isSelected, boolean hasFocus, int row, int column) {
       
        if(o != null){
          if(o.toString().equals("not ready"))
              setBackground(Color.red);
          else
              setBackground(Color.green);
        }

        return this;
    }
}
Avatar billede mungojerrie Nybegynder
24. august 2005 - 18:01 #6
fint, det tester jeg lige i morgen :-)
Avatar billede mungojerrie Nybegynder
25. august 2005 - 10:03 #7
så er det testet og det duer jo, men jeg ville gerne have jeg stadig kunne læse teksten i feltet som får anden baggrundsfarve og det synes jeg ikke lige jeg får til at virke.....

Har lavet denne klasse:

public class DataCellRenderer extends DefaultTableCellRenderer{
   
    private boolean isBordered = true;
    Border unselectedBorder = null;
    Border selectedBorder = null;

    /**
    * @param isBordered
    *
    */
    public DataCellRenderer(boolean isBordered) {
        this.isBordered = isBordered;
        setOpaque(true); //MUST do this for background to show up.
    }
   
    public Component getTableCellRendererComponent(JTable table, Object o,
            boolean isSelected, boolean hasFocus, int row, int column) {
       
        if(o != null){
            if(o.toString().equals("not ready")){
                setBackground(Color.red);
            }else{
                setBackground(Color.green);
            }
        }
       
        if (isBordered) {
            if (isSelected) {
                if (selectedBorder == null) {
                    selectedBorder = BorderFactory.createMatteBorder(2,5,2,5, table.getSelectionBackground());
                }
                setBorder(selectedBorder);
            } else {
                if (unselectedBorder == null) {
                    unselectedBorder = BorderFactory.createMatteBorder(2,5,2,5, table.getBackground());
                }
                setBorder(unselectedBorder);
            }
        }
       
        return this;
    }
}
Avatar billede mungojerrie Nybegynder
25. august 2005 - 10:05 #8
har prøvet at sætte setForeground(Color.black); men det har ikke den ønskede effekt
Avatar billede _carsten Nybegynder
25. august 2005 - 11:36 #9
Selvfølgelig - mig der var et kvaj

        if(o != null){
          if(o.toString().equals("not ready"))
              setBackground(Color.red);
          else
              setBackground(Color.green);
          setText(0.toString());  // RET SÅ VÆSENTLIG HVIS MAN VIL CELLENS VÆRDI !
        }

Sorry !!

Og svar
Avatar billede mungojerrie Nybegynder
25. august 2005 - 11:38 #10
åhh ja, det burde jeg vel egentlig selv have fundet ud af :-(
men tak for hjælpen, nu kører det bare!!! :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester