Wert in Dropdown Menü kursiv schrieben

Jhue89

Bekanntes Mitglied
Hallo Zusammen,

mal ne kurze Frage. Kann ich einen Wert in einem Dropdown Menü kursiv/ Fett schreiben?

sollte dann z.b. so aussehnen

1
2
3
4
5
6
7
8
9
10
 
Ja, das geht. Du kannst schlimmstenfalls einen eigenen Renderer schreiben, aber probier zuerst mal, html-Text zu verwenden
<html><i>MyText</i></html>
 
sieht fast gut aus. Aber wie mache ich das wenn ich eine Variable dazu nehmen möchte.

Java:
  for (int j= 1; j<10; j++)
          {
              list1.add("<html><i>MyText</i></html>" + j);
              
          }

Vielen lieben Dank!
 
Du meinst als Text?
Z.B. so:
Java:
          for (int i = 1; i <= 10; i++) {
            if (i == 5 || i == 10) {
              list.add(String.format("<html><i>%d</i></html>", i));//%d heißt: Hier wird ein Integer eingesetzt.
            } else {
              list.add(String.format("%d", i));
            }
          }
Persönlich würde ich aber nicht den Text in der Liste setzen, sondern nur den Text in der Anzeige. Man sollte nicht Daten und Formatierung vermischen.
Dafür muss man den Renderer überschreiben, der dann anhand der Daten oder anderer Bedingungen den Text formatiert.

Der DefaultRenderer liefert ein JLabel, schon richtig formatiert (Farbe usw.). Man muss dann nur gegebenenfalls den Text ersetzen und das veränderte Label als Ergebnis liefern.
 
Mal ein etwas komplexeres Beispiel mit einem Decorator, mit dem Du einzelnen Zeilen eine Schrift zuweisen kannst.

Java:
import java.awt.*;
import javax.swing.*;
import java.util.*;

public class Test {
import java.awt.*;
import javax.swing.*;
import java.util.*;

public class Test {

    static class FontRowDecorator<T> implements ListCellRenderer<T> {
        private final ListCellRenderer<T> renderer;
        private final Map<Integer, Font> rowFontMap = new HashMap<>();

        public FontRowDecorator(ListCellRenderer<T> renderer) {
            this.renderer = renderer;
        }

        public void set(int row, Font font) { rowFontMap.put(row, font); }

        @Override
        public Component getListCellRendererComponent(JList<? extends T> list,
                                                   T value,
                                                   int index,
                                                   boolean isSelected,
                                                   boolean cellHasFocus) {
            Component comp = renderer.getListCellRendererComponent(
                        list, value, index, isSelected, cellHasFocus);          
            
            Font rowFont = rowFontMap.get(index);
            if (rowFont != null) {
                comp.setFont(rowFont);
            }
            return comp;
        }
    }

    public void run() {
        String[] entries = {"1","2","3","4","5","6","7","8","9","10"};
        JComboBox<String> box = new JComboBox<>(entries);
        box.setFont(box.getFont().deriveFont(Font.PLAIN));

        FontRowDecorator<? super String> highlighted = new FontRowDecorator<>(box.getRenderer());
        highlighted.set(4, box.getFont().deriveFont(Font.ITALIC | Font.BOLD, 18f));
        highlighted.set(9, box.getFont().deriveFont(Font.ITALIC | Font.BOLD, 16f));
        box.setRenderer(highlighted);

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(box, BorderLayout.NORTH);
        frame.setSize(800, 600);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().run());
    }
}
 
Guten Morgen Zusammen,

so sollte es mal aussehen. Die Kursiv geschriebenen Texte sollen dem User zeigen das diese Variablen noch nicht verwendet wurden.
Wenn der Text ausgewählt wurde, soll er in der normalen Schriftart angezeigt werden.

Die Liste wurde in einer eigenen Klasse vordefiniert.

Java:
for (int j= 1; j<10; j++)
          {
              list1.add("MASTER_V" + j);
              
          }
Zusätzliche Variablen werden zur Laufzeit in die Liste geschrieben.

In den Tabellenfeldern ist noch einen AutoComplete Funkion hinterlegt. Wenn ich z.b das "M" in das Tabellenfeld eingebe werden mir nur die MASTER variablen angezeigt.

Wenn ich das mit der HTML schreibweise mache funktioniert die AutoComplete Funktion nicht mehr richtig, weil dort ja eigentlich
sowas drin steht "<html><i>MASTER_V%d</i></html>".
somit müsste "<" eingeben damit ich diese Variablen angezeigt bekomme.

Wäre ja auch zu einfach gewesen...

Ich probier die Variante von mihe7 mal aus.


Text kursiv.PNG
 
Ich denke nicht, dass du dich mit dem Autocomplete bechäftigen musst, sofern du in der Liste unveränderte Texte stehen hast.
Es geht dir ja um die Listenansicht und ein Textfeld hat per Default keine solche. Entweder wird das Popup dafür manuell zusammengestellt, oder es ist Teil einer Kombobox. Und in letzterem Fall ersetzt du einfach den Listrenderer, so wie oben von mihe gezeigt.
 
