Swing JEditorPane in Kombination mit JScrollPane

pixelGaming

Mitglied
Hallo,

ich habe das Problem, dass wenn ich ein großen Text in mein JEditorPane über setText() lade, fügt er zwar den ganzen Text hinzu, ich kann aber nicht Scrollen. Das JEditorPane sollte nicht editierbar sein sprich .setEditable(false); , da ich Links mit verarbeite.

Testweiste habe ich es auf true gesetzt und wenn ich nur eine kleine Änderung vornehme, zeigt er mir die Scrollbar wie gewünscht an. Ich habe schon ausprobiert, das JPanel, die ganze GUI und das JEditorPane einzeln zu refreshen etc... Das hat leider nicht geklappt.

Im Internet finde ich auch nichts gescheites, dass mir weiterhilft.

Hat dazu jemand eine Idee, die ich noch ausprobieren kann ?
 
Hallo.

Java:
JEditorPane pane= new JEditorPane();
JScrollPane scrollPane = new JScrollPane(pane);
add(scrollPane);
textArea.setText(
        "Lorem ipsum dolor sit amet, \n consetetur sadipscing \n elitr, sed diam nonumy eirmod tempor invidunt \n  ut labore et dolore magna aliquyam erat, \n sed diam voluptua. At vero eos et accusam et \n justo duo dolores et ea rebum. \n Stet clita kasd gubergren, \n no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.");
pane.setEditable(false);

Grüße
 
Tut mir leid, ich hatte das Wochenende keine Zeit, um mich mit diesem Problem auseinander zu setzen.

@truesoul: Ja diese Lösung habe ich ja auch schon andersweitig im Netz gefunden und implementiert. Das löst allerdings nicht mein Problem. Ich nutze auch HTML-Tags, da ich ein Link einfügen muss wie oben schon einmal erwähnt.

Java:
// SouthPanel
        searchDisplayTextPane = new KnowledgeBaseEditorPane();
        searchDisplayTextPane.setMinimumSize(new Dimension(GUIConfig.TEXTPANELWIDTH, GUIConfig.TEXTPANELHEIGHT));
        searchDisplayTextPane.setMaximumSize(new Dimension(GUIConfig.TEXTPANELWIDTH, GUIConfig.TEXTPANELHEIGHT));
        searchDisplayTextPane.setPreferredSize(new Dimension(GUIConfig.TEXTPANELWIDTH, GUIConfig.TEXTPANELHEIGHT));
        searchDisplayTextPane.addHyperlinkListener(new KnowledgeBaseHyperlinkListener());
        searchDisplayScrollPane = new JScrollPane(searchDisplayTextPane, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        searchDisplayTextPane.setEditable(false);

Der Text wird dann an dieser Stelle hinzugefügt.

Java:
@Override
   public void actionPerformed(ActionEvent e) {
       gui = GUI.getGui();
       problemTxt = gui.getTextSearchProblemTexField();
       if(problemTxt.equals(" ") || problemTxt.equalsIgnoreCase(KeyWords.ENTER_PROBLEM)){
           try {
               gui.setSearchDisplayTextPane(ExcelInterface.search(
                       gui.getSearchCategoryComboBoxSelectedName(),
                       gui.getSearchSubcategoryComboBoxSelectedName()));
               
               
               
//               gui.getSearchDisplayScrollPane().revalidate();
//               gui.getSearchDisplayScrollPane().repaint();
           }catch(IOException e1) {
               e1.printStackTrace();
           }
       }else {
           try {
               gui.setSearchDisplayTextPane(ExcelInterface.search(
                       gui.getSearchCategoryComboBoxSelectedName(),
                       gui.getSearchSubcategoryComboBoxSelectedName(),
                       problemTxt));
               
               
               
//               gui.getSearchDisplayScrollPane().revalidate();
//               gui.getSearchDisplayScrollPane().repaint();
           }catch(IOException e1) {
               e1.printStackTrace();
           }
       }
 
um html code anzeigen zu können musst du den Contentype setzten.
Java:
JEditorPane editorPane = new JEditorPane();
JScrollPane scrollpane = new JScrollPane(editorPane);
editorPane.setContentType("text/html"); // CONTENTTYPE SETZEN
editorPane.setEditable(false);

>> edit: bild und datei mit html tags hinzu
 

Anhänge

  • Unbenannt.JPG
    Unbenannt.JPG
    43,2 KB · Aufrufe: 37
  • data.txt
    data.txt
    608 Bytes · Aufrufe: 3
Zuletzt bearbeitet:
Java:
public class KnowledgeBaseEditorPane extends JEditorPane{

    public KnowledgeBaseEditorPane() {
    }
  
    public void addText(String txt) {

    }

    public void setFormatText(Map<String, HTMLFormat> map) {
        setText(HTMLFormatMethods.convertToString(map));
    }

Ich hab diese Klasse mir erstellt, weil ich anfangs mit diesen Document's gearbetiet habe, das ging dann aber nicht. Die Klasse hab ich trotzdem weiter behalten.
 
Also ich denk der Bug, den ich noch drin habe kommt durch diese ganze Sache. Wenn ich auf ein andere Panel klicke verschwindet das das JEditorPane vergrößert sich auf die ganze Fläche des Frames und die Scrollbar erscheint. Klick ich nochmal auf die gleiche Stelle erscheint das andere Panel wieder. Die Scrollbar bleibt. Sozusagen wäre es dann richtig dargestellt. Nur das kann man nicht so lassen 😀. Das sollte schon direkt in richtiger Form dargestellt werden.
 
Java:
    private void initialSearchPanel(JPanel panel) {
        panel.setLayout(new BorderLayout());
       
        // CenterPanel
        JPanel center = new JPanel();
        center.setLayout(new GridLayout(3, 3));

        // Problem Label & TextField
        JLabel problemLabel = new JLabel("Problem:");
        center.add(problemLabel);
        searchProblemTextField = new JTextField("Please enter a problem ...", 20);
        searchProblemTextField.addFocusListener(new SearchFocusListener());
        center.add(searchProblemTextField);

        // Category Label & ComboBox
        JLabel categoryLabel = new JLabel("Category:");
        center.add(categoryLabel);
        searchCategoryVector = fillVector("Category", 0); // Insert all Categories which registered in the Excel-Sheet
        searchCategoryComboBox = new JComboBox<String>(searchCategoryVector);
        searchCategoryComboBox.addItemListener(new SeachComboBoxItemListener());
        center.add(searchCategoryComboBox);

        // Subcategory Label & ComboBox
        JLabel subcategoryLabel = new JLabel("Subcategory:");
        center.add(subcategoryLabel);
        searchSubcategoryVector = fillVector("Subcategory", 1);
        searchSubcategoryComboBox = new JComboBox<String>(searchSubcategoryVector);
        center.add(searchSubcategoryComboBox);

        // EastPanel
        JButton searchButton = new JButton("Search");
        searchButton.addActionListener(new SearchActionListener());

        // SouthPanel
//        searchDisplayTextPane = new JEditorPane();
        searchDisplayTextPane = new KnowledgeBaseEditorPane();
        searchDisplayTextPane.setMinimumSize(new Dimension(GUIConfig.TEXTPANELWIDTH, GUIConfig.TEXTPANELHEIGHT));
        searchDisplayTextPane.setMaximumSize(new Dimension(GUIConfig.TEXTPANELWIDTH, GUIConfig.TEXTPANELHEIGHT));
        searchDisplayTextPane.setPreferredSize(new Dimension(GUIConfig.TEXTPANELWIDTH, GUIConfig.TEXTPANELHEIGHT));
        searchDisplayTextPane.addHyperlinkListener(new KnowledgeBaseHyperlinkListener());
        searchDisplayTextPane.setContentType("text/html");
        searchDisplayScrollPane = new JScrollPane(searchDisplayTextPane);
        searchDisplayTextPane.setEditable(false);
        // --------------
        panel.add(center, BorderLayout.CENTER);
        panel.add(searchButton, BorderLayout.EAST);
        panel.add(searchDisplayTextPane, BorderLayout.SOUTH);
    }
 
wann setzt du das JFrame auf
Code:
setVisible(true);
?

wenn du das setVisible VOR dem adden der Compontens setzt dann kann so ein Verhalten auftreten...
also das setVisible IMMER zum Schluss setzten...
sonst würde mit auch nichts mehr einfallen...
 
Java:
public static void main(String[] args) {
        GUI frame = new GUI();
        frame.setTitle("KnowledgeBase");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setResizable(false);
        frame.setVisible(true);
    }

Na das setzt ich ganz zum Schluss auf true 😛
So ein bisschen kann ich ja doch schon Java-Programmieren. Ich find halt euch den Fehler nicht leider.
Ich bedanke mich trotzdem für deinen Einsatz =)
 
Ich sagte ein bisschen =D So hab ich es mal gesehen und selber so angeeignet. Du hast aber natürlich Recht. ^^
Hat mich noch nie jemand darauf hingewiesen. Danke ^^
 
Also in dieser Klasse füge ich dem EditorPane noch ein StyleSheet hinzu.

Java:
private void addStyleSheet() {
        kit = new HTMLEditorKit();
        kit.setStyleSheet(new KnowledgeBaseStyleSheet());
       
        searchDisplayTextPane.setEditorKit(kit);
        insertDisplayTextPane.setEditorKit(kit);
    }

Java:
public class KnowledgeBaseStyleSheet extends StyleSheet {

    public KnowledgeBaseStyleSheet() {
        super();
        addRule("h1 {    font-size: 14 px; "
                + "        text-decoration: underline;"
                + "}");
    }
   
}
 
Also in dieser Klasse füge ich dem EditorPane noch ein StyleSheet hinzu.

Java:
private void addStyleSheet() {
        kit = new HTMLEditorKit();
        kit.setStyleSheet(new KnowledgeBaseStyleSheet());
      
        searchDisplayTextPane.setEditorKit(kit);
        insertDisplayTextPane.setEditorKit(kit);
    }

Java:
public class KnowledgeBaseStyleSheet extends StyleSheet {

    public KnowledgeBaseStyleSheet() {
        super();
        addRule("h1 {    font-size: 14 px; "
                + "        text-decoration: underline;"
                + "}");
    }
  
}

Schon mal ohne versucht?
 
Setze doch mal bitte

panel.setPreferredSize(new Dimension(GUIConfig.TEXTPANELWIDTH, GUIConfig.TEXTPANELHEIGHT));
searchDisplayScrollPane.setPreferredSize(new Dimension(GUIConfig.TEXTPANELWIDTH, GUIConfig.TEXTPANELHEIGHT));

Wenn das nicht funktioniert, weiß ich auch nicht weiter.
 
Ich hab das Problem gelöst. Mein Problem war, dass ich versucht habe dem LayoutManager die Aufgabe abgenommen habe, die größe zu regulieren. Ich hatte dem JEditorPane die größe gegeben. Richtig ist es der JScrollPane die größe zu geben.
 

Neue Themen


Zurück
Oben