2013-07-08 4 views
4

우선, 나는 새로운 주제를 시작한 것이 문제가 아니길 바래요. Tbh 나는 이미 응답 한 것에 기초하여 질문하는 방법을 모른다. 그래서 나는 이것을 만들었다.Java7의 JEditorPane 라인 랩

나는 Java로 꽤 새로워서 내 문제는 다음과 같다. 나는 약간의 채팅 프로그램을 작성 중이며 HTMLEditorKit과 함께 JEditorPane을 사용하여 텍스트를 다양한 색상으로 표시하고 스마일을 표시하며 하이퍼 링크를 표시합니다.

내 문제는 일부 연구 후에 Java7로 인한 문제인지 알게되었는데, linewrap이 제대로 작동하지 않을 수 있습니다. 텍스트 줄 바꿈 및 문자열 중간에 줄 바꿈을 구성 요소의 너비를 초과합니다. 단어 줄 바꿈은 제대로 작동하지만 누군가가 꽤 긴 문자열을 입력하면 JEditorPane이 확장되고 프레임에서 크기를 조정해야 화면에 모든 항목이 표시됩니다.

이 문제에 대한 몇 가지 수정 사항을 시도했지만 단어 감싸기가 더 이상 작동하지 않는 문자 감싸기 만 허용합니다. 그 옆에, 사용자가 Enter 키를 눌러 텍스트를 감쌀 수있게하고 싶습니다. 텍스트에 \ n을 추가하고 수정하면 더 이상 결과에 영향을 미치지 않으며 모든 것이 한 줄에 표시됩니다.

나는 해결책을 찾기 위해 수년간 웹을 보냈지만 지금은 항상 동일한 수정으로 보인 이후로는 아무것도 할 수 없다고 생각합니다. 너희들이 나를 도울 수 있기를.

내가 무엇을 가지고 : Windows를 사용하는 경우

  • 라인은 공백으로 구분 된 긴 문자열의 경우 단어를 래핑
  • 이 입력 라인을 포함

    이 요약 의미 타격으로 인해 생성 된 줄 바꿈, 줄 바꿈도 수행됩니다.

  • 매우 긴 문자열을 공백없이 입력하면 패널이 확장되어 필요합니다. 이 경우 지금처럼

    • 워드 랩 동작 : 프레임을
    • HTML 형식의 크기를 조정하는 것은 나에게 다른 색상뿐만 아니라, 하이퍼 링크 및 이모티콘

  • 내가 필요로 무엇을 표시 할 수 있습니다 가능하면 긴 줄이 공백으로 구분되지 않은 경우에만 편지를 감쌀 수 있습니다. 입력 영역에 입력 또는 내가 서식 입력 패널에
  • HTML을 사전 형식의 텍스트를 복사하면 이미 내가 무엇을 시도했다

무엇을 가지고있는 것처럼 타격에 의해

  • 수동으로 추가 라인 랩 도움이되지 않았다 :

    jtextpane doesn't wrap text하고 여기에 JTextPane is not wrapping text

    은 스스로를 시도하는 일부 코드입니다. 왼쪽 하단에는 텍스트를 입력 할 수있는 입력 영역이 있습니다. Enter 키를 눌러 줄 바꿈을 추가 할 수도 있습니다. 버튼을 클릭하면 위의 영역에 텍스트가 표시됩니다.

    import java.awt.BorderLayout; 
    import java.awt.event.ActionEvent; 
    import java.awt.event.ActionListener; 
    import java.awt.event.KeyEvent; 
    import java.awt.event.KeyListener; 
    import java.io.IOException; 
    
    import javax.swing.BorderFactory; 
    import javax.swing.JButton; 
    import javax.swing.JEditorPane; 
    import javax.swing.JFrame; 
    import javax.swing.JPanel; 
    import javax.swing.JTextArea; 
    import javax.swing.border.TitledBorder; 
    import javax.swing.text.BadLocationException; 
    import javax.swing.text.html.HTMLDocument; 
    import javax.swing.text.html.HTMLEditorKit; 
    import javax.swing.text.html.StyleSheet; 
    
    @SuppressWarnings("serial") 
    public class LineWrapTest extends JFrame implements ActionListener, KeyListener { 
    
    private JButton btnSend; 
    private JTextArea textAreaIn; 
    private JEditorPane textAreaOut; 
    private HTMLEditorKit kit; 
    private HTMLDocument doc; 
    
    public LineWrapTest() { 
    
        this.setSize(600, 500); 
        this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
        this.setLocationRelativeTo(null); 
        this.setTitle("Linewrap Test"); 
    } 
    
    /** 
    * Not important for problem 
    */ 
    public void paintScreen() { 
    
        this.setLayout(new BorderLayout()); 
    
        this.add(this.getPanelOut(), BorderLayout.CENTER); 
        this.add(this.getPanelIn(), BorderLayout.SOUTH); 
    
        this.textAreaIn.requestFocusInWindow(); 
        this.setVisible(true); 
    } 
    
    /** 
    * Not important for problem 
    * 
    * @return panelOut 
    */ 
    private JPanel getPanelOut() { 
    
        JPanel panelOut = new JPanel(); 
        panelOut.setLayout(new BorderLayout()); 
    
        this.textAreaOut = new JEditorPane(); 
        this.textAreaOut.setEditable(false); 
        this.textAreaOut.setContentType("text/html"); 
    
        this.kit = new HTMLEditorKit(); 
        this.doc = new HTMLDocument(); 
    
        StyleSheet styleSheet = this.kit.getStyleSheet(); 
        this.kit.setStyleSheet(styleSheet); 
    
        this.textAreaOut.setEditorKit(this.kit); 
        this.textAreaOut.setDocument(this.doc); 
    
        TitledBorder border = BorderFactory.createTitledBorder("Output"); 
        border.setTitleJustification(TitledBorder.CENTER); 
    
        panelOut.setBorder(border); 
        panelOut.add(this.textAreaOut); 
    
        return panelOut; 
    } 
    
    /** 
    * Not important for problem 
    * 
    * @return panelIn 
    */ 
    private JPanel getPanelIn() { 
    
        JPanel panelIn = new JPanel(); 
        panelIn.setLayout(new BorderLayout()); 
    
        this.textAreaIn = new JTextArea(); 
        this.textAreaIn.setLineWrap(true); 
        this.textAreaIn.setWrapStyleWord(true); 
    
        TitledBorder border = BorderFactory.createTitledBorder("Input"); 
        border.setTitleJustification(TitledBorder.CENTER); 
    
        panelIn.setBorder(border); 
        panelIn.add(this.getBtnSend(), BorderLayout.EAST); 
        panelIn.add(this.textAreaIn, BorderLayout.CENTER); 
    
        return panelIn; 
    } 
    
    /** 
    * Not important for problem 
    * 
    * @return btnSend 
    */ 
    private JButton getBtnSend() { 
    
        this.btnSend = new JButton("Send"); 
        this.btnSend.addActionListener(this); 
    
        return this.btnSend; 
    } 
    
    private void append(String text) { 
    
        try { 
         this.kit.insertHTML(this.doc, this.doc.getLength(), text, 0, 0, null); 
        } catch (BadLocationException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
    } 
    
    private String getHTMLText() { 
    
        String txtIn = this.textAreaIn.getText().trim().replaceAll(SEPARATOR, "<br/>"); 
    
        StringBuffer htmlBuilder = new StringBuffer(); 
    
        htmlBuilder.append("<HTML>"); 
        htmlBuilder.append(txtIn); 
        htmlBuilder.append("</HTML>"); 
    
        return htmlBuilder.toString(); 
    } 
    
    @Override 
    public void actionPerformed(ActionEvent e) { 
    
        if (e.getSource() == this.btnSend) { 
         this.append(this.getHTMLText()); 
         this.textAreaIn.setText(""); 
         this.textAreaIn.requestFocusInWindow(); 
        } 
    } 
    
    public static void main(String[] args) { 
    
        LineWrapTest test = new LineWrapTest(); 
        test.paintScreen(); 
    } 
    
    @Override 
    public void keyPressed(KeyEvent e) { 
    
        if (e.getKeyCode() == KeyEvent.VK_ENTER) 
         if (!this.textAreaIn.getText().trim().isEmpty()) 
          this.textAreaIn.setText(this.textAreaIn.getText() + SEPARATOR); 
    } 
    
    @Override 
    public void keyReleased(KeyEvent e) { 
    } 
    
    @Override 
    public void keyTyped(KeyEvent e) { 
    } 
    } 
    

    는 UPDATE :

    http://java-sl.com/tip_java7_text_wrapping_bug_fix.html의 일부에 베이스는 어떻게 든 내 목표에 좀 더 가까이 단계로 그것을 알아 냈다. 나는 HTMLEditorKit에 대한 수정을 StlyedEditorKit Fix와 결합하려고 시도했다. 하지만 솔직히 말해서, 내가 실제로 거기에서 무엇을했는지 전혀 알지 못한다. (슬픈 것은 HTMLEditorKit을 대체 할 때 수동 줄 바꿈이 더 이상 작동하지 않는다는 것이다. 어쩌면 이것을 다음과 같이 사용할 수있다. 좀 더 나은 구현을위한 기반

    내 예제에서 사용하려면 CustomEditorKit을 사용하여 프로젝트에서 새 클래스를 만들고 예제의 HTMLEditorKit을이 CustomEditorKit으로 바꿉니다. 이제 단어 및 문자 배치가 작동하는 것을 알 수 있습니다 그러나 자신의 줄 바꿈을 위해 Enter 키를 누르면이 변경 사항이 출력 패널에 더 이상 나타나지 않고 모든 내용이 한 줄로 표시됩니다. 또 다른 이상한 문제는 프레임의 크기를 조정하면 줄이 가끔씩 나타납니다 서로 낳는다.

    import javax.swing.SizeRequirements; 
    import javax.swing.text.Element; 
    import javax.swing.text.View; 
    import javax.swing.text.ViewFactory; 
    import javax.swing.text.html.HTMLEditorKit; 
    import javax.swing.text.html.InlineView; 
    import javax.swing.text.html.ParagraphView; 
    
    @SuppressWarnings("serial") 
    public class CustomEditorKit extends HTMLEditorKit { 
    
    @Override 
    public ViewFactory getViewFactory() { 
    
        return new HTMLFactory() { 
         @Override 
         public View create(Element e) { 
          View v = super.create(e); 
          if (v instanceof InlineView) { 
           return new InlineView(e) { 
            @Override 
            public int getBreakWeight(int axis, float pos, float len) { 
             return GoodBreakWeight; 
            } 
    
            @Override 
            public View breakView(int axis, int p0, float pos, float len) { 
             if (axis == View.X_AXIS) { 
              this.checkPainter(); 
              this.removeUpdate(null, null, null); 
             } 
             return super.breakView(axis, p0, pos, len); 
            } 
           }; 
          } 
          else if (v instanceof ParagraphView) { 
           return new ParagraphView(e) { 
            @Override 
            protected SizeRequirements calculateMinorAxisRequirements(int axis, SizeRequirements r) { 
             if (r == null) { 
              r = new SizeRequirements(); 
             } 
             float pref = this.layoutPool.getPreferredSpan(axis); 
             float min = this.layoutPool.getMinimumSpan(axis); 
             // Don't include insets, Box.getXXXSpan will include them. 
             r.minimum = (int) min; 
             r.preferred = Math.max(r.minimum, (int) pref); 
             r.maximum = Integer.MAX_VALUE; 
             r.alignment = 0.5f; 
             return r; 
            } 
    
           }; 
          } 
          return v; 
         } 
        }; 
        } 
    } 
    
  • +0

    위의 코드를 사용하면 다음과 같은 상황이 발생합니다. JTextArea가 완벽하게 래핑됩니다. 긴 문자열과 단어는 모두 다음 줄로 줄 바꿈됩니다. JEditorPane은 단어가 긴 문자열로 확장 될 때까지 단어를 래핑합니다. 그런 다음 단어를 감쌀 때 문장은 구성 요소를 확장 한 문자열보다 길어야합니다. 엔터를 치면 현재 유니버설 라인 구분 기호를 사용하여 맞춤 포장이 이루어지지 않습니다. 원하는 것 : JTextArea와 마찬가지로 공백을 추가하지 않고 긴 문자열에 대해 JEditorPane을 래핑하면 확장되지 않습니다. 또한 JEpane에서 맞춤 래핑을 입력하십시오. –

    답변

    5

    OK! 그래서, 나는 마침내 당신이 일하는 데 문제가있는 모든 것을 얻었습니다. 그것은 몇 가지 연구와 시행 착오를 많이했다,하지만 여기있다 :

    • 당신이 스크롤 할 수 있도록 JScrollPane의에서의 JEditorPane를 넣고 메시지가수록 아래로 :

      여기

      내가 무슨 짓을 큰

    • 맞춤 단어 줄 바꿈이 추가되었습니다. 맞춤 단어 줄 바꿈은 원하는 단어 위치에서 단어와 긴 단어를 줄 바꿈합니다. 당신 말이 맞았습니다, 이것은 자바의 현재 버전의 버그입니다. http://bugs.sun.com/view_bug.do?bug_id=7125737
    • 사용자가 Enter 키를 눌러 새 줄을 바꿀 수있는 기능이 추가되었습니다. 이것은 사용자 지정 단어 감싸기를 방해했기 때문에이 방법을 얻지 못했을 수 있습니다. 코드 예제에서는 다른 옵션을 제안합니다.
    • HTMLDocument 기능을 보존합니다. 나는 이것을하지 않으려 고 유혹에 빠졌지 만, 보존 할 수 있도록 일을 둘러 보았다.
    • 응용 프로그램은 여전히 ​​JEditorPane을 사용하지만 원하는 경우 JTextPane으로 전환 할 수 있습니다. 나는 둘 다 시도하고 그들은 둘 다 기능적이었다.

    여기 코드가 있습니다. 조금 길어서 선호도에 따라 바꿀 수도 있습니다. 나는 내가 어디에서 변화를 주 었는지 설명하고 설명하려고 노력했다.여기

    import java.awt.BorderLayout; 
    import java.awt.event.ActionEvent; 
    import java.awt.event.ActionListener; 
    import java.awt.event.KeyEvent; 
    import java.awt.event.KeyListener; 
    import java.io.IOException; 
    
    import javax.swing.BorderFactory; 
    import javax.swing.JButton; 
    import javax.swing.JEditorPane; 
    import javax.swing.JFrame; 
    import javax.swing.JPanel; 
    import javax.swing.JScrollPane; 
    import javax.swing.JTextArea; 
    import javax.swing.KeyStroke; 
    import javax.swing.SizeRequirements; 
    import javax.swing.border.TitledBorder; 
    import javax.swing.text.*; 
    import javax.swing.text.html.HTMLDocument; 
    import javax.swing.text.html.HTMLEditorKit; 
    import javax.swing.text.html.InlineView; 
    import javax.swing.text.html.StyleSheet; 
    
    @SuppressWarnings("serial") 
    public class LineWrapTest extends JFrame implements ActionListener, KeyListener { 
    
        //This is the separator. 
        private String SEPARATOR = System.getProperty("line.separator"); 
        private JButton btnSend; 
        private JTextArea textAreaIn; 
        private JEditorPane textAreaOut; 
        private JScrollPane outputScrollPane; 
        private HTMLEditorKit kit; 
        private HTMLDocument doc; 
    
    
        public LineWrapTest() { 
    
         this.setSize(600, 500); 
         this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
         this.setLocationRelativeTo(null); 
         this.setTitle("Linewrap Test"); 
        } 
    
        /** 
        * Not important for problem 
        */ 
        public void paintScreen() { 
    
         this.setLayout(new BorderLayout()); 
    
         this.add(this.getPanelOut(), BorderLayout.CENTER); 
         this.add(this.getPanelIn(), BorderLayout.SOUTH); 
    
         this.textAreaIn.requestFocusInWindow(); 
         this.setVisible(true); 
        } 
    
    
        /** 
        * Not important for problem 
        * 
        * @return panelOut 
        */ 
        private JPanel getPanelOut() { 
    
         JPanel panelOut = new JPanel(); 
         panelOut.setLayout(new BorderLayout()); 
    
         this.textAreaOut = new JEditorPane(); 
         this.textAreaOut.setEditable(false); 
         this.textAreaOut.setContentType("text/html"); 
    
         //I added this scroll pane. 
         this.outputScrollPane = new JScrollPane(this.textAreaOut); 
    
         /* 
         * This is a whole whack of code. It's a combination of two sources. 
         * It achieves the wrapping you desire: by word and longgg strings 
         * It is a custom addition to HTMLEditorKit 
         */ 
         this.kit = new HTMLEditorKit(){ 
          @Override 
          public ViewFactory getViewFactory(){ 
    
           return new HTMLFactory(){ 
            public View create(Element e){ 
             View v = super.create(e); 
             if(v instanceof InlineView){ 
              return new InlineView(e){ 
               public int getBreakWeight(int axis, float pos, float len) { 
                //return GoodBreakWeight; 
                if (axis == View.X_AXIS) { 
                 checkPainter(); 
                 int p0 = getStartOffset(); 
                 int p1 = getGlyphPainter().getBoundedPosition(this, p0, pos, len); 
                 if (p1 == p0) { 
                  // can't even fit a single character 
                  return View.BadBreakWeight; 
                 } 
                 try { 
                  //if the view contains line break char return forced break 
                  if (getDocument().getText(p0, p1 - p0).indexOf(SEPARATOR) >= 0) { 
                   return View.ForcedBreakWeight; 
                  } 
                 } 
                 catch (BadLocationException ex) { 
                  //should never happen 
                 } 
    
                } 
                return super.getBreakWeight(axis, pos, len); 
               } 
               public View breakView(int axis, int p0, float pos, float len) { 
                if (axis == View.X_AXIS) { 
                 checkPainter(); 
                 int p1 = getGlyphPainter().getBoundedPosition(this, p0, pos, len); 
                 try { 
                  //if the view contains line break char break the view 
                  int index = getDocument().getText(p0, p1 - p0).indexOf(SEPARATOR); 
                  if (index >= 0) { 
                   GlyphView v = (GlyphView) createFragment(p0, p0 + index + 1); 
                   return v; 
                  } 
                 } 
                 catch (BadLocationException ex) { 
                  //should never happen 
                 } 
    
                } 
                return super.breakView(axis, p0, pos, len); 
              } 
              }; 
             } 
             else if (v instanceof ParagraphView) { 
              return new ParagraphView(e) { 
               protected SizeRequirements calculateMinorAxisRequirements(int axis, SizeRequirements r) { 
                if (r == null) { 
                 r = new SizeRequirements(); 
                } 
                float pref = layoutPool.getPreferredSpan(axis); 
                float min = layoutPool.getMinimumSpan(axis); 
                // Don't include insets, Box.getXXXSpan will include them. 
                r.minimum = (int)min; 
                r.preferred = Math.max(r.minimum, (int) pref); 
                r.maximum = Integer.MAX_VALUE; 
                r.alignment = 0.5f; 
                return r; 
               } 
    
              }; 
             } 
             return v; 
            } 
           }; 
          } 
         }; 
    
         this.doc = new HTMLDocument(); 
    
         StyleSheet styleSheet = this.kit.getStyleSheet(); 
         this.kit.setStyleSheet(styleSheet); 
    
         this.textAreaOut.setEditorKit(this.kit); 
         this.textAreaOut.setDocument(this.doc); 
    
         TitledBorder border = BorderFactory.createTitledBorder("Output"); 
         border.setTitleJustification(TitledBorder.CENTER); 
    
         panelOut.setBorder(border); 
    
         //I changed this to add the scrollpane, which now contains 
         //the JEditorPane 
         panelOut.add(this.outputScrollPane); 
    
         return panelOut; 
        } 
    
        /** 
        * Not important for problem 
        * 
        * @return panelIn 
        */ 
        private JPanel getPanelIn() { 
    
         JPanel panelIn = new JPanel(); 
         panelIn.setLayout(new BorderLayout()); 
    
         this.textAreaIn = new JTextArea(); 
         this.textAreaIn.setLineWrap(true); 
         this.textAreaIn.setWrapStyleWord(true); 
    
         //This disables enter from going to a new line. Your key listener does that. 
         this.textAreaIn.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), "none"); 
         //For the key listener to work, it needs to be added to the component 
         this.textAreaIn.addKeyListener(this); 
    
         TitledBorder border = BorderFactory.createTitledBorder("Input"); 
         border.setTitleJustification(TitledBorder.CENTER); 
    
         panelIn.setBorder(border); 
         panelIn.add(this.getBtnSend(), BorderLayout.EAST); 
         panelIn.add(this.textAreaIn, BorderLayout.CENTER); 
    
         return panelIn; 
        } 
    
        /** 
        * Not important for problem 
        * 
        * @return btnSend 
        */ 
        private JButton getBtnSend() { 
    
         this.btnSend = new JButton("Send"); 
         this.btnSend.addActionListener(this); 
    
         return this.btnSend; 
        } 
    
    
        private void append(String text) { 
    
         try { 
          this.kit.insertHTML(this.doc, this.doc.getLength(), text, 0, 0, null); 
         } catch (BadLocationException e) { 
          e.printStackTrace(); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
        } 
    
        private String getHTMLText() { 
         //I tried to find a work around for this but I couldn't. It could be done 
         //by manipulating the HTMLDocument but it's beyond me. Notice I changed 
         //<br/> to <p/>. For some reason, <br/> no longer went to the next line 
         //when I added the custom wrap. <p/> seems to work though. 
         String txtIn = this.textAreaIn.getText().trim().replaceAll(SEPARATOR, "<p/>"); 
    
         //My IDE recommends you use StringBuilder instead, that's up to you. 
         //I am not sure what the difference would be. 
         StringBuffer htmlBuilder = new StringBuffer(); 
    
         htmlBuilder.append("<HTML>"); 
         htmlBuilder.append(txtIn); 
         htmlBuilder.append("</HTML>"); 
    
         return htmlBuilder.toString(); 
        } 
    
        @Override 
        public void actionPerformed(ActionEvent e) { 
    
         if (e.getSource() == this.btnSend) { 
          this.append(this.getHTMLText()); 
          this.textAreaIn.setText(""); 
          this.textAreaIn.requestFocusInWindow(); 
         } 
        } 
    
        public static void main(String[] args) { 
         LineWrapTest test = new LineWrapTest(); 
         test.paintScreen(); 
        } 
    
        @Override 
        public void keyPressed(KeyEvent e) { 
         if (e.getKeyCode() == KeyEvent.VK_ENTER){ 
          if (!this.textAreaIn.getText().trim().isEmpty()) { 
           //I made this work by defining the SEPARATOR. 
           //You could use append(Separator) instead if you want. 
           this.textAreaIn.setText(this.textAreaIn.getText() + SEPARATOR); 
          } 
         } 
        } 
    
        @Override 
        public void keyReleased(KeyEvent e) { 
        } 
    
        @Override 
        public void keyTyped(KeyEvent e) { 
        } 
    
    } 
    

    은 내가이 문제를 해결하는 데 사용되는 링크 (대부분의) :

    http://java-sl.com/tip_html_letter_wrap.html

    :

    Enabling word wrap in a JTextPane with HTMLDocument

    사용자 정의 랩이 두 가지의 조합을 http://java-sl.com/wrap.html

    은 JTextArea에의 keybind 삭제 : 당신이 어떠한 질문이있을 경우

    http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html

    , 그냥 아래에 의견을. 나는 그들에게 대답 할 것이다. 나는 진심으로이 문제

    +0

    앨런, 자세한 답변을 주셔서 감사합니다. 특히 분리기는 나에게 새로운 것이었다. 그러나 당신의 고침은 나를 도와주지 않습니다. 나는 랩핑이나 스크롤 페어에 문제가 없으며 둘 다 필요하다. 내 코드 예제에 문제가 있다는 것을 당신이 썼다면, 무엇이 잘못 됐습니까? 그 나를 위해 일하는 :/ – BenGe89

    +0

    @ BenGe89 아마도 당신의 질문을 오해. 당신이 그것을 더 명확하고 정확하게 당신이 필요로하고 당신의 문제가 무엇이되도록 편집 할 수 있습니까? 귀하의 코드를 실행했을 때 오른쪽 하단에 버튼이있는 빈 창이 나타났습니다. –

    +0

    OP를 편집했습니다. 이제 상황이 더 분명해지기를 바랍니다. 또한 예제에 테두리를 추가하고 OP에 간단한 예제를 추가했습니다. 또한 스크롤 막대를 사용하여 파트를 삭제했습니다. 문제의 원인과 관련이 없으므로 스크롤 막대를 잘못 삭제했습니다. 간단히 말하면, 이미 가지고있는 것을 원하지만 가능한 경우 Java6 비헤이비어 랩핑 워드를 사용하고, 그렇지 않으면 HTMLEditorKit의 문자를 감싸려고합니다. 이 예에서는 문제 만 보여줍니다. 교체가 작동하지 않아 line.separator를 아직 추가하지 않았습니다. Enter 키를 눌러 프로그램에서 자체 줄 바꿈을 만들길 원합니다. – BenGe89

    1

    내가 찾은 치명적인 더 나은 솔루션 해결 희망 : <br> 올바르게 HTMLEditorKit에 의해 처리되어 있지만, 패트릭 세바의 게시물은하지 않을 것이다 했나요. 그것의 ViewFactory 위협 InlineView 개체 wrappable 있지만 BRView 또한 InlineView이기 때문입니다. 아래 내 솔루션을 참조하십시오.

    class WrapColumnFactory extends HTMLEditorKit.HTMLFactory { 
    
         @Override 
         public View create(Element elem) { 
          View v = super.create(elem); 
    
          if (v instanceof LabelView) { 
    
           // the javax.swing.text.html.BRView (representing <br> tag) is a LabelView but must not be handled 
           // by a WrapLabelView. As BRView is private, check the html tag from elem attribute 
           Object o = elem.getAttributes().getAttribute(StyleConstants.NameAttribute); 
           if ((o instanceof HTML.Tag) && o == HTML.Tag.BR) { 
            return v; 
           } 
    
           return new WrapLabelView(elem); 
          } 
    
          return v; 
         } 
        } 
    
        class WrapLabelView extends LabelView { 
    
         public WrapLabelView(Element elem) { 
          super(elem); 
         } 
    
         @Override 
         public float getMinimumSpan(int axis) { 
          switch (axis) { 
           case View.X_AXIS: 
            return 0; 
           case View.Y_AXIS: 
            return super.getMinimumSpan(axis); 
           default: 
            throw new IllegalArgumentException("Invalid axis: " + axis); 
          } 
         } 
    
        } 
    
    +0

    이것은 문제에서 가장 잘 (가장 간단하고 포괄적 인) 솔루션입니다. 나는이 솔루션을 [비슷한 질문에 대한 답변]으로 구성했다. (http://stackoverflow.com/a/31930559/2074605). – vallismortis