2015-12-30 2 views
1

Мой код выглядит так:Как получить полный размер (изменяемого) компонента внутри JScrollPane?

JFrame frame = new JFrame(); 

JPanel panel = new JPanel(); 

JTextPane text = new JTextPane(); 
text.setPreferredSize(new Dimension(200,260)); 
text.setContentType("text/html"); 
text.setEditable(false); 
text.setText("some random thing makes this pane bigger than its perferred size"); 

JScrollPane scroll = new JScrollPane(text); 

panel.add(scroll); 

frame.add(panel); 
frame.setVisible(true); 
frame.pack(); 
frame.validate(); 

Моя проблема, я не знаю, как получить реальный размер JTextPane тексте здесь). Я пробовал все getSizes & getVisibleRects, scroll.getViewport().getViewSize() ... но все они возвращаются [200,260]. Может ли кто-нибудь помочь мне решить эту проблему? Я очень ценю любую помощь, которую вы можете предоставить.

EDIT: Я выяснил проблему: Мои запросы getSizes были выполнены до того, как кадр был проверен. Мой работоспособной тестирование кода:

import java.awt.Dimension; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextPane; 

public class Abcd { 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    JFrame frame = new JFrame(); 

    JPanel panel = new JPanel(); 

    JTextPane text = new JTextPane(); 
    text.setPreferredSize(new Dimension(150,126)); 
    text.setContentType("text/html"); 
    text.setEditable(false); 

    //Alicia Vikander's photo. She's cute anw. 
    String tmp = "<a href=\"https://upload.wikimedia.org/wikipedia/commons/thumb/b/b2/Alicia_Vikander.jpg/220px-Alicia_Vikander.jpg\"><img src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/b/b2/Alicia_Vikander.jpg/220px-Alicia_Vikander.jpg\"/></a>"; 
    //text.setText("asdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sf"); 
    text.setText(tmp); 
    JScrollPane scroll = new JScrollPane(text); 
    scroll.setPreferredSize(new Dimension(150,126)); 

    panel.add(scroll); 

    frame.add(panel); 
    frame.setVisible(true); 
    frame.pack(); 
    frame.validate(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    for (double i = 0; i < 1000; i = i + 0.0001){ 
     System.out.print(text.getHeight()+"\n");    
     if (text.getHeight()!=123){ //3 pixels for the scrollpane's border i guessed 
      System.out.print("i = "+i+", height = "+text.getHeight()); 
      break; 
     } 
    } 
} 

В моем компьютере i составляет около 50 - 100. Так что моя новая проблема: Есть ли в любом случае я мог бы получить realsize как только я могу, но все-таки убедитесь, что рама проверена ? Большое спасибо.

+0

Ваш тест не был на самом деле меняется размер 'text', когда я его запускал, вместо этого он просто переносился на новую строку. Я умножил ваш тестовый текст на 50, а затем изменил размер, и 'text.getSize()' изменил его вывод соответственно – phflack

+0

', но все они возвращаются [200, 260]. 'Не используйте метод setPreferredSize(). – camickr

+0

Спасибо всем, ребята. Я мог бы наконец выяснить, почему они были возвращены '[200,260]' вместо реального размера: Запросы 'getSizes' были выполнены до того, как кадр был проверен. Я отредактировал вопрос, поставив свой исполняемый пример (оригинальный был немного скуден, моя ошибка). Моя проблема теперь в том, как убедиться, что я могу получить размер, когда кадр уже был проверен. Еще раз спасибо за помощь. –

ответ

0

Я настоятельно рекомендую вам начать использовать разные Layout managers.

Если я Твик код немного:

JFrame frame = new JFrame(); 

final JTextPane text = new JTextPane(); 
text.setContentType("text/html"); 
text.setEditable(false); 
text.setText("some random thing makes this pane bigger than its perferred size"); 

final JScrollPane scroll = new JScrollPane(text); 
scroll.addComponentListener(new ComponentAdapter() { 
     @Override 
     public void componentResized(ComponentEvent e) { 
      System.out.println("Size of JScrollPane is: " + scroll.getSize()); 
      System.out.println("Size of JTextPane is: " + text.getSize()); 
     } 
}); 

frame.setLayout(new BorderLayout()); 
frame.add(scroll,BorderLayout.CENTER); 
frame.pack(); 
frame.setVisible(true); 

Мы имеем размер компонента прокрутки вызова его scroll.getSize() и размер текста компонента вызывающего его text.getSize()

+0

Я отредактировал свое сообщение (мой старый был слишком скудным, моя ошибка). Это моя новая (настоящая) проблема. Надеюсь, ты поможешь мне решить эту проблему. Еще раз спасибо за ваши советы –

+0

@ HaM.1 Не могу понять вас за цикл ???, кроме того, вы настаиваете на том, чтобы не использовать диспетчер компоновки .... (пожалуйста, подумайте над его использованием). Поскольку размер может варьироваться, если компонент повторно -sized, я бы использовал ComponentListener, как в примере, чтобы понять, какой размер у них есть ... –

+0

Я использую цикл 'for' только вместо timertask или других вещей, чтобы показать время изменения результата. Мой код был фактически запущен, и размер изменился, но цикл 'for' показал мне, что моя следующая строка была выполнена, когда кадр все еще проверен. Конечный результат должен быть 'height = 283', но я мог получить его только тогда, когда индекс работал до 50 или sth (' 123' - это исходная высота без текста внутри). Я пробовал использовать менеджер компоновки, но это не помогло, поэтому я не поместил его в пример кода. –

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