2013-02-23 6 views
4

Я новичок в Java, и я просто нашел этот фрагмент кода в StackOverflow: ResizeTextArea.Изменение размера JTextPane

Я хочу использовать JTextPane вместо JTextArea. В JTextPane отсутствует метод setRows() для изменения количества строк. Любая помощь будет оценена по достоинству.

+0

* "Я хочу использовать JTextPane вместо JTextArea" * Почему? Также обратите внимание, что оба этих имени класса начинаются с верхнего регистра 'J'. Пожалуйста, прекратите «говорить, как ваша IDE», и поместите * правильные * имена. –

+0

Какие средства? Ниже приведенный ниже ответ trashgod предполагает, что вам нужны линии различной высоты. Я думаю, возможно, вы хотите использовать текстовую панель для строк различного цвета, и в этом случае шрифт текстовой панели можно использовать для вычисления высоты строки. Чем больше информации вы предоставляете, тем лучше ответ. – camickr

ответ

8

Высота отдельных линий в StyledDocument может изменяться, так что понятие ограничения на строки в JTextPane не является полезным. Вы, , можете ограничить предпочтительный размер области просмотра области прокрутки до некоторой полезной доли основного размера панели, как показано на рисунке here и ниже.

Addendum: Как @camickr комментарии, немного легче переопределить getPreferredSize() в JScrollPane. Я также обновил код для ограничения роста до доли текущего размера: /.

image

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextPane; 
import javax.swing.border.EmptyBorder; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 

/** 
* @see https://stackoverflow.com/a/15042241/230513 
* @see https://stackoverflow.com/a/14858272/230513 
*/ 
public class LimitTextPaneSize { 

    private static final int SIZE = 200; 
    private static final double LIMIT = 1/3d; 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       display(); 
      } 
     }); 
    } 

    private static void display() { 
     final JPanel mainPanel = new JPanel(new BorderLayout(5, 5)); 
     mainPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     JPanel topPanel = new JPanel() { 
      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(SIZE, SIZE); 
      } 
     }; 
     final JTextPane chatArea = new JTextPane(); 
     final JScrollPane scrollPane = new JScrollPane(chatArea){ 
      @Override 
      public Dimension getPreferredSize() { 
       Dimension d = super.getPreferredSize(); 
       int desired = (int) (mainPanel.getSize().height * LIMIT); 
       int limit = Math.min(desired, d.height); 
       return new Dimension(SIZE, limit); 
      } 
     }; 
     chatArea.getDocument().addDocumentListener(new DocumentListener() { 
      @Override 
      public void insertUpdate(DocumentEvent e) { 
       updateSize(); 
      } 

      @Override 
      public void removeUpdate(DocumentEvent e) { 
       updateSize(); 
      } 

      @Override 
      public void changedUpdate(DocumentEvent e) { 
       updateSize(); 
      } 

      private void updateSize() { 
       mainPanel.revalidate(); 
      } 
     }); 
     mainPanel.add(topPanel, BorderLayout.CENTER); 
     mainPanel.add(scrollPane, BorderLayout.SOUTH); 

     JFrame f = new JFrame("LimitTextPaneSize"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(mainPanel); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 
} 
+1

+1, интересный подход. Мне интересно, почему вы решили переопределить JViewport? Код работает, когда вы переопределяете метод getPreferredSize() JScrollPane. Это будет немного проще в использовании, поскольку вам не нужен метод setViewport(). – camickr

+1

@camickr: Вы правы! Благодарим вас за комментирование; обновлен код. – trashgod

+0

@trashgod: Спасибо за вашу помощь. Ваш ответ настолько полезен. – user2049371

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

  • Нет связанных вопросов^_^