@Neumi5694, wenn ich mich nicht verschaut habe, dann baut das AutocompleteBehaviour die JList und bietet die Möglichkeit an, den Renderer zu setzen (https://github.com/toby1984/swing-a...swing/autocomplete/AutoCompleteBehaviour.java)

@Jhue89, ich hab das grad alles nur ganz schnell überflogen, insofern kann es durchaus sein, dass ich daneben liege. Meine Gedanke war: Du hast eine AutocmpleteBehaviour-Instanz und rufst deren setListCellRenderer-Methode auf.
Ok, wieder was gelernt, da wr ich zu voreilig. Hatte das nicht mit einer UI in Verbindung gebracht. Dass sie dafür bereits ein Popup bereitstellen, hatte ich so nicht realisiert.
 
Sorry, aber jetzt komme ich nicht ganz mit.

den SetListCellRenderer habe ich. den Rufe ich hier in meinem Hauptprogramm auf. Die Oben genannte Methode habe ich ebenfalls im Hauptprogramm liegen.

Java:
         AutoCompleteList list = new AutoCompleteList();
      
      
       //Panel Center
       list1 = list.getAutoCompletelist(list1);
      
          
        textFieldTEST = newAutoCompleteField(list1);
        textFieldTEST.setPreferredSize(new Dimension(400,20));

Java:
   tblSchachtel1.getColumnModel().getColumn(1).setCellEditor((TableCellEditor) new DefaultCellEditor(textFieldTEST));


Java:
 public JTextField newAutoCompleteField(List<String> choices) {
       JTextField field = new JTextField();
       AutoCompleteBehaviour<String> autoComplete = new AutoCompleteBehaviour<String>();
       autoComplete.setCallback(new StringAutoCompleteCallBack(choices));
       autoComplete.setListCellRenderer(new DefaultListCellRenderer());     
      
       autoComplete.setInitialPopupSize(new Dimension(400,300));
       autoComplete.setVisibleRowCount(3);
      
      
       autoComplete.attachTo(field);     
       return  field;
   }
 
Hier:
Java:
autoComplete.setListCellRenderer(new DefaultListCellRenderer());
setzt du deinen eigenen ListCellrenderer anstatt des DefaultListCellRenderers ein.
Ziel ist es, eine Komponente (meistens Label) zu liefern, welche den Wert grafisch darstellt.

Der DefaultListCellrenderer verwendet dafür ein Label, das er für jeden Wert anpasst, anstatt jedesmal ein neues zu erzeugen.
Man kann sich auch das Label des DefaultListCellrenderers holen und verändern, damit erspart man sich die Auswertungen der anderen Parameter, der DefaultListCellListener macht das ja schon ordentlich.

Java:
  private class MyRenderer implements ListCellRenderer<XYZ> {

    private final DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer();

    @Override
    public Component getListCellRendererComponent(JList<? extends XYZ> list, XYZ value, int index, boolean isSelected, boolean cellHasFocus) {
      JLabel defaultLabel = (JLabel) defaultRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
      if (conditionForEditing) {
        //Label oder dessen Text verändern
      }
      return defaultLabel;
    }
  }
 
Ich hab den Teil jetzt mal reingenommen. InConditionForEditing muss ich dann ja die Zeilen reinschreiben die ich Kursiv haben möchte.

ich hab jetzt schon einiges Probiert aber so richtig funktioniert das noch nicht.

Mir ist noch nicht klar wie, ich an die die einzelenen Zeilen verändern kann.
 
Mir ist noch nicht klar wie, ich an die die einzelenen Zeilen verändern kann.
Der Renderer wird für jede Zeile aufgerufen. Du kriegst die Zeilennummer und den anzuzeigenden Wert. Anhand von denen oder wovon auch immer dir in den Sinn kommt entscheidest du dann, ob der Wert kursiv gehört oder nicht.

Hier ist ein einfaches Beispiel für einen Renderer, der abwechselnd kursiv+fett und "normal" schreibt.
Java:
  private class MyRenderer implements ListCellRenderer<String> {

    private final DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer();
    boolean isCursive = false;

    @Override
    public Component getListCellRendererComponent(JList<? extends String> list, String value, int index, boolean isSelected, boolean cellHasFocus) {
      JLabel defaultLabel = (JLabel) defaultRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
      if (isCursive) {
        defaultLabel.setFont(defaultLabel.getFont().deriveFont(Font.ITALIC + Font.BOLD));
      } else {
        defaultLabel.setFont(defaultLabel.getFont().deriveFont(Font.PLAIN));
      }
      isCursive = !isCursive;
      return defaultLabel;
    }
  }
 
Ich glaube selbst ihr müsste das laute Klicken in meinem Kopf gehört haben.

Jetzt hab ich endlich kapiert wie das funktioniert. Ist ja eigentlich ganz einfach.

Ich Danke euch für eure Unterstützung.
 

Neue Themen


Zurück
Oben