Swing dynamisch Buttons in JEditorPane erstellen

  • Themenstarter Themenstarter warden
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
W

warden

Gast
Hallo,

ich möchte einen HTML Editor mit Zusatzfunktionen erstellen.
Der HTML Code besteht nur aus H1, H2, H3 sowie P Tags.

Zusätzlich soll aber jedem dieser Tags eine "Zusatzfunktion" zugewiesen werden.
d.h. wenn der Benutzer einen H1 Tag erstellt soll daneben (im Editor-Fenster am Rand) ein zusätzliches Input Feld erstellt werden in dem der Benutzer Keywords eintragen kann.
bei einem H2 Tag soll eine Select-Auswahlfeld kommen in dem eine Kategorie ausgewählt werden kann.
Bei einem P Tag soll ein Feld erscheinen in dem ein Bild (Video, oder Galerie) aus einer Mediengalerie eingefügt werden kann.

Diese Zusatzfunktionen sollen nicht den eigentlichen HTML Code ändern, die Buttons bzw Eingabefelder sollen aber direkt im Editorfenster an der entsprechenden Stelle erscheinen.


Ich habe bisher versucht mit Hilfe des EditorKits die entsprechenden Views (PaintChilds) so zu überschreiben das die gewünschten Elements angezeigt werden.

Das funktioniert allerdings nur mit Text. ( g.drawString() ) d.h. Ich kann z.B. neben jedem P "Absatz" und neben jeden H2 "Titel" ausgeben.

Sobald ich jedoch einen Button erstellen möchte passiert entweder garnichts oder das ganze Programm hängt sich auf.

Ich hoffe ihr könnt mir helfen.

Hier mal ein bisschen Code:

Java:
public class HTMLEditor extends JFrame implements ActionListener {
    
    private HTMLDocument document;
    private JEditorPane textPane = new JEditorPane();
    /*
	...
    */
    public HTMLEditor() {
      super("HTMLEditor");
      ReportEditorKit editorKit = new ReportEditorKit();
      textPane.setEditorKit(editorKit);
      /*
	  ...
      */
    }

    /*
	...
    */

    class ReportEditorKit extends HTMLEditorKit {
      @Override
      public ViewFactory getViewFactory() {
	return new HTMLEditorKit.HTMLFactory() {
	  public View create(Element elem) {
	    Object o = elem.getAttributes().getAttribute(
			StyleConstants.NameAttribute);
	    if (o instanceof HTML.Tag) {
	      HTML.Tag kind = (HTML.Tag) o;
	      
	      if (kind == HTML.Tag.P ) {
		return new ParagraphView(elem);
	      }
	      if (kind == HTML.Tag.H2 ) {
		return new BlockHeadlineView(elem);
	      }
	      /*
		 ...
	      */
	    }  
	    return super.create(elem);
	  }
	};
      }
    }

     /*
	...
    */

}

/* 
  Report View verschiebt den Content um 120 Pxl nach rechts 
  damit Platz für Zusatzelement ist 
*/
class ReportView extends javax.swing.text.html.ParagraphView {

  JButton test;

  public ReportView(Element e) {
      /*
	...
    */
  }

  @Override
  protected void setInsets(short top, short left, short bottom,
    short right) {super.setInsets
    (top,(short)(left+120),
    bottom,right);
  }

  @Override
  public void paintChild(Graphics g, Rectangle r, int n) {
    super.paintChild(g, r, n);
  }
}

/*
  Hier die BlockHeadlineView (H2) 
  Soll einfach nur "Titel" und eine Button Test neben der Headline ausgeben
*/
class BlockHeadlineView extends ReportView {

  public BlockHeadlineView(Element e){
    super(e);
    test = new JButton("Test");
  }
  @Override
  public void paintChild(Graphics g, Rectangle r, int n) {
    super.paintChild(g, r, n);

    if(n == 0) {
	int numberX = r.x - getLeftInset();
	int numberY = r.y + r.height - 5;
	g.drawString("Titel", numberX, numberY);	// Das funktioniert
	
	// Das alles nicht, egal was ich davon probiert habe
	
	// test.paint(g);
	// getContainer().add(test);
	// getContainer().validate();
	// getContainer().repaint();
    }
  }
}

/*
 ...
*/
 
Morgen.
Ich kann dir nicht wirklich sagen wie es geht, aber ich bin vor einer Weile beim Herumprobieren auf dieses Beispiel gestoßen. Damit bekommt man immerhin schonmal einen JButton in einer Editorpane gerendert. Vielleicht hilft dir das etwas weiter.
 
Danke für das Beispiel nützt mir aber leider nciht wirklich. Da dadurch der Button im HTML code stehen muss. das soll er aber nicht.

Ich kann auch einen button erzeugen. Mein Hauptproblem ist das ich es nicht hinbekomme den normaln HTML output und einen buttton zu erzeugen.

z.B.

Java:
public ViewFactory getViewFactory() {
    return new HTMLEditorKit.HTMLFactory() {
        public View create(Element elem) {
            ...
           if (kind == HTML.Tag.H2 ) {
               return new H2TestView(elem);
           }

....

/* leite ich die H2TestView von  javax.swing.text.html.ParagraphView ab geht der HTML output plus sonstiger Text, aber kein button */
class BlockHeadlineView extends  javax.swing.text.html.ParagraphView{

    public BlockHeadlineView(Element e){
        super(e);
        test = new JButton("Test");
    }
    @Override
            public void paintChild(Graphics g, Rectangle r, int n) {
                super.paintChild(g, r, n);
                 ...
                    g.drawString("Blocktitel", numberX, numberY);
                     // Button ausgeben funktionier nicht
                    test.paint(g);
                }
                                           
            }

}

/* leite ich die H2TestView von ComponentView kann ich einen button ausgeben aber ich schaff es nciht das HTML auszugeben */

class BlockHeadlineView extends ComponentView{

   protected Component createComponent() {

                        JButton button = new JButton("Button : text unknown");

                        return button;
                    }
}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben