Я хочу использовать JTextpane
с фиксированной шириной, но динамическую высоту, которая также должна допускать обертывание. Высота должна изменяться, когда пользователь добавляет или удаляет текст. Я бы использовал JTextArea
, но текст должен быть написан по-разному. Есть ли простой способ решить эту проблему?Как установить фиксированную ширину, но динамическую высоту на JTextPane?
ответ
Используйте JScrollPane
без горизонтального прокрутки.
JFrame frame = new JFrame();
JPanel pnel = new JPanel();
frame.setContentPane(pnel);
JTextPane txtpane = new JTextPane();
txtpane.setPreferredSize(new Dimension(200, 200));
JScrollPane jsp = new JScrollPane(txtpane,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
pnel.add(jsp);
frame.pack();
frame.setVisible(true);
Это не будет обертывать текст. Для переноса текста посмотрите на них: http://java-sl.com/wrap.html, http://java-sl.com/tip_html_letter_wrap.html
Я предлагаю использовать JTextArea
не JTextPane
Я уже написал ответ на что-то подобное. Проверьте here.
Вы должны понимать, что PreferredSize возвращаемый JTextPane является:
если ширина не установлена, GetPreferredSize возвращает габарит (ширина, высота), где
width
будет ширина самой длинной строки, если там, где нет обертывания, иheight
, высота, необходимая для отображения всех линий в панели с бесконечной шириной.если ширина устанавливаются, getPrefferedSize возвращает размеры (ширина, высота), где
width
будет шириной самой длинной строки, если там, где нет упаковки, иheight
высоты необходимо, чтобы отобразить весь текст, если он был завернут при текущей ширине.
Почему такое поведение?
Это очень просто. Вы не можете рассчитать высоту, необходимую для представления текста, если вы не знаете ширину, которую вы можете использовать.
Как это сделать динамически?
Лучше всего было бы добавить DocumentListener в документ JTextPane. Тогда, при каждом изменении, просто позвоните
myJTextPane.setSize(myJTextPane.getWidth(),myJtextPane.getPreferredSize().height);
Для иллюстрации
Удачи с этим кодом:
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
public class HelloWorld {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final JFrame mainFrame = new JFrame("test");
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JTextPane field = new JTextPane();
field.setText("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse accumsan magna vel libero bibendum, quis hendrerit nisi rutrum. Cras placerat erat eget dictum ornare. Sed eget nisl quis nibh vehicula mollis. Vestibulum non iaculis erat, quis pulvinar magna. Suspendisse ac rhoncus purus. Quisque finibus, dolor varius tincidunt aliquet, mauris felis condimentum neque, at viverra felis nulla at justo. Duis ut dui velit. Integer vitae mollis leo. Cras quis urna odio. Suspendisse tempus, urna sed maximus fringilla, ante velit finibus massa, id commodo libero quam non ipsum. Sed id augue vitae sapien sagittis imperdiet in eget nibh. Nam semper posuere nisl, dictum efficitur ipsum aliquet ac. Phasellus eros massa, fringilla et neque maximus, pretium tempor magna.");
mainFrame.getContentPane().setLayout(null);
mainFrame.getContentPane().add(field,BorderLayout.CENTER);
field.setLocation(0, 0);
field.setSize(200,40);
field.setSize(200, field.getPreferredSize().height);
mainFrame.setSize(300,500);
mainFrame.setVisible(true);
System.out.println(field.getPreferredSize().width+" , "+field.getPreferredSize().height);
}
});
}
}
спасибо sharcoux, ваш код работал, решил мою проблему. – mweetwa
Ваш прием. Как только вы получите удовлетворительный ответ, выберите его, нажав на галочку слева. – Sharcoux
@mweetwa, пожалуйста, прочитайте [this] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work), если вы новичок в StackOverflow;) – Sharcoux
ты судимым что-то сделать? –