Text mit Notizen versehen können

Status
Nicht offen für weitere Antworten.

Spot84

Aktives Mitglied
Hallo!
ich würde gerne Text einlesen und an diesen Notizen anhängen können. Ich stell mir das so vor, das der Text markiert werden kann, man dann einen Rechtsklick macht und "Anmerkung hinzufügen" auswählen kann. Unter dem Text soll bei der Stelle wo die Anmerkung(also der Text markiert wurde) ein Strich gezeichnet werden. Unter dem Strich wiederum soll dann die Notiz stehen.

Das ganze soll mit Swing umgesetzt werden. Ich bin mir jetzt allerdings nicht sicher ob das mit dem markieren so funktioniert. Also ob man das was man markiert hat, auch einlesen kann. Könnt ihr mir villeicht sagen ob meine Idee so funktioniert und wenn ja welche Swingelemente ich nutzen solte?

Gruß spot

PS:Eigentlich will ich nicht wirklich Anmerkungen an einen Text machen, aber jetzt genau zu beschreiben wieso ich das brauche wäre sehr aufwändig. Daher hab ich es auf dieses Problem reduziert.
 

Ebenius

Top Contributor
So in der Art kann man das machen. Ist aber Sport am späten Abend; daher keine Garantie, dass das so in Ordnung ist.

Anhang anzeigen 930

In Kurzform; eine eigene LabelView die die Text-Bereiche mit Notizen hervorhebt, eine eigene ViewFactory die die eigene LabelView erzeugt (anstatt javax.swing.text.LabelView), ein eigenes EditorKit das die eigene ViewFactory zurück liefert, und dann noch ein Eintrag "noteText" im Character-AttributSet des Dokuments.

Und hier der Code; einfach ein Stück Text markieren und auf den Button drücken. Textbereiche mit Notiz sind rot unterstrichelt, die Notiz erscheint als ToolTip:
Java:
/* (@)TextNoteFun.java */

/* Copyright 2009 Sebastian Haufe

 * Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       [url]http://www.apache.org/licenses/LICENSE-2.0[/url]

 * Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License. */

package com.ebenius;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.util.Random;

import javax.swing.*;
import javax.swing.text.*;

public class TextNoteFun {

  // -------------------------------------------------------------------------
  // Editor kit, providing the view factory
  // -------------------------------------------------------------------------

  static class NoteSupportingEditorKit extends StyledEditorKit {

    private static final long serialVersionUID = 1L;
    private final ViewFactory viewFactory = new NoteMarkupViewFactory();

    @Override
    public ViewFactory getViewFactory() {
      return viewFactory;
    }
  }

  // -------------------------------------------------------------------------
  // Label view, marking up text with notes
  // -------------------------------------------------------------------------

  static class NoteMarkupLabelView extends LabelView {

    private static final Stroke stroke =
          new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1,
                new float[] { 5.f, 2.f }, 2.5f);

    NoteMarkupLabelView(Element elem) {
      super(elem);
    }

    private boolean hasNote() {
      return null != getAttributes().getAttribute("textNote");
    }

    @Override
    public String getToolTipText(float x, float y, Shape allocation) {
      final Object text = getAttributes().getAttribute("textNote");
      return text == null ? null : text.toString();
    }

