Zeilenumbruch bei JEditorPane verhindern

Vincentius

Erfahrenes Mitglied
Hallo,

ich bin gerade auf der Suche nach einer Möglichkeit, ein JEditorPane einzeilig zu machen (wie ein JTextField).

Der Grund ist der, dass ich ein Textfeld brauche, das eine mehrfarbige Markierung erlaubt, (ähnlich wie StyledText bei SWT). Mit einem einfachen JTextField ist es leider nicht möglich (wenn doch, wäre das natürlich noch besser). So bin ich gezwungen, auf die Funktionalität von JEditorPane bzw. JTextPane zurückzugreifen. Dort kann man nämlich verschiedene Styles definieren, die dann die Textabschnitte unterschiedlich gestalten (Schriftart oder Größe, Hintergrund- und Vordergrundfarben usw). Soweit sogut, die Komponente wird aber als eine Eingabezeile verwendet, und muss sich daher, wie ein JTextField verhalten. Das heißt, das der Zeilenumbruch verhindert werden muss (auch wenn ich z.B. einen mehrzeiligen Text reinkopiere).

Ich habe zwar in verschiedenen Foren mehrere Lösungsansätze gefunden, die leider nicht wirklich was bringen. Hat jemand von Euch vielleicht sowas in der Art bereits gemacht?

Für Vorschläge wäre ich dankbar.
Gruß
Vincent
 
Nein, mit einem JFormatedTextField kannst Du die Werte, die eingegeben werden, validieren (was eher das Model betrifft), hast aber keine Möglichkeit den Text zu gestalten. JFormatedTextField erbt von dem JTextField und das wird als non-styled text component bezeichnet.
 
Hallo!

Vielleicht wär ja das hier ein Ansatz für das gewünschte:
Code:
/*
 * Created on 15.10.2004
 */
package de.tutorials;

import java.awt.Color;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.FocusManager;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;

/**
 * @author Darimont
 *  
 */
public class Test15 extends JFrame {
    private static final long serialVersionUID = 714992632557681449L;

    private JTextPane jtp;

    private JScrollPane jsp;

    public Test15() {
        super("Test15");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        SimpleAttributeSet sas = new SimpleAttributeSet();

        jtp = new JTextPane() {
            public boolean getScrollableTracksViewportWidth() {
                return false;
            }
        };

        jtp.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent evt) {
                int kc = evt.getKeyCode();
                switch (kc) {
                case KeyEvent.VK_ENTER:
                    evt.consume();
                    FocusManager.getCurrentManager().focusNextComponent();
                    System.out.println("Enter was Pressed...");
                    break;
                default:
                    ;
                }
            }
        });

        try {
            Document doc = jtp.getDocument();
            StyleConstants.setForeground(sas, Color.RED);
            doc.insertString(0, "red", sas);
            StyleConstants.setForeground(sas, Color.BLUE);
            doc.insertString(doc.getLength(), "blue", sas);
        } catch (BadLocationException e) {
            e.printStackTrace();
        }

        jsp = new JScrollPane(jtp, JScrollPane.VERTICAL_SCROLLBAR_NEVER,
                JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        ;

        getContentPane().add(jsp);

        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        new Test15();
    }
}

HTH
Gruß Tom
 
OK, das löst schon mal ein Teil des Problems: die Eingabe von Enter-Taste wird ignoriert. Das verhindert aber nicht das Einfügen von mehrzeiligem Text per Copy&Paste. Ich glaube, ich muss an die Methode ran, wo der Text eingefügt wird. Dort könnte man dann alle "\n"s durch " " ersetzen... Ich muss nur rauskriegen, welche Methode beim Einfügen aus der Zwischenablage aufgerufen wird.

Aber danke schon mal für den Tipp.
 
Dann versuchs doch mal damit:

Code:
/*
 * Created on 15.10.2004
 */
package de.tutorials;

import java.awt.Color;
import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.IOException;

import javax.swing.FocusManager;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.Document;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;

/**
 * @author Darimont
 *  
 */
public class Test15 extends JFrame {
    private static final long serialVersionUID = 714992632557681449L;

    private JTextPane jtp;

    private JScrollPane jsp;

    public Test15() {
        super("Test15");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        SimpleAttributeSet sas = new SimpleAttributeSet();

        jtp = new JTextPane() {
            public boolean getScrollableTracksViewportWidth() {
                return false;
            }
        };

        jtp.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent evt) {
                int kc = evt.getKeyCode();
                switch (kc) {
                case KeyEvent.VK_ENTER:
                    evt.consume();
                    FocusManager.getCurrentManager().focusNextComponent();
                    System.out.println("Enter was Pressed...");
                    break;
                case KeyEvent.VK_V:
                    if (evt.isControlDown()) {
                        Transferable t = Toolkit.getDefaultToolkit()
                                .getSystemClipboard().getContents(this);
                        try {
                            String s = (String) t
                                    .getTransferData(DataFlavor.stringFlavor);
                            System.out.println();
                            jtp.getDocument().insertString(
                                    jtp.getCaret().getDot(),
                                    s.replaceAll("\\\n", ""), null);

                        } catch (UnsupportedFlavorException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        } catch (BadLocationException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                default:
                    ;
                }
            }
        });

        try {
            Document doc = new DefaultStyledDocument();
            jtp.setDocument(doc);
            StyleConstants.setForeground(sas, Color.RED);
            doc.insertString(0, "red", sas);
            StyleConstants.setForeground(sas, Color.BLUE);
            doc.insertString(doc.getLength(), "blue", sas);
        } catch (BadLocationException e) {
            e.printStackTrace();
        }

        jsp = new JScrollPane(jtp, JScrollPane.VERTICAL_SCROLLBAR_NEVER,
                JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        ;

        getContentPane().add(jsp);

        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        new Test15();
    }
}

Gruß Tom
 
Ja, jetzt ist es fast vollständig gelöst (es fehlte noch evt.consume(); im zweiten case Block, deswegen wurde der Text doppelt eingefügt).

Danke, damit hat sich das Problem erledigt. :)
 
Zurück