2014-12-15 2 views
0

Это вопрос о Java и Swing.Как изменить размер области редактирования в JEditorPane?

Я положил две JEditorPane на две JScrollPane, а затем поместил два JScrollPane в JSplitPane. Проблема в том, что при перетаскивании JScrollPane одна JEditorPane расширяется, но когда я перетаскиваю назад, представление уменьшается, но область редактирования не работает, появляется горизонтальная полоса прокрутки.

код выглядит следующим образом:

import javax.swing.*; 
import java.awt.*; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 
import java.io.*; 

public class Main { 

    private static final int DEFAULT_WIDTH = 800; 
    private static final int DEFAULT_HEIGHT = 600; 

    public static void main(String[] args) { 

     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
       frame.setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); 

       JEditorPane editor = new JEditorPane(); 
       JEditorPane preview = new JEditorPane(); 

       System.out.println(DEFAULT_WIDTH/2); 
       // editor.setSize(DEFAULT_WIDTH/2, DEFAULT_HEIGHT); 
       editor.setMinimumSize(new Dimension(0, 0)); 
       // preview.setSize(DEFAULT_WIDTH/2, DEFAULT_HEIGHT); 
       preview.setMinimumSize(new Dimension(0, 0)); 

       final JScrollPane scrollEditor = new JScrollPane(editor); 
       final JScrollPane scrollPreview = new JScrollPane(preview); 

       final JSplitPane innerPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, scrollEditor, scrollPreview); 
       innerPane.setContinuousLayout(false); 
       frame.add(innerPane, BorderLayout.CENTER); 

       innerPane.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, new PropertyChangeListener() { 
        @Override 
        public void propertyChange(PropertyChangeEvent evt) { 
         editor.setSize(innerPane.getLeftComponent().getBounds().width, editor.getHeight()); 
         scrollEditor.setSize(innerPane.getLeftComponent().getBounds().width, editor.getHeight()); 
        } 
       }); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

Я пытаюсь использовать JEditorPane.setSize, но он не работает.

Как это исправить?

Спасибо.

+3

Вам не нужно использовать PropertyChangeListener. Размер компонентов должен автоматически меняться при перемещении разделителя. Отправьте надлежащий [SSCCE] (http://sscce.org/), который демонстрирует проблему, если вам нужна дополнительная помощь. – camickr

+0

Спасибо за ваш ответ, и я думаю, что код достаточно ясен. Проблема заключается в редактируемой текстовой области JEditorPane, а не в компоненте JEditorPane. Он будет настраиваться с помощью разделителя, но если я продлю один редактор, например, перетащите разделитель вправо и уменьшите его, например, перетащите назад влево, компонент сжимается, но длина строки в текстовой области этого не делает. Таким образом, JEditorPane не отображает все символы в одной строке, я должен перетащить горизонтальную полосу прокрутки. Это ясно? – AuBee

+0

Нет кода недостаточно, или я бы не попросил SSCCE. Поскольку вы не будете прилагать никаких усилий, чтобы опубликовать SSCCE, я думаю, вам действительно не нужна помощь. – camickr

ответ

2

Вам необходимо переопределить реализацию по умолчанию интерфейса Scrollable для JEditorPane. В основном вам нужно указать JScrollPane, что ширина JEditorPane должна всегда вписываться в область просмотра scrollpane.

Вы можете сделать это с помощью кода, как:

JEditorPane editor = new JEditorPane() 
{ 
    @Override 
    public boolean getScrollableTracksViewportWidth() 
    { 
     return true; 
    } 
}; 

И, как я уже говорил в моем комментарии не нужны PropertyChangeListener.

+0

Ничего себе, отлично! Большое спасибо, это, безусловно, то, что я хочу! Я посмотрю документацию, чтобы узнать, что означает Viewport весной. Еще раз спасибо. – AuBee

+0

@AuBee, 'это, конечно, то, что я хочу' - тогда не забудьте« принять »ответ, чтобы люди знали, что на вопрос был дан ответ. – camickr

+0

Конечно, спасибо за ваш ответ и направление. – AuBee

0
final JScrollPane scrollEditor = new JScrollPane(editor, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
final JSplitPane innerPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, scrollEditor, scrollPreview); 

innerPane.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, new PropertyChangeListener() { 
        @Override 
        public void propertyChange(PropertyChangeEvent evt) { 

         editor.setSize(innerPane.getLeftComponent().getBounds().width, editor.getHeight() - 10); // If you want more edge space make 10 to 15 or 20 
         scrollEditor.setSize(innerPane.getLeftComponent().getBounds().width, editor.getHeight()); 

        } 
       }); 
+0

Если редактор не был обернут scrollPane, я не могу его прокрутить. Если текст длиннее, чем высота JEditorPane, я не мог дотянуться до конца. – AuBee

+0

Вы имеете в виду, что вам нужен только V-свиток? Проверьте, что ответ обновлен. теперь у вас будет вертикальная прокрутка. –

+0

На самом деле я уже пробовал новое решение, которое вы публикуете, прежде чем добавить первый комментарий, проблема не была решена. Мысль горизонтальной полосы прокрутки не отображалась, длина линии еще шире, чем ширина представления. – AuBee

Смежные вопросы