    @Override
    public void paint(Graphics g, Shape allocation) {
      super.paint(g, allocation);
      if (hasNote()) {
        final Stroke oldStroke = ((Graphics2D) g).getStroke();
        try {
          ((Graphics2D) g).setStroke(stroke);
          g.setColor(Color.RED);
          final Rectangle b = allocation.getBounds();
          final int y = b.y + b.height - 2;
          g.drawLine(b.x, y, b.x + b.width - 1, y);
        } finally {
          ((Graphics2D) g).setStroke(oldStroke);
        }
      }
    }
  }

  // -------------------------------------------------------------------------
  // View Factory creating my own views instead of standard label views
  // -------------------------------------------------------------------------

  static class NoteMarkupViewFactory implements ViewFactory {

    // The code has been copied from StyledEditorKit.StyledViewFactory, only
    // LabelView has been replaced by NoteMarkupLabelView
    public View create(Element elem) {
      String kind = elem.getName();
      if (kind != null) {
        if (kind.equals(AbstractDocument.ContentElementName)) {
          return new NoteMarkupLabelView(elem);
        } else if (kind.equals(AbstractDocument.ParagraphElementName)) {
          return new ParagraphView(elem);
        } else if (kind.equals(AbstractDocument.SectionElementName)) {
          return new BoxView(elem, View.Y_AXIS);
        } else if (kind.equals(StyleConstants.ComponentElementName)) {
          return new ComponentView(elem);
        } else if (kind.equals(StyleConstants.IconElementName)) {
          return new IconView(elem);
        }
      }

      // default to text display
      return new NoteMarkupLabelView(elem);
    }
  }

  // -------------------------------------------------------------------------
  // Program Entry Point
  // -------------------------------------------------------------------------

  /**
   * Test main method.
   * 
   * @param args ignored
   */
  public static void main(String[] args) {

    // create a document with random content
    final StyledDocument document = new DefaultStyledDocument();
    try {
      document.insertString(0, createRandomString(1024, 78), null);
    } catch (BadLocationException ex) {
      // location 0 is not bad!
    }

    // create a text pane with my editor kit, document, size and tool tip
    final JTextPane textPane = new JTextPane();
    textPane.setEditorKit(new NoteSupportingEditorKit());

    textPane.setStyledDocument(document);
    textPane.setPreferredSize(new Dimension(400, 400));
    ToolTipManager.sharedInstance().registerComponent(textPane);

    // Action to add a note to the selected text
    final AbstractAction addNoteAction = new AbstractAction("Add Note") {

      private static final long serialVersionUID = 1L;

      public void actionPerformed(ActionEvent e) {
        final int selStart = textPane.getSelectionStart();
        final int selEnd = textPane.getSelectionEnd();
        if (selStart < selEnd) {
          final String noteText =
                JOptionPane.showInputDialog("Type your note:");
          if (noteText != null) {
            final SimpleAttributeSet aset = new SimpleAttributeSet();
            aset.addAttribute("textNote", noteText);
            document.setCharacterAttributes(selStart, selEnd - selStart,
                  aset, true);
          }
        }
      }
    };

    // standard GUI template
    final JPanel bPanel = new JPanel(new FlowLayout(FlowLayout.TRAILING));
    bPanel.add(new JButton(addNoteAction));

    final JPanel contentPane = new JPanel(new BorderLayout(6, 6));
    contentPane.add(new JScrollPane(textPane));
    contentPane.add(bPanel, BorderLayout.SOUTH);

    final JFrame f = new JFrame("Test Frame: TextNoteFun"); //$NON-NLS-1$
    f.setContentPane(contentPane);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.setVisible(true);
  }

  // -------------------------------------------------------------------------
  // Create random string
  // -------------------------------------------------------------------------

  private static final char[] RANDOM_ALPHABET =
        { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c',
          'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
          'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C',
          'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
          'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ' };

  private static String createRandomString(int len, int maxSpaceDistance) {
    final char[] chars = new char[len];
    final Random rnd = new Random();
    int spaceDistance = 0;
    for (int i = 0; i < chars.length; i++) {
      final char c =
            spaceDistance == maxSpaceDistance ? ' ' : RANDOM_ALPHABET[rnd
                  .nextInt(RANDOM_ALPHABET.length)];
      if (c == ' ') {
        spaceDistance = 0;
      } else {
        spaceDistance++;
      }
      chars[i] = c;
    }
    return new String(chars);
  }
}
Das ganze kann man natürlich noch ganz anders machen, zum Beispiel mit einem Icon vor dem Textbereich der die Notiz hat. Aber dafür bin ich zu faul.

