我是Java新手,剛剛在StackOverflow中找到了這段代碼:ResizeTextArea
。更改JTextPane的大小
我想用JTextPane
代替JTextArea
。在JTextPane
中,沒有setRows()
方法來改變行數。任何幫助,將不勝感激。
我是Java新手,剛剛在StackOverflow中找到了這段代碼:ResizeTextArea
。更改JTextPane的大小
我想用JTextPane
代替JTextArea
。在JTextPane
中,沒有setRows()
方法來改變行數。任何幫助,將不勝感激。
StyledDocument
中各條線的高度可能會有所不同,因此限制行在JTextPane
中的概念沒有用。您可以使用將將滾動窗格的視口的首選大小限制爲主面板大小的一些有用部分,如here及以下所示。
附錄:正如@camickr評論的那樣,覆蓋JScrollPane
中的getPreferredSize()
有點容易。我還更新了代碼以將增長限制爲當前大小的一小部分:/。
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,有趣的做法。我想知道爲什麼你選擇重寫JViewport?當您重寫JScrollPane的getPreferredSize()方法時,代碼似乎工作。由於您不需要setViewport()方法,因此使用起來會稍微簡單一些。 – camickr 2013-02-23 21:01:46
@camickr:你是對的!感謝您的評論;代碼已更新。 – trashgod 2013-02-24 02:52:44
@trashgod:感謝您的幫助,您的回答非常有用。 – user2049371 2013-02-24 05:16:29
* 「我想用的JTextPane代替的JTextArea」 *爲什麼呢?還要注意,這兩個類名都以大寫字母「J」開頭。請停止「像你的IDE一樣說話」並放置*正確的*名稱。 – 2013-02-23 11:25:50
什麼設施?下面的垃圾回答的答案假設你想要不同高度的線。我想也許你想使用不同顏色的線條的文本窗格,在這種情況下,文本窗格的字體可用於計算線條高度。你提供的信息越多,答案就越好。 – camickr 2013-02-23 20:46:03