MenuItem, StyledDocument remove

Status
Nicht offen für weitere Antworten.
K

kindderwinde

Gast
Hallo ... ich habe zwei Probleme mit einem Java-Programm

1.)
ich würde gerne das mouseclicked event einem MenuItem zuweisen. Wie mache ich das. Bei der MenuBar funktioniert das einwandfei über
Code:
private void jMenu1MouseClicked(java.awt.event.MouseEvent evt) {
    }
aber wenn ich das gleiche für mein MenuItem umschreibe funktioniert das nicht mehr, dann passiert einfach gar nichts.

2.)
In meinem Programm habe ich ein TextPane als StyledDocument. In diesem würde ich gerne einen String entfernen und einen anderen einfügen. Das einfügen an bestimmten Stellen ist auch kein Problem. Aber wenn ich bei doc.remove (Anfang, Ende) den Anfang mitten im Document wähle funktioniert das nicht. Bei Anfang = 0 funktioniert alles. Das Ende kann ich frei variieren.

Code:
public void vergleicheText (){
        
      StyledDocument doc = jTextPane1.getStyledDocument();
      
      String eintext = jTextPane1.getText();               // Text wird wieder eingelesen   
      vergleich = jTextField1.getText ();                    // Suchwort wird eingelesen 
      int Indexposition = 0;
      
      while (Indexposition < doc.getLength()){

      // Anfang- und Endposition des geuchten Wortes
      int Anfangsposition = eintext.indexOf(vergleich , Indexposition);
      int Endposition = Anfangsposition + vergleich.length();
      
        
      // Farbe und Background
      SimpleAttributeSet gelb = new SimpleAttributeSet();
      StyleConstants.setBackground(gelb, Color.YELLOW);    // Farbe des Highlights

      try{      
      doc.insertString(Anfangsposition, vergleich, gelb);  // fügt farbiges Wort ein
      doc.remove((Anfangsposition), Endposition);   
      } catch (BadLocationException e){}
      
      Indexposition = Endposition + vergleich.length();
      
      }
     }

Ich hoffe irgendwer kann mir Helfen
 

André Uhres

Top Contributor
1. Versuch's mit ActionListener und actionPerformed.
2.:
Code:
   public void vergleicheText(){
        StyledDocument doc = jTextPane1.getStyledDocument();
        vergleich = jTextField1.getText();                    // Suchwort wird eingelesen
        Element root = doc.getDefaultRootElement();
        int count = root.getElementCount();
        for (int row = 0; row < count; row++) {
            Element line = root.getElement(row);
            int lineStart = line.getStartOffset();
            int lineEnd = line.getEndOffset();
            String lineText;
            try {
                lineText = doc.getText(lineStart, lineEnd - lineStart);
                // Anfangposition des gesuchten Wortes
                int anfangsposition = lineText.indexOf(vergleich);
                if(anfangsposition < 0) continue;
                // Farbe und Background
                SimpleAttributeSet gelb = new SimpleAttributeSet();
                StyleConstants.setBackground(gelb, Color.YELLOW);    // Farbe des Highlights
                // fügt Highlight ein:
                doc.setCharacterAttributes(lineStart+anfangsposition, vergleich.length(), gelb, true);  
            } catch (BadLocationException ex) {
                ex.printStackTrace();
            }
        }
    }
 
K

kindderwinde

Gast
Hi ... er findet jetzt zwar alle Stellen, aber auch stellen im Wort. Wenn ich z.B. "ich" eingebe makiert er auch "nicht", also auch Wort im Wort. Gibt es da eine Möglichkeit das zu ändern? Oder kann ich das über den StringTokenizer laufen lassen?
 

André Uhres

Top Contributor
Dieses Beipiel zeigt, wie man nur ganze Wörter im Text findet.
Zudem findet es auch noch heraus, ob ein Wort mehrmals in derselben Zeile vorkommt:
Code:
import java.util.regex.*;
...
    public void vergleicheText(){
        StyledDocument doc = jTextPane1.getStyledDocument();
        vergleich = jTextField1.getText();                    // Suchwort wird eingelesen
        Element root = doc.getDefaultRootElement();
        int count = root.getElementCount();
        // Farbe und Background
        SimpleAttributeSet gelb = new SimpleAttributeSet();
        StyleConstants.setBackground(gelb, Color.YELLOW);    // Farbe des Highlights
        for (int row = 0; row < count; row++) {
            Element line = root.getElement(row);
            int lineStart = line.getStartOffset();
            int lineEnd = line.getEndOffset();
            String lineText;
            try {
                lineText = doc.getText(lineStart, lineEnd - lineStart);
                Pattern regex = Pattern.compile("\\b" + vergleich + "\\b");
                Matcher matcher = regex.matcher(lineText);
                while (matcher.find()) {
                    // fügt Highlight ein:
                    doc.setCharacterAttributes(lineStart+matcher.start(), vergleich.length(), gelb, true);
                }
            } catch (BadLocationException ex) {
                ex.printStackTrace();
            }
        }
    }
 
K

kindderwinde

Gast
Hallo ... jetz habe ich noch ein weiteres Problem. Ich wollte im makierten Text immer an die erste gefundene Stelle springen. Das klappt auch sehr gut, außer wenn das Wort sehr weit am Ende des Textes steht.
Code:
 public int vergleicheText(String vergleich, SimpleAttributeSet farbe){ 
        int i = 0;
        StyledDocument doc = jTextPane1.getStyledDocument(); 
        Element root = doc.getDefaultRootElement(); 
        int count = root.getElementCount();  
        for (int row = 0; row < count; row++) { 
            Element line = root.getElement(row); 
            int lineStart = line.getStartOffset(); 
            int lineEnd = line.getEndOffset(); 
            String lineText; 
            try { 
                lineText = doc.getText(lineStart, lineEnd - lineStart); 
                Pattern regex = Pattern.compile("\\b" + vergleich + "\\b"); 
                Matcher matcher = regex.matcher(lineText); 
                while (matcher.find()) {
                    v.add(lineStart);
                    // fügt Highlight ein: 
                    doc.setCharacterAttributes(lineStart+matcher.start(), vergleich.length(), farbe, true); 
                    i++;
                } 
            } catch (BadLocationException ex) { 
                ex.printStackTrace(); 
            } 
        }
  
    return i;    
    }
die gefundenen Stellen speicher ich in einem Vector v (sollte auch ein Vector odes etwas ähnliches sein, da ich auch jede gefundene Stelle zurückgreifen will)
Code:
Vector v = new Vector ();
Bis dahin tritt auch überhaupt kein Problem auf. Auf meiner Oberfläche habe ich einen Button der alle Felder löscht und den ausgegeben Text wieder auf den Anfangszustand zurück gibt (also eigentlich den ersten Text wieder ausgibt)
Jedoch wird dann der komplette Text farbig makiert ausgegeben
Code:
/ Button: Makierungen löschen
    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        vorbereitenOberflaeche ();
        jTextPane1.setText (" ");
        jTextPane1.setText (text);        
    }
Woran liegt das und was kann ich da machen?
 
K

kindderwinde

Gast
ach was ich noch vergessen habe.
Code:
jTextPane1.setCaretPosition(Integer.parseInt(String.valueOf(v.elementAt(0))));
damit springe ich im TextPane an die Stelle
 

André Uhres

Top Contributor
Du kannst mit doc.setCharacterAttributes(..) wieder alle Highlights durch normale Farbe ersetzen.
Den Caret könntest du zuerst ans Wortende setzen und dann mit SwingUtilities.invokeLater
an den Wortanfang. Dann müsste das ganze Wort sichtbar werden.

Es gibt übrigens auch noch die Möglichkeit mit dem HighlightPainter (statt setCharacterAttributes):
http://www.java-forum.org/de/viewtopic.php?p=186887#186887
 
K

kindderwinde

Gast
Also mit dem Carret habe ich gar keine Probleme. Das ganze Programm funktioniert ja auch sonlange, bis er an die letzten zwei Wörter des Textes kommt.
Wo füge ich denn
Code:
doc.setCharacterAttributes(0,text.length(), weiß, true);
ein. Wenn ich das mit in die Methode schreibe mach er mir am Ende wieder den ganzen Text weiß und rausziehen kann ich das nicht weil er dann entweder doc nicht findet oder jTextPane1. Ich würde auch wirklich gerne mein Programm verändern und keine neue Methode schreiben, sonst muss ich alles wieder ändern
 
K

kindderwinde

Gast
So, hab es geschafft. Hab einfach in einer anderen Methode ein weiteres StyledDocument eingefügt und darüber gelegt. Jetzt funktioniert das.

Aber eine letzte Frage hab ich noch. Hast du ne Ahnung wie man ein StyledDocument speichern kann. Eigentlich sollte es in einer txt-Datei gespeichert werden. Das speichern klappt auch, aber die farbigen Hinterlegungen gehen mir immer verloren.
 

André Uhres

Top Contributor
kindderwinde hat gesagt.:
..Hast du ne Ahnung wie man ein StyledDocument speichern kann..
Du kannst über einen ObjectOutputStream mit writeObject das Document in eine Datei schreiben.
Über einen ObjectInputStream kannst du mit readObject das Document wieder einlesen
und anschliessend mit setDocument an die JTextPane übergeben.
Code:
   private void save(File file) throws IOException{
        ObjectOutput ostrm = new ObjectOutputStream(new FileOutputStream(file));
        ostrm.writeObject(jTextPane1.getDocument());
        ostrm.close();
    }
    private void open(File file) throws IOException, ClassNotFoundException{
        ObjectInputStream istrm = new ObjectInputStream(new FileInputStream(file));
        Document doc = (Document) istrm.readObject();
        jTextPane1.setDocument(doc);
    }
In jedem JDK gibt's übrigens ein Beispiel (\demo\jfc\Stylepad).

Hier noch eine Möglichkeit, die write Methode "zu Fuß" anzupassen: http://www.java-forum.org/de/userfiles/user3690/SerializeTextDemo.java
Damit kann man ein Dokument, das mit Java 4 gespeichert wurde, auch noch mit Java 6 öffnen (und umgekehrt) :!:
readObject funktioniert in dem Fall nämlich nicht (UnsupportedClassVersionError)
 
K

kindderwinde