Happy Hacking!
Ebenius
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P JTextfield Text durch Keylistener verändern AWT, Swing, JavaFX & SWT 4
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
C JToggleButton disabled Text Color AWT, Swing, JavaFX & SWT 11
H JavaFX Label.Text mit bind an DoubleProperty binden AWT, Swing, JavaFX & SWT 3
H JList.setEnabled(false) - Text soll nicht grau sein AWT, Swing, JavaFX & SWT 2
FrittenFritze Text in Flying Saucer selectierbar machen AWT, Swing, JavaFX & SWT 0
Mojo7310 Ändern von Text in JLabel mit einem Button AWT, Swing, JavaFX & SWT 11
raeuchertofu Text von JTextfield und JLabel ändern AWT, Swing, JavaFX & SWT 2
H JavaFX Gedrehter Text auf Canvas (Positionierung) AWT, Swing, JavaFX & SWT 6
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
I Rich Text drucken AWT, Swing, JavaFX & SWT 0
B Text mit Absatz + OK-Button, der Fenster wieder schließt AWT, Swing, JavaFX & SWT 7
R Text vom Jlabel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
N Promt Text der Combobox AWT, Swing, JavaFX & SWT 0
M JavaFX javaFX Label-Text wird nicht gesetzt AWT, Swing, JavaFX & SWT 3
sascha-sphw JavaFX ListCell höhe verändert sich beim ändern der Text-Farbe AWT, Swing, JavaFX & SWT 14
N In Textdatei Text anfügen per GUI AWT, Swing, JavaFX & SWT 3
N Textdatei GUI, Text in Textarea anzeigen mehrere Zeilen AWT, Swing, JavaFX & SWT 1
R Swing JTextField nicht-kopierbarer Text AWT, Swing, JavaFX & SWT 1
S Text-Info in der Taskbar anzeigen AWT, Swing, JavaFX & SWT 15
E Warum wird Text im JTextArea erst am Programmende angezeigt ? AWT, Swing, JavaFX & SWT 1
S Swing JLabel Text mit der Zeit ändern AWT, Swing, JavaFX & SWT 1
Hatsi09 JButton text layout AWT, Swing, JavaFX & SWT 9
B Text im Tetfeld in einer TableView darstellen AWT, Swing, JavaFX & SWT 20
C JCheckBox disabled text color AWT, Swing, JavaFX & SWT 9
ralfb1105 JavaFX Wie Text Label in neuem Window von Main Stage setzen? AWT, Swing, JavaFX & SWT 6
CptK Swing Button: ImageIcon unter den Text AWT, Swing, JavaFX & SWT 4
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
L JavaFX TableView kein content text ändern AWT, Swing, JavaFX & SWT 2
L JavaFX Anderer Text, wenn kein Platz ist. AWT, Swing, JavaFX & SWT 1
K JavaFX TextInputDialog Button Text ändern AWT, Swing, JavaFX & SWT 1
S 2D-Grafik affine Transformation für Text-Shape AWT, Swing, JavaFX & SWT 0
B JavaFX Text wird nicht angezeigt, kein Fehler AWT, Swing, JavaFX & SWT 2
J Text in ein Textfeld eingeben und speichern AWT, Swing, JavaFX & SWT 27
xYurisha JLabel Text einer geöffneten Gui über eine andere Klasse ändern! AWT, Swing, JavaFX & SWT 3
C Swing Spinner als TableCellEditor - Text zu klein AWT, Swing, JavaFX & SWT 2
H JavaFX - Button und Text - Falsche Darstellung AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing Extern den Text eines nicht fetsgelegten Buttons bekommen. AWT, Swing, JavaFX & SWT 12
zhermann FX Label text wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 12
I JavaFX formatierter Text in PDF speichern AWT, Swing, JavaFX & SWT 4
T JavaFX Text des ProgressIndicators ändern AWT, Swing, JavaFX & SWT 2
E Swing Text verschwindet AWT, Swing, JavaFX & SWT 1
G JavaFX - Während AudioRecording keine Text eingabe TextField möglich AWT, Swing, JavaFX & SWT 6
G Rectangle Breite richtet such an die Breite vom Text AWT, Swing, JavaFX & SWT 1
Sanni94 JavaFX Kann man eine Grafik in einen Text einbinden? AWT, Swing, JavaFX & SWT 2
S JTextArea Text nach oben wandern lassen AWT, Swing, JavaFX & SWT 7
F Icons neben Text in Listview setzen AWT, Swing, JavaFX & SWT 2
K Rich Text FX von TomasMikula AWT, Swing, JavaFX & SWT 0
M Text in einem Label fett setzen AWT, Swing, JavaFX & SWT 4
S JAVAFX HTMLEditor wrap text AWT, Swing, JavaFX & SWT 1
J JavaFX Translation Text/Label AWT, Swing, JavaFX & SWT 2
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1
A JavaFX HTMLEditor in Text umwandeln AWT, Swing, JavaFX & SWT 2
M Swing jButton Text verschwindet AWT, Swing, JavaFX & SWT 2
J JavaFX Bestimmte Zellen im TableView ändern (Farbe und Text) AWT, Swing, JavaFX & SWT 1
2 JLabel - setText ändert den Text nicht AWT, Swing, JavaFX & SWT 4
B Jlabel Text von anderen Klasse aus ändern AWT, Swing, JavaFX & SWT 9
stylegangsta JLabel anzuzeigenden Text zentrieren AWT, Swing, JavaFX & SWT 9
javampir Java FX Text verschwindet nicht AWT, Swing, JavaFX & SWT 9
Tausendsassa Text changed event handler jTextField AWT, Swing, JavaFX & SWT 3
Tom299 JavaFX Text oder Label benutzen AWT, Swing, JavaFX & SWT 4
E To get a color text on the TextArea AWT, Swing, JavaFX & SWT 4
E To get color text on the TextArea AWT, Swing, JavaFX & SWT 5
M Swing JTextPane, Bilder und Text-flow AWT, Swing, JavaFX & SWT 2
Z AWT JLabel setzt kein neuen Text AWT, Swing, JavaFX & SWT 6
D Event Handling Aus einer anderen Klasse heraus einen Text des JLabels ändern. AWT, Swing, JavaFX & SWT 12
T JavaFX Editable Combobox Text-Selektierung nach Trigger AWT, Swing, JavaFX & SWT 4
S JLabel-Text in Methode setzen? AWT, Swing, JavaFX & SWT 2
F JPanel "zeichnet" keinen Text AWT, Swing, JavaFX & SWT 14
U WYSIWYG Text-Editor für JFrames AWT, Swing, JavaFX & SWT 8
C Button Text in JList neue Zeile AWT, Swing, JavaFX & SWT 6
T MausClick soll TExt ändern AWT, Swing, JavaFX & SWT 6
J Text bei Eingabe löschen AWT, Swing, JavaFX & SWT 5
A SWT Auto completion in text box AWT, Swing, JavaFX & SWT 5
C Geloest: JTextfield: Titel automatisch entfernen, sobald Text eingegeben wird AWT, Swing, JavaFX & SWT 1
I Text zur Linie zeichnen AWT, Swing, JavaFX & SWT 1
J JavaFX JavaFX Probleme bei der Anzeige von Text AWT, Swing, JavaFX & SWT 18
X AWT Text der mit Graphics "drawString(...)" geschreiben wurde wieder löschen. AWT, Swing, JavaFX & SWT 6
O Swing Text aus Textfield auslesen AWT, Swing, JavaFX & SWT 8
B Text auf Display ausgeben [LWJGL] AWT, Swing, JavaFX & SWT 2
G Text im textfeld in einem Editor anzeigen AWT, Swing, JavaFX & SWT 18
S TextArea get Selected row(Text) AWT, Swing, JavaFX & SWT 6
A Radio Buttons sollen den Text der text Area bestimmen AWT, Swing, JavaFX & SWT 9
BRoll JButton Text nicht ausblenden ("...") AWT, Swing, JavaFX & SWT 2
J LayoutManager Text Spielerein GUI AWT, Swing, JavaFX & SWT 2
H Javafx - Styled Text AWT, Swing, JavaFX & SWT 5
M Text Area 1. Zeile oben AWT, Swing, JavaFX & SWT 4
A Swing Focus der Radio Buttons + text bleibt gleich und gleichzeitige ausgabe zweier Objekte in 1. Fenster AWT, Swing, JavaFX & SWT 3
R JavaFX Automatischer Zeilenumbruch in Text AWT, Swing, JavaFX & SWT 13
P JList/JScroolPane Text verschieben und text wrappen AWT, Swing, JavaFX & SWT 3
F Dialog mit Titel, Text und Ok Button AWT, Swing, JavaFX & SWT 2
T Swing HTML Text aus JLabel ohne "HTML-Tags" in String einlesen AWT, Swing, JavaFX & SWT 5
TheJavaKid DocumentListener soll Text in JTextField ändern AWT, Swing, JavaFX & SWT 4
K JEditorPane Text einfügen AWT, Swing, JavaFX & SWT 4
A Text (String) zu einer Box hinzufügen AWT, Swing, JavaFX & SWT 16
B SWT Text - zeilenumbruch AWT, Swing, JavaFX & SWT 2
TheWhiteShadow Swing Document Text Position in Pixel AWT, Swing, JavaFX & SWT 2
J Swing Text kürzendes JLabel AWT, Swing, JavaFX & SWT 12
J Swing TextArea mit nicht-editierbarem Text AWT, Swing, JavaFX & SWT 7
P Text in JPanel hinzufügen AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben