Avatar billede jwulff Nybegynder
21. maj 2007 - 13:01 Der er 12 kommentarer og
1 løsning

Font farve i java

Hey,

Jeg sidder og bøvlet lidt med at få en string udskrevet med farver. Jeg har forsøgt lidt med java.awt.color, men kan ikke rigtig få det til at virke...

I nedenstående kode er det td.getText() jeg gerne vil have ud i rød.

            if (Calendar.getInstance().after(td.getDeadline())) {
                todolist.addElement(td.getText() + " [" + formatter.format(td.getDeadline().getTime())+ "]");       
            }

Håber der lige er en der kan hjælpe, skal bruges i dag nemlig :(

På forhånd tak for hjælpen!
Avatar billede mikkelbm Nybegynder
21. maj 2007 - 13:33 #1
Jeg går ud fra at det er en JList du prøver at add'e elementer til!?

Du skal nok igang med at skrive din egen ListModel. Ta' et kig her for yderligere info:

http://java.sun.com/docs/books/tutorial/uiswing/components/list.html
Avatar billede mikkelbm Nybegynder
21. maj 2007 - 13:35 #2
Og det var ikke en ListModel men en ListCellRenderer:

http://java.sun.com/javase/6/docs/api/javax/swing/ListCellRenderer.html
Avatar billede jwulff Nybegynder
21. maj 2007 - 14:13 #3
Ja, også noget af det jeg har kigget på, men synes ikke jeg kan få det sat rigtig op.
Avatar billede _carsten Nybegynder
21. maj 2007 - 14:24 #4
getText() returnerer ikke teksten i nogen specifik farve, men du kan få teksten vist i rød.

Er det en JList vi snakker om ?
Avatar billede jwulff Nybegynder
21. maj 2007 - 14:57 #5
På den måde det er nemmest. Har prøvet lidt forskelligt forgæves. Ja, ang. farven så er det eneste jeg ønsker at få vist teksten i rød.
Avatar billede _carsten Nybegynder
21. maj 2007 - 14:59 #6
Ok - den nemmeste måde følger her

Ret din metode til nedenstående

            if (Calendar.getInstance().after(td.getDeadline())) {
                todolist.addElement(td.getText() + " [" + formatter.format(td.getDeadline().getTime())+ "]¤");       
            }



Tilføj nedenstående CellRenderer ved: minJList.setCellRenderer(new ListRenderer());


import java.awt.Color;
import java.awt.Component;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
import javax.swing.JLabel;

public class ListRenderer extends JLabel implements  ListCellRenderer{

    public ListRenderer() {
        setOpaque(true);
    }

    public Component getListCellRendererComponent(JList list,
            Object value,
            int index,
            boolean isSelected,
            boolean cellHasFocus) {
       
        if(value != null){
            String[] s = value.toString().split("¤", 2);

            if(s.length > 1)
                setForeground(Color.RED);
            else
                setForeground(Color.BLACK);
           
            setText(s[0]);
        }
        return this;
    }
}



Så virker det.
Avatar billede jwulff Nybegynder
21. maj 2007 - 15:15 #7
minJList er det her hvor min td.getText() er?

Hele min metode ligner:

public void showToDo() {
        todolist.clear();
       
        List<ToDo> l = model.getToDoList();   
       
   
        DateFormat formatter = DateFormat.getDateInstance();
 
      //Meningen denne tekst skulle udskrives i rød.
      for (ToDo td : l) {
           
            if (Calendar.getInstance().after(td.getDeadline())) {
                todolist.addElement(td.getText() + " [" + formatter.format(td.getDeadline().getTime())+ "]");       
            }
        }       
    }
Avatar billede _carsten Nybegynder
21. maj 2007 - 15:23 #8
Øhhh - jeg er vist ikke helt med

Bruger du;  java.awt.List ???

Den har ingen setCellRenderer metode, kan du ikke bruge javax.swing.JList ?

Er først tilbage om en times tid.
Avatar billede jwulff Nybegynder
21. maj 2007 - 15:32 #9
Hej igen,

Teksten fra de objekter der skulle farves røde ligger i en alm. List (java.util.List). Har oprettet den nye renderer klasse, og skal jo gerne have den ind i min anden klasse (den metode jeg postede før)

Er ikke lige helt med mth. til minJList hvordan du mener med det. Er det ikke muligt noget alla:

public void showToDo() {
        todolist.clear();
       
        List<ToDo> l = model.getToDoList();
       
        ListRenderer r = l.setCellRenderer(new ListRenderer());
   
        DateFormat formatter = DateFormat.getDateInstance();
      for (ToDo td : l) {
           
            if (Calendar.getInstance().after(td.getDeadline())) {
                todolist.addElement(r.td.getText() + " [" + formatter.format(td.getDeadline().getTime())+ "]");       
            }
        }       
    }

Ellers kan man ikke lave sådan at man opretter den List<ToDo> l jeg har bliver kopieret til en javax.swing.JList liste?
Avatar billede jwulff Nybegynder
21. maj 2007 - 16:43 #10
Kunne det evt. være at jeg tilføjer dem på nogenlunde den her måde:

        String[] data = {"tekst1", "tekst2", "tekst3", "tekst4"};
        JList dataList = new JList(data);

og dernæst udskriver dataListen på en eller anden måde?
Avatar billede _carsten Nybegynder
21. maj 2007 - 17:01 #11
Sådan havde jeg forestille mig at du mente.


public class JListFrame extends javax.swing.JFrame {

    public JListFrame() {
        initComponents();
        list.setCellRenderer(new ListRenderer());
    }
   
                       
    private void initComponents() {
        jScrollPane1 = new javax.swing.JScrollPane();
        list = new javax.swing.JList();

        getContentPane().setLayout(new java.awt.FlowLayout());

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        list.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "Item 1", "Item 2¤", "Item 3", "Item 4¤", "Item 5" };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings[i]; }
        });
        jScrollPane1.setViewportView(list);

        getContentPane().add(jScrollPane1);

        pack();
    }
   
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new JListFrame().setVisible(true);
            }
        });
    }
   
             
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JList list;
}









import java.awt.Color;
import java.awt.Component;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
import javax.swing.JLabel;

public class ListRenderer extends JLabel implements  ListCellRenderer{

    public ListRenderer() {
        setOpaque(true);
    }

    public Component getListCellRendererComponent(JList list,
            Object value,
            int index,
            boolean isSelected,
            boolean cellHasFocus) {

        if(value != null){
            String[] s = value.toString().split("¤", 2);

            if(s.length > 1)
                setForeground(Color.RED);
            else
                setForeground(Color.BLACK);

            setText(s[0]);
        }
        return this;
    }
}
Avatar billede jwulff Nybegynder
22. august 2007 - 10:16 #12
Hej carsten,

tak for hjælpen. smid er svar
Avatar billede _carsten Nybegynder
22. august 2007 - 10:34 #13
Kommer her.
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