JEditorPane mit Zeilenhervorhebung

7. Februar 2009 von Jan in Java, Java Code Beispiele
Schlagwörter:, ,

Ich habe für meinen Editor eine Möglichkeit gesucht die aktuelle Zeile unter dem Cursor vollständig mit einer anderen Hintergrundfarbe hervorzuheben. Diese Möglichkeit habe ich folgendermassen realisiert:

Zusammenfassung:

Der JEditorPane füge ich einen speziellen CaretListener hinzu der bei Veränderungen des Cursors einen wiederum für die aktuelle Zeile einen Highlighter einrichtet. Das besondere ist der als innere Klasse realisierte HightlighterPainter. Dieser ist so entwickelt, dass er die ganze Zeile unabhängig von der Zeichenanzahl also auf die sichtbare Breite des Editors hervorhebt.

Hier nun der Quelltext des CaretListeners:

package sqlrunner.text;
 
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Shape;
 
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.plaf.TextUI;
import javax.swing.text.BadLocationException;
import javax.swing.text.Element;
import javax.swing.text.Highlighter;
import javax.swing.text.JTextComponent;
import javax.swing.text.LayeredHighlighter;
import javax.swing.text.Position;
import javax.swing.text.Utilities;
import javax.swing.text.View;
 
public class HighlightCurrentLineCaretListener implements CaretListener {
 
    static final Color DEFAULT_COLOR = new Color(230, 230, 250);
 
    private Highlighter.HighlightPainter painter;
 
    private Object highlight;
 
    public HighlightCurrentLineCaretListener() {
 
        this(null);
    }
 
    public HighlightCurrentLineCaretListener(Color highlightColor) {
 
        Color c = highlightColor != null ? highlightColor : DEFAULT_COLOR;
        this.painter = new LineHighlightPainter(c);
    }
 
    public void caretUpdate(CaretEvent evt) {
 
        final JTextComponent comp = (JTextComponent) evt.getSource();
        if (comp != null && this.highlight != null) {
            comp.getHighlighter().removeHighlight(this.highlight);
            this.highlight = null;
        }
        int pos = comp.getCaretPosition();
        final Element elem = Utilities.getParagraphElement(comp, pos);
        int start = elem.getStartOffset();
        int end = elem.getEndOffset();
        try {
            this.highlight = comp.getHighlighter().addHighlight(start,
                                                                end,
                                                                this.painter);
            comp.repaint();
        } catch (BadLocationException ex) {
            ex.printStackTrace();
        }
    }
 
    /**
     * Simple highlight painter that fills a highlighted area with
     * a solid color.
     */
    public static class LineHighlightPainter extends
        LayeredHighlighter.LayerPainter {
 
        private Color color;
 
        /**
         * Constructs a new highlight painter. If <code>c</code> is null,
         * the JTextComponent will be queried for its selection color.
         *
         * @param c
         *            the color for the highlight
         */
        public LineHighlightPainter(Color c) {
 
            this.color = c;
        }
 
        /**
         * Returns the color of the highlight.
         *
         * @return the color
         */
        public Color getColor() {
 
            return this.color;
        }
 
        // --- HighlightPainter methods ---------------------------------------
        /**
         * Paints a highlight.
         *
         * @param g
         *            the graphics context
         * @param offs0
         *            the starting model offset &gt;= 0
         * @param offs1
         *            the ending model offset &gt;= offs1
         * @param bounds
         *            the bounding box for the highlight
         * @param c
         *            the editor
         */
        public void paint(Graphics g, int offs0, int offs1, Shape bounds,
                          JTextComponent c) {
 
            final Rectangle alloc = bounds.getBounds();
            try {
                // --- determine locations ---
                TextUI mapper = c.getUI();
                final Rectangle p0 = mapper.modelToView(c, offs0);
                final Rectangle p1 = mapper.modelToView(c, offs1);
 
                // --- render ---
                if (getColor() == null) {
                    g.setColor(c.getSelectionColor());
                } else {
                    g.setColor(getColor());
                }
                final Rectangle r = p0.union(p1);
                g.fillRect(r.x, r.y, r.width, r.height);
            } catch (BadLocationException e) {
                // can't render
            }
        }
 
        // --- LayerPainter methods ----------------------------
        /**
         * Paints a portion of a highlight.
         *
         * @param g
         *            the graphics context
         * @param offs0
         *            the starting model offset &gt;= 0
         * @param offs1
         *            the ending model offset &gt;= offs1
         * @param bounds
         *            the bounding box of the view, which is not
         *            necessarily the region to paint.
         * @param c
         *            the editor
         * @param view
         *            View painting for
         * @return region drawing occured in
         */
        @Override
        public Shape paintLayer(Graphics g, int offs0, int offs1, Shape bounds,
                                JTextComponent c, View view) {
 
            if (getColor() == null) {
                g.setColor(c.getSelectionColor());
            } else {
                g.setColor(getColor());
            }
            // Should only render part of View.
            try {
                // --- determine locations ---
                Shape shape = view.modelToView(
                                               offs0,
                                               Position.Bias.Forward,
                                               offs1,
                                               Position.Bias.Backward,
                                               bounds);
                Rectangle r = shape instanceof Rectangle ? (Rectangle) shape
                        : shape.getBounds();
                g.fillRect(r.x, r.y, c.getWidth(), r.height);
                return r;
            } catch (BadLocationException e) {
                // can't render
            }
            return null;
        }
    }
}

