CSS in JEditorPane

Webmaster Pazi

Aktives Mitglied
Hallöchen Leute!

Habe ein Problem mit folgenden CSS-Attributen in JEditorPane:

border-bottom-color, border-bottom-width und border-bottom-style

Das JEditorPane ignoriert diese Attribute und lässt den Style einfach weg?!

Hat jemand eine Idee was da los ist? Denn das JEditorPane ist auf text/html eingestellt und das kit
für den StyleSheet ist hinzugefügt...
 

XHelp

Top Contributor
Es wird nicht 100% css unterstützt, deswegen würde ich einfach drauf tippen, dass diese Attributen nicht unterstützt werden. Vor allem wenn andere gehen.
 

Webmaster Pazi

Aktives Mitglied
Hmm schade eigentlich, dass html und css in java so eingerschänkt ist. gäb es denn eine möglichkeit das irgendwie selbst zu "rendern" oder gibt es dafür vllt. geeignete lib's ?
 

Wildcard

Top Contributor
Wenn du nicht an Swing gebunden bist kannst du SWT verwenden. Das SWT Browser Widget embedded den OS Browser und bringt daher die kompletten Rendering und CSS capabilities eines modernen Browsers mit.
 

Webmaster Pazi

Aktives Mitglied
Also Eclipse zeigt mir das package org.w3c.dom.
Wäre das nicht auch eine Lösung, also gäbs da einen renderer, der vllt. (wenigstens border von elementen) rendern kann?
 

Webmaster Pazi

Aktives Mitglied
Also laut CSS (Java 2 Platform SE 5.0)
Funktionieren nur einige Attribute, darunter gibt es eine 2. Liste, die jedoch nicht von der Rendering Engine nicht verarbeitet wird.

Code:
The following are modeled, but currently not rendered.
    ...
    border-top-width (this is used to indicate if a border should be used)
    border-right-width
    border-bottom-width
    border-left-width
    border-width
    border-top
    border-right
    border-bottom
    border-left
    border
    ...

Und genau die Border-Attribute benötige ich, mehr schon nicht. Und das mit dem SWT Widget kann auch nicht Funktionieren, denn in dem JEditorPane ist reines HTML und keine SWT/Swing Komponenten ;)
 

Webmaster Pazi

Aktives Mitglied
Ja, also ich werde dass dann nicht in HTML machen sondern mit Tk-UI - CSS Engine

Da gäbs jedoch nen Problem, wenn neue Texte hinzukommen, wo soll ich diese dann "draufpacken" ?

Übrigens: Es soll ein Chat-Fenster werden, deswegen dachte ich vorhin an HTML und CSS (für den Content der Texte, Usernamen,...), aber da ich
mit HTML ja keinen einfluss auf Java habe (z.b. mit HTML actionlisteners auslösen etc) werde ich das wohl auf Swing basiert coden müssen. Also bleibt mir die Frage, wie ich dann neue panels (mit Texten von Benutzern) hinzufüge. Denn kommen da einmal an die über 300 neue panel's wird das dann sicher
an der Performance leiden.
 

XHelp

Top Contributor
Übrigens: Es soll ein Chat-Fenster werden, deswegen dachte ich vorhin an HTML und CSS (für den Content der Texte, Usernamen,...),
Dann brauchst du ja keine Engine, die dir zu der gesamten GUI css dranschraubt, oder? :bahnhof:
aber da ich mit HTML ja keinen einfluss auf Java habe (z.b. mit HTML actionlisteners auslösen etc) werde ich das wohl auf Swing basiert coden müssen.

Den Vorschlag von Tomate_Salat habe ich zwar selber nie verwendet, bin mir aber sicher, dass du da sowas wie ein DocumentListener dranschrauben kannst und dadurch dein Programmfluss steuern kannst. (Links anklicken, etc pp)
Also bleibt mir die Frage, wie ich dann neue panels (mit Texten von Benutzern) hinzufüge.
das macht kein Sinn
 

slawaweis

Bekanntes Mitglied
Übrigens: Es soll ein Chat-Fenster werden, deswegen dachte ich vorhin an HTML und CSS (für den Content der Texte, Usernamen,...), aber da ich
mit HTML ja keinen einfluss auf Java habe (z.b. mit HTML actionlisteners auslösen etc) werde ich das wohl auf Swing basiert coden müssen. Also bleibt mir die Frage, wie ich dann neue panels (mit Texten von Benutzern) hinzufüge. Denn kommen da einmal an die über 300 neue panel's wird das dann sicher
an der Performance leiden.
Du brauchst eine JList, einen eigenen ListCellRenderer und ein eigenes Datenmodel für die Inhalte. Auf diese Weise kannst Du auch 10.000 Einträge im Chat darstellen.

Slawa
 

Webmaster Pazi

Aktives Mitglied
Du brauchst eine JList, einen eigenen ListCellRenderer und ein eigenes Datenmodel für die Inhalte. Auf diese Weise kannst Du auch 10.000 Einträge im Chat darstellen.

Slawa

Vielen Dank ;)

Meine Frage dazu: Wie sollte ich das am besten realisieren (Sorry, aber bin noch nicht so der Java-Pro) ?
Ein kleines Tut oder ein Code-Beispiel wäre mir sicher hilfreich!
 

slawaweis

Bekanntes Mitglied
Lässt sich der Text auch in 2 oder 3 Zeilen Teilen ? Das wäre wichtig für einen Chat :)
der CellRenderer ist eine beliebige Komponente, die man nur vor dem jeweiligen Rendern richtig setzen muss. Du kannst Dir also ein Panel mit allem möglichen bauen, inklusive einer JEditorPane und HTML-Formatierung eines Chat-Eintrages. Ein DefaultStyledDocument und JTextArea wäre hier aber einfacher.

Slawa
 

Webmaster Pazi

Aktives Mitglied
Lassen sich denn keine Buttons hinzufügen zur JList? Ich möchte gernen Statt die Icons Buttons hinzufügen, jedoch nimmt mir der Renderer die buttons per add() nicht an?! (Diese Buttons werden dann als "Link" genutzt, wenn man zum Beispiel auf den Benutzernamen klickt, dass das Profil erscheint).

Was kann ich da machen ?
 

slawaweis

Bekanntes Mitglied
Lassen sich denn keine Buttons hinzufügen zur JList? Ich möchte gernen Statt die Icons Buttons hinzufügen, jedoch nimmt mir der Renderer die buttons per add() nicht an?! (Diese Buttons werden dann als "Link" genutzt, wenn man zum Beispiel auf den Benutzernamen klickt, dass das Profil erscheint).
der Renderer ist deine JComponent, die kann alles aufnehmen. Allerdings ist der Renderer nicht interaktiv. Dazu musst Du den CellEditor implementieren. Wie mir gerade erst jetzt aufgefallen ist, unterstützt JList keine CellEditoren, d.h. Du musst eine einspaltige JTable verwenden, hier ist ein Beispiel:

Editable List Example : ListSwing ComponentsJava

Weiterhin möchte ich noch auf JXHyperlink aus SwingX verweisen, was ein wirklicher visueller Link in Swing ist. Ändert aber nichts daran, dass man einen CellEditor braucht.

SwingX: Consider JXHyperlink As An Alternative To Buttons

Slawa
 

Webmaster Pazi

Aktives Mitglied
Wie kann man die Spaltenbeschreibung (oben der name der Spalte) ausblenden?

table5.gif


Ein Beispielcode von: JTable Examples
 

slawaweis

Bekanntes Mitglied
entweder

Java:
table.setTableHeader(null);

oder

Java:
table.getTableHeader().setVisible(false);

Slawa
 

Webmaster Pazi

Aktives Mitglied
Ah genau !

So ich hab die JTable endlich fast fertig! Ein Problem gibts noch mit dem Rendern mehrerer Zeilen.
Ich kann auch nicht auf den Text zugreifen (2. Spalte) der wird komischerweise auch ohne renderer angezeigt?! Hier mal der Code:

JButtonTableExample.java
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

public class JButtonTableExample extends JFrame {