Gast
Hallo ...
Code:
try {
            BufferedWriter documentWriter;
            documentWriter = new BufferedWriter(new FileWriter (dateispeichern));
            jTextPane1.write(documentWriter);
            documentWriter.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
Also den Code habe ich im Forum gefunden. Das speichern funktioniert wirklich einwandfrei (also der Text wird auch gespeichert) nur leider gehen die farbigen Makierungen verlohren. Speicher die Datein schon extra als rtf-Datein
 

André Uhres

Top Contributor
"write" ist auch keine spezielle Methode von JTextPane, sondern eine allgemeine von JTextComponent.
API:
Stores the contents of the model into the given stream. By default this will store the model as plain text.
 
K

kindderwinde1985

Gast
Das es nicht geht weiß ich, aber wie kann ich das ändern?
 
K

kindderwinde1985

Gast
Hallo ... mein Problem ist nicht das ich die gespeicherte Datei wieder mit Java öffnen möchte, sondern in einem Programm wie Word oder Wordpad (also in einem ganz normales Textverarbeitungsprogramm)
Also die Methode save funktioniert, nur kann ich das ganze nicht in Word oder so ändern. Oder nehme ich vielleicht das falsche Dateinformat. Habe es jetzt mit rtf, doc und txt versucht, aber keins davon klappt und ich bekomme einen ganz tollen Text mit vielen Kästchen etc.
 

André Uhres

Top Contributor
Standard Java weiss imo nix von Word oder Wordpad. Da muss sicher eine spezielle library her.
Ich hatte mich noch nicht damit beschäftigt. Kannst ja mal in der Richtung suchen.
EDIT: "poi apache" scheint sowas anzubieten :wink:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
padde479 MenuItem MouseEvent/-Listener AWT, Swing, JavaFX & SWT 5
Shallty JavaFX MenuItem (Info) Icon ändern AWT, Swing, JavaFX & SWT 7
Wurstsemmel SWT MenuItem dynamisch hinzufügen AWT, Swing, JavaFX & SWT 2
D Icon in Menuitem einfügen AWT, Swing, JavaFX & SWT 8
K Panel verdeckt MenuItem AWT, Swing, JavaFX & SWT 5
S JavaFX MenuItem in hoher (height größer) MenuBar vertikal zentrieren AWT, Swing, JavaFX & SWT 4
E JavaFX JavaFX - MenuItem erstellen aus dem Inhalt einer HashMap AWT, Swing, JavaFX & SWT 1
D JavaFX - MenuItem mit Icon AWT, Swing, JavaFX & SWT 1
H Javafx - Menuitem - Icon AWT, Swing, JavaFX & SWT 4
M JavaFX MenuItem Hintergrundfarbe in CSS AWT, Swing, JavaFX & SWT 4
C Swing MenuItem feuert Action nur wenn disabled AWT, Swing, JavaFX & SWT 2
P JTabbedPane per Menuitem erstellen AWT, Swing, JavaFX & SWT 20
S LayoutManager Card des CardLayout mit MenuItem auswaehlen AWT, Swing, JavaFX & SWT 9
F Zeichen per Menuitem funktioniert nicht AWT, Swing, JavaFX & SWT 2
lumo SWT MenuItem + Selection/Listener AWT, Swing, JavaFX & SWT 2
D Icon in MenuItem AWT, Swing, JavaFX & SWT 3
B Actionlistener für MenuItem AWT, Swing, JavaFX & SWT 19
G Swing ->mainpanel wechseln bei Klick auf MenuItem (NetB.6 AWT, Swing, JavaFX & SWT 3
G Referenz über MenuItem aus ActionListener auf das Objekt AWT, Swing, JavaFX & SWT 8
K MenuItem mit Unterpunkten AWT, Swing, JavaFX & SWT 3
S Mouselistener erzeugt kein Event in einem Menuitem AWT, Swing, JavaFX & SWT 2
K MenuItem: Farbe bei Selektion AWT, Swing, JavaFX & SWT 4
T AWT: MenuItem mit Symbol AWT, Swing, JavaFX & SWT 5
U KeyListener vs menuitem.setActionCommand() AWT, Swing, JavaFX & SWT 2
M Strings im JTextPane vergleichen und mit StyledDocument formatieren AWT, Swing, JavaFX & SWT 3
D StyledDocument Problem AWT, Swing, JavaFX & SWT 2
T Swing xml in JTextPane mit EditorKit, StyledDocument & co. AWT, Swing, JavaFX & SWT 3
M Swing eigenes StyledDocument AWT, Swing, JavaFX & SWT 2
D StyledDocument dauerhaft speichern AWT, Swing, JavaFX & SWT 3
G JComboBox mit StyledDocument AWT, Swing, JavaFX & SWT 3
P JTextPane und StyledDocument AWT, Swing, JavaFX & SWT 5
F Problem mit geänderten AttributSet beim StyledDocument AWT, Swing, JavaFX & SWT 4
U JTextPane, StyledDocument & UndoManager AWT, Swing, JavaFX & SWT 5
C StyledDocument: Zeilen auslesen AWT, Swing, JavaFX & SWT 2
A remove(Component) funktioniert nicht; JTable AWT, Swing, JavaFX & SWT 4
K Swing remove(JPanel) funktioniert nicht AWT, Swing, JavaFX & SWT 5
V Swing remove(Component) blockiert Thread sehr lange. AWT, Swing, JavaFX & SWT 6
C Problem mit remove(Component comp) AWT, Swing, JavaFX & SWT 23
J remove() components bei event von JComboBox AWT, Swing, JavaFX & SWT 2
G Remove Panels von JFrame AWT, Swing, JavaFX & SWT 5
N JTable remove row AWT, Swing, JavaFX & SWT 6
P Table Layout remove()? AWT, Swing, JavaFX & SWT 2
S Verschwindende JComboBox (Problem mit Remove?) AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben