2016-10-16 3 views
1

Явное приложение, которое я создаю, использует структуру Swing. Я новичок в Swing, и я пытаюсь отобразить текст из файла. Проблема в том, что не весь мой текст отображается с использованием кода ниже - он отключается.Swing JPanel Изменение размера: не соответствует содержимому текстового файла - вырезает текст

Код

До сих пор я создал компонент JFrame, чтобы содержать все:

//initial frame that holds everything 
frame = new JFrame(WINDOW_NAME); 
frame.setSize(new Dimension((SCREEN_WIDTH.intValue()/100)*80, (SCREEN_HEIGHT.intValue()/100)*80)); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

В пределах этого я создал панель прокрутки, чтобы позволить пользователю прочитать содержимое текстового файла с помощью прокрутки по вертикали; это довольно большой текстовый файл - несколько глав из книги.

JScrollPane scrollPane = new JScrollPane(contentPane); 
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
scrollPane.setWheelScrollingEnabled(true); 

frame.setContentPane(scrollPane); 

Область прокрутки содержит объект JPanel. Для этого я использовал диспетчер компоновки GridBagLayout. Сама панель содержит редакторскую панель, которую я создал с URL-адресом текстового файла.

JPanel contentPane = new JPanel(); 
contentPane.setPreferredSize(new Dimension(frame.getWidth(), frame.getHeight())); 

buildAndAddComponentsToFrame(contentPane); 

private void buildAndAddComponentsToFrame(Container container) { 

    container.setLayout(new GridBagLayout()); 

    GridBagConstraints c = new GridBagConstraints(); 


    c.fill = GridBagConstraints.BOTH; 
    c.gridx = 0; 
    c.gridy = 0; 
    c.weightx = 1.0; 
    c.weighty = 1.0; 
    c.insets = new Insets((frame.getHeight()/100)*10, (frame.getWidth()/100)*10, (frame.getHeight()/100)*10, (frame.getWidth()/100)*10); 

    //create a non-editable editor pane to hold the contents of the religious texts 
    JEditorPane textContainer = new JEditorPane(); 
    textContainer.setEditable(false); 

    //TODO load the content of the pane from a URL (local) 

    File textFile = new File(*my text file*); 
    try { 
     textContainer.setPage(textFile.toURI().toURL()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    container.add(textContainer,c); 
} 

Это работает - я в состоянии прочитать содержимое файла, но не в полном объеме: это только показывает, что он может поместиться в высоту объекта JPanel. Я не хочу размещать текстовый контент в ScrollPane, но повышаю высоту JPanel относительно содержимого текстового файла.

Есть ли способ достичь этого? Я использовал контейнер, чтобы «текстовая область» выглядела как документ Microsoft Word, а значит, вставки - это документ, документ которого находится в середине jframe - это намеренно.

Спасибо за любую помощь - извините, если мои объяснения были немного расплывчатыми. Я добавил скриншот, чтобы помочь объяснить.

screen shot of GUI

+0

Почему бы не поставить JTextPane в окно просмотра JScrollPane? –

+0

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

+0

Вы все еще можете это сделать, но просто имейте их вокруг JScrollPane. –

ответ

2

Вы создаете JPanel, используя по умолчанию FlowLayout, вы заставляете его предпочтительный размер до некоторого значения, а затем интересно, почему он не будет получать больше, когда он держит JTextPane имеет текст больше его размер. Этого не происходит из-за ошибок, которые вы делаете выше.

Предложения:

  • Лучше поместить JTextPane в JScrollPane, чтобы не ограничивать размер в JTextPane в или предпочтительный размер.
  • В противном случае, если вы должны обернуть JTextPane в JPanel, дайте ему JPanel, который будет расширяться, если его компоненты будут расширяться. Используйте BorderLayout и добавьте JTextPane BorderLayout.CENTER. Затем поместите это в окно просмотра JScrollPane и, если необходимо ограничить размеры, сделайте это в окне просмотра.
+0

Я попробую эту реализацию - ваша вторая точка маркера имеет смысл для меня –

+0

, просто вынимая метод _setPreferredSize (...) _ на начальном JPanel Я достиг того, что хотел - спасибо за вашу помощь. –

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