  public JButtonTableExample(){
    super( "JButtonTable Example" );
    
    DefaultTableModel dm = new DefaultTableModel() {
        public boolean isCellEditable(int row, int column) {
            if (column == 1) {
                return false;
            } else {
                return true;
            }
          }
    };
    dm.setDataVector(new Object[][]{{"Username","Texttext"},
                                    {"Username","Texttext 2 Text Text Text Text Text Text Text Text Text Text Text"}},
                     new Object[]{"username","message"});
                     
    JTable table = new JTable(dm);
    table.setShowGrid(false);
    table.setCellSelectionEnabled(false);
    table.setFocusable(false);
    table.setTableHeader(null);
    table.getColumn("username").setCellRenderer(new ButtonRenderer());
    table.getColumn("username").setCellEditor(new ButtonEditor(new JCheckBox()));
    table.getColumn("username").setMinWidth(200);
    table.getColumn("username").setMaxWidth(200);
    table.getColumn("message").setCellRenderer(new LabelRenderer());
    table.getColumn("message").setCellEditor(new LabelEditor(new JCheckBox()));
    JScrollPane scroll = new JScrollPane(table);
    getContentPane().add( scroll );
    setSize( 400, 100 );
    setVisible(true);
  }

  public static void main(String[] args) {
    JButtonTableExample frame = new JButtonTableExample();
    frame.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    });
  }
}

ButtonEditor.java
Java:
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;

public class ButtonEditor extends DefaultCellEditor {
  protected JButton button;
  private String    label;
  private boolean   isPushed;

  public ButtonEditor(JCheckBox checkBox) {
    super(checkBox);
    button = new JButton();
    button.setOpaque(true);
    button.setHorizontalAlignment(SwingConstants.LEFT);
    button.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        fireEditingStopped();
      }
    });
  }

  public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
    if (isSelected) {
      button.setForeground(table.getSelectionForeground());
      button.setBackground(table.getSelectionBackground());
    } else {
      button.setForeground(table.getForeground());
      button.setBackground(table.getBackground());
    }
    label = (value ==null) ? "" : value.toString();
    button.setText( label );
    isPushed = true;
    return button;
  }

  public Object getCellEditorValue() {
    if (isPushed)  {
      // 
      // 
      JOptionPane.showMessageDialog(button ,label + ": Ouch!");
      // System.out.println(label + ": Ouch!");
    }
    isPushed = false;
    return new String( label ) ;
  }
  
  public boolean stopCellEditing() {
    isPushed = false;
    return super.stopCellEditing();
  }

  protected void fireEditingStopped() {
    super.fireEditingStopped();
  }
}

ButtonRenderer.java
Java:
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

public class ButtonRenderer extends JButton implements TableCellRenderer {

  public ButtonRenderer() {
    setOpaque(true);
    this.setHorizontalAlignment(SwingConstants.LEFT);
  }
  
  public Component getTableCellRendererComponent(JTable table, Object value,
                   boolean isSelected, boolean hasFocus, int row, int column) {
    if (isSelected) {
      setForeground(table.getSelectionForeground());
      setBackground(table.getSelectionBackground());
    } else{
      setForeground(table.getForeground());
      setBackground(UIManager.getColor("Button.background"));
    }
    setText( (value ==null) ? "" : value.toString() );
    return this;
  }
}

LabelEditor.java
Java:
import java.awt.Component;

import javax.swing.DefaultCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JTable;

public class LabelEditor extends DefaultCellEditor {
    
    private JLabel label;
    
    public LabelEditor(JCheckBox checkBox) {
        super(checkBox);
        label = new JLabel();
    }
    
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        label.setText("");
        return label;
      }

}

LabelRenderer.java
Java:
import java.awt.Component;

import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.table.TableCellRenderer;

public class LabelRenderer extends JTextArea implements TableCellRenderer {
    
    public void LabelRenderer() {
        this.setEditable(false);
        this.setLineWrap(true);
        this.setWrapStyleWord(true);
    }
 
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        this.setText(value.toString());
        return this;
    }
}
 

slawaweis

Bekanntes Mitglied
So ich hab die JTable endlich fast fertig! Ein Problem gibts noch mit dem Rendern mehrerer Zeilen.
Ich kann auch nicht auf den Text zugreifen (2. Spalte) der wird komischerweise auch ohne renderer angezeigt?! Hier mal der Code:
ich habe mir den Code ansehen. In der Klasse JButtonTableExample, in isCellEditable markierst Du die zweite Spalte als nicht editierbar, deshalb kannst Du nicht auf den Text zugreifen:

Java:
        @Override
        public boolean isCellEditable(int row, int column) {
            if (column == 1) {
                return false; // zweite Spalte nicht editierbar
            } else {
                return true;
            }
          }

Weiterhin hast Du den Konstruktor in LabelRenderer als Funktion deklariert, was das andere Problem erklären sollte.

Slawa
 

Webmaster Pazi

Aktives Mitglied
Stimmt, deswegen wurde der Text nicht übernommen und der Kontruktor wurde zu einer Funktion, die nicht augerufen werden konnte ;)

Beim LabelRenderer der die Funktionen von JTextArea implementiert, sollte eigentlich bei zu viel Text den Text so ändern, dass er in die 2. Zeile der Zelle geschrieben wird, was er aber nicht tut, habe das mal mit JLabel versucht, jedoch scheiterte das, denn der Text wurde "unter" die Zelle geschoben. Lässt sich da nichts andere machen? Zb. die Zellenhöhe erweitern?

So, nochmals vielen Dank!
 

slawaweis

Bekanntes Mitglied
Beim LabelRenderer der die Funktionen von JTextArea implementiert, sollte eigentlich bei zu viel Text den Text so ändern, dass er in die 2. Zeile der Zelle geschrieben wird, was er aber nicht tut, habe das mal mit JLabel versucht, jedoch scheiterte das, denn der Text wurde "unter" die Zelle geschoben. Lässt sich da nichts andere machen? Zb. die Zellenhöhe erweitern?
Du musst entweder setPrefferedSize in dem CellRenderer und CellEditor setzen oder setRowHeight in JTable.

Slawa
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Relative Pfadangabe in JEditorPane zur lokalen Datei Allgemeine Java-Themen 2
A Auswahl eines JEditorPane das Sich in einem JScrollPanel Befindet Allgemeine Java-Themen 2
A jEditorPane Html Datei öffnen (code) Allgemeine Java-Themen 3
C JEditorPane langsam großes HTML Allgemeine Java-Themen 8
T TextArea, JTextPane, JEditorPane Allgemeine Java-Themen 11
StrikeTom Swing JEditorPane automatischer Umbruch Allgemeine Java-Themen 4
I Teilweise falsche Darstellung jap. Zeichen im JEditorPane mit RTFEditorKit aus RTF-Datei Allgemeine Java-Themen 5
S Swing mit JEditorPane per HTML auf Bilder in JAR zugreifen. Allgemeine Java-Themen 3
E JTextArea / JEditorPane + Text formatieren Allgemeine Java-Themen 3
T JavaScript aus HTML im JEditorPane ausführen? Allgemeine Java-Themen 5
X Ausgabe auf JEditorPane Allgemeine Java-Themen 5
Iron Monkey JEditorPane mit Refresh von Meta Allgemeine Java-Themen 7
S ImageTag in JEditorPane Allgemeine Java-Themen 2
R JTextPane (JEditorPane) ignoriert JScrollPane Allgemeine Java-Themen 5
U JEditorPane & copy'n'paste Allgemeine Java-Themen 34
O breite des inhalts eines jeditorpane Allgemeine Java-Themen 2
G JEditorPane Zeilenumbruch Allgemeine Java-Themen 1
G JEditorPane will nicht scrollen! Allgemeine Java-Themen 2
D Suchfunktion innerhalb Jeditorpane Allgemeine Java-Themen 6
G JEditorPane: angezeigter Text Allgemeine Java-Themen 21
D Jeditorpane + einlesen ausserhalb des Jar Allgemeine Java-Themen 4
T JApplet - JEditorPane gegen JPanel tauschen Allgemeine Java-Themen 2
T JEditorPane oder JTextPane Applets und Flash anzeigen Allgemeine Java-Themen 7
T JEditorPane aktualisieren Allgemeine Java-Themen 14
V Hyperlink mit JEditorPane Allgemeine Java-Themen 40
V Hyperlink hervorheben mit Hilfe von der Klasse JEditorPane Allgemeine Java-Themen 7
S JEditorPane / JScrollPane und nach unten scrollen Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben