JTextPane переносит и разворачивает длинные слова без пробелов с помощью JButton

#java #swing #awt #word-wrap #jtextpane

#java #качели #awt #перенос слов #jtextpane

Вопрос:

Я пытаюсь реализовать wordwrap / unwrap с помощью Button to JTextPane . Я пробовал это, но это работает некорректно. Проблема здесь заключается в следующем:

  • Я набрал текст с пробелами, он работает,
  • Без пробелов это не работает.

Вот мой код:

 public class TestVisual extends javax.swing.JFrame {

    private boolean wrapped;
    private JButton toggleButton = null;
    private JTextPane jtp = null;
    private JPanel noWrapPanel = null;
    private JScrollPane scrollPane = null;

    public TestVisual() {
       super();
        init();
    }

    public void init() {
         this.setSize(300, 200);
         this.setLayout(new BorderLayout());
         wrapped = false;
         jtp = new JTextPane();
         noWrapPanel = new JPanel( new BorderLayout() );
         noWrapPanel.add( jtp );
         scrollPane = new JScrollPane( noWrapPanel);     
         toggleButton = new JButton("wrap");
         toggleButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent e) {
                if (wrapped == true){
                    scrollPane.setViewportView(noWrapPanel);
                     noWrapPanel.add(jtp); 
                    wrapped = false;
                }else {   
                    scrollPane.setViewportView(jtp);
                    toggleButton.setText("unWrap");
                    wrapped = true;
                }
            }
        });
              this.add(scrollPane, BorderLayout.CENTER);
              this.add(toggleButton, BorderLayout.NORTH);
    }
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>                        
     public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TestVisual().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify                     
    // End of variables declaration                   
}
 

Ответ №1:

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

Смотрите ссылку выше. Короче говоря, минимальный диапазон вашего представления должен быть равен предпочтительному диапазону, тогда перенос не используется.

Чтобы использовать перенос на основе пространства, вы должны правильно определить веса разрыва.

ОБНОВИТЬ http://java-sl.com/tip_letter_wrap_java7.html ссылка показывает разницу в переносе для Java 7 и как это можно исправить.