Diesen CaretListener muss man nun mit:

textComp.addCaretListener(new HighlightCurrentLineCaretListener());

der Textkomponente hinzufügen. Hat bei mir ausgezeichnet funktioniert. Ich habe diesen Code unter Mac OS X und Windows getestet und er läuft abwärts bis Java 5.

  • Kommentare deaktiviert

berlin.jar… die (erste) Java-Konferenz in Berlin

30. August 2008 von Ralph Bergmann in Allgemein
Schlagwörter:, , , , , , , , , , , ,

Am 13. und 14. September findet am Campus „Treskowallee“ der Fachhochschule für Technik und Wirtschaft Berlins erste Java Konferenz statt. Mit über 30 Rednern und über 40 Vorträgen und Workshops haben wir eine Menge zu bieten.

Eberhard Wolff wird z.B. zwei Vorträge zum SpringFramework halten. Stefan Zörner von oose Hamburg spricht über „LDAP für Java Entwickler“, er ist auch Autor des gleichnamigen Buches und gibt in einem weiteren Vortrag eine Einführung in OGSi. Terrence Barr, Senior Technologist bei Sun Microsystems und „Ambassador of the Java Mobile & Embedded Community“ wird in seinem Vortrag neue und coole Sachen in Java mobile vorstellen. Guido Stepken gibt in seinem Vortrag eine weitere Sicht auf zukünftige Entwicklungen im mobilen Sektor und dies nicht nur aus Sicht von Sun. In einem weiteren Vortrag zeigt er, was Apple richtig und alle anderen falsch machen, lassen wir uns überraschen. Sein Programm rundet er mit „Einführung in Prozessuale Denkmodelle“, einem Workshop zum Mitdenken und Mitraten ab.

Natürlich dürfen auch die typischen Buzzwords nicht fehlen: SOA und AOP steht mit auf dem Programm, Vorträge über Webentwicklung und Tools zur Unterstützung von Softwareentwicklung und Teamarbeit bieten wir auch. Für die Leute, die mehr Hintergrundwissen brauchen, haben wir das JCP-Gespräch. Sascha Baumeister, Werner Keil und Arno Schmidmeier laden zum Gespräch, um den Java Community Process (JCP) als Organisation und die politische Natur von Standardisierungsarbeit vorzustellen.

Aber auch für die, die lieber was handfestes brauchen, haben wir das passende: Peter Roßbach, bekannt von seiner TomC@ Kolumne, wird am Samstag Nachmittag einen „Tomcat 6 im Einsatz“ Workshop geben. Der Workshop stellt die Grundlagen kurz vor und vermittelt die Konfiguration. Experimente mit den neuen HTTP-Konnektoren des Tomcat 6.0.18 auf der Basis von Java-NIO und C-APR runden diesen Teil ab. Konzepte und konkrete Konfigurationen der Lastverteilung mit dem Apache 2.2.9 und mod_jk 1.2.26 werden erläutert. Volker Wegert bringt dem Einsteiger die Eclipse RCP Entwicklung näher. Zudem haben wir noch die beiden Workshops „W3C-konforme Web-Programmierung in Java EE“ von Sascha Baumeister und „Einführung in Prozessuale Denkmodelle“ von Guido Stepken.

Als Community-Highlight wird zudem am Samstag Abend gemeinsam gegrillt. So können Experten und zukünftige Experten bei einem kühlen Bier und einer Wurst noch über dies und das ein wenig fachsimpeln.

Also eine Menge zu erleben für zwei Tage.

Für weitere Informationen besuchen sie bitte die Webseiten zur Konferenz, welche sie unter http://berlin.jar.jug-bb.de finden.

  • Kommentare deaktiviert

CW: Wie Sun mit Open Source Geld verdienen will

2. Juli 2008 von Ralph Bergmann in Allgemein
Schlagwörter:

“Simon Phipps, Chief Open Source Officer von Sun Microsystems, erklärt im Gespräch mit CW-Redakteur Wolfgang Herrmann, warum es ihm egal ist, dass Konkurrenten in seinem Softwarerevier wildern. Mehr…“ Quelle: Computerwoche

  • Kommentare deaktiviert

LDAP entmystifiziert. Ein Survival-Kit für Java-Projekte

18. Mai 2008 von Ralph Bergmann in Allgemein
Schlagwörter:, , , , , , ,

Unser nächster Vortrag steht ins Haus.

Stefan Zörner zeigt uns, dass LDAP und Java gut zueinander passen ;-)

Der Vortrag:
Die meisten Unternehmen und Organisationen verwalten Benutzer und deren Berechtigungen mit Verzeichnislösungen. Entsprechend sind Java-Projekte regelmäßig mit der Aufgabe konfrontiert, ein Verzeichnis zur Authentifizierung und Autorisierung zu integrieren. In diesem Zusammenhang fällt reflexartig das Stichwort LDAP. Was leistet LDAP, und was nicht? Welche Vorteile haben Verzeichnisse gegenüber relationalen Datenbanken? Welche Nachteile? Welche LDAP Server-Produkte sind heute relevant? Welche Werkzeuge helfen im Projekt weiter? Und was hat LDAP mit SSO zu tun? Der Vortrag beantwortet diese Fragen und zeigt vieles am praktischen Beispiel.

Der Sprecher:
Stefan Zörner arbeitet als Anwendungsarchitekt, Berater, Trainer und Coach bei oose in Hamburg. Er ist Buchautor, veröffentlicht regelmäßig Artikel und ist Sprecher auf Konferenzen. 2007 erschien die dritte Auflage seines Buches „LDAP für Java-Entwickler“. Darüber hinaus ist er Committer im Apache Directory Projekt und zeichnet dort u.a. für die LDAP-Zertifizierung von ApacheDS durch die Open Group verantwortlich.

Der Treffpunkt:
Der Vortrag wird in der Fachhochschule für Technik und Wirtschaft, Treskowallee 8 im Raum HG 208 vorgetragen werden.

Der Ablauf:
18:30 Tür auf, Zeit für etwas Networking
19:00 Gewinne, Gewinne, Gewinne …
19:15 Vortrag
danach gehts zum “Social Event” in die “Treskowstuben

Der Flyer:
Den Fyler können Sie unter folgender Adresse runterladen und ihn an Freunde, Bekannt, Kollegen oder andere Interessierte weitergeben.
http://www.dasralph.net/jug-bb/JUG-BB_Flyer_2008-06.pdf

Der Vortrag ist wie immer für Sie kostenlos.

Ralph Bergmann

  • Kommentare deaktiviert

JavaSE 6 für Mac OS X – vermutlich nur ein Irrtum

20. Dezember 2007 von Jan in Allgemein
Schlagwörter:,

auf den ADC-Seiten ist ein Diskimage verfügbar dass auf Java SE 6 schliessen lässt. Das darin enthaltene package ist es aber offenbar nicht. Was Apple damit bezweckt ist unklar. Java 6 wird lange erwartet für den Mac aber Apple hat bisher keinerlei Angaben gemacht wann oder gar ob überhaupt es verfügbar sein wird. Die Haltung von Steve Jobs zum Thema Java ist hinlänglich bekannt und ebenso inkompetent – er hält Java für nutzlos.  Warten wir es ab. Solange bis Apple zur Vernunft kommt muss man sich auf dieser Plattform mit einem virtualisierten Linux weiterhelfen – nach meiner Ansicht nicht die schlechteste Lösung. 
[update] Ist doch Java 6 drin funktioniert aber nur auf 64-Bit-Intel-Leopard-Maschienen. 

« vorherige Beiträge