我首先創建一個特定大小的JTextArea。用戶可以在其中添加文本,但如果它變得太長(垂直或水平),它將被切斷。我想讓JTextArea自動擴展或縮小(刪除文本)。Java中JTextArea的自動動態擴展/收縮
我可能會允許用戶在將來更改字體和字體大小,所以如果我可以避免使事物增加/減少一定的大小,那將是一件好事。
我正在用bounds來設置我的JTextArea的大小。也許我應該按行和列來調整大小,並使用一個偵聽器並採取適當的行動?
在此先感謝!
我首先創建一個特定大小的JTextArea。用戶可以在其中添加文本,但如果它變得太長(垂直或水平),它將被切斷。我想讓JTextArea自動擴展或縮小(刪除文本)。Java中JTextArea的自動動態擴展/收縮
我可能會允許用戶在將來更改字體和字體大小,所以如果我可以避免使事物增加/減少一定的大小,那將是一件好事。
我正在用bounds來設置我的JTextArea的大小。也許我應該按行和列來調整大小,並使用一個偵聽器並採取適當的行動?
在此先感謝!
我無法想象爲什麼你要做到這一點,爲什麼不把一個JTextArea在JScrollPane中,但好的,我會一起玩......也許是這樣的:
import java.awt.Container;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;
public class Expander extends JFrame {
private final JTextArea area;
private int hSize = 1;
private int vSize = 1;
public Expander() {
Container cp = getContentPane();
cp.setLayout(new BoxLayout(cp, BoxLayout.Y_AXIS));
cp.add(Box.createHorizontalGlue());
area = new JTextArea(vSize, hSize);
cp.add(area);
cp.add(Box.createHorizontalGlue());
area.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
adjust();
}
@Override
public void removeUpdate(DocumentEvent e) {
adjust();
}
@Override
public void changedUpdate(DocumentEvent e) {
adjust();
}
});
pack();
}
private void adjust() {
int maxColumns = getMaxColumns();
if ((area.getLineCount() != vSize) || (maxColumns != hSize)) {
hSize = maxColumns;
vSize = area.getLineCount();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
area.setColumns(hSize);
area.setRows(vSize);
Expander.this.doLayout();
Expander.this.pack();
}
});
}
}
private int getMaxColumns() {
int startOffset = 0;
int maxColumns = 0;
for (int i = 0; i < area.getLineCount(); i++) {
try {
int endOffset = area.getLineEndOffset(i);
int lineSize = endOffset - startOffset;
if (lineSize > maxColumns) {
maxColumns = lineSize;
}
startOffset = endOffset;
} catch (BadLocationException ble) {
}
}
return maxColumns;
}
public static void main(String[] args) {
Expander e = new Expander();
e.setLocationRelativeTo(null);
e.setVisible(true);
}
}
我第二個建議是簡單地把JTextArea放在一個JScrollPane中,並讓它處理額外的文本。此外,也許最重要的是,不會設置JTextArea的邊界,因爲如果您這樣做,則會將其限制爲特定大小,這不是您希望發生的情況。而是用兩個int常量初始化您的JTextArea,以表示應該可視化的行和列的數量,然後將其放置在JScrollPane中。另外請務必閱讀使用佈局管理器,以便您可以避免設置JScrollPane的大小!
編輯:在測試中,看起來setPreferredSize比setSize對JTextArea更危險。
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.*;
public class ConstrainedTextArea extends JPanel {
private JTextArea textArea1, textArea2, textArea3;
public ConstrainedTextArea() {
textArea1 = new JTextArea(20, 30);
textArea2 = new JTextArea();
textArea3 = new JTextArea();
textArea2.setPreferredSize(new Dimension(300, 300));
textArea3.setSize(textArea3.getPreferredSize());
setLayout(new GridLayout(1, 0));
add(new JScrollPane(textArea1));
add(new JScrollPane(textArea2));
add(new JScrollPane(textArea3));
}
private static void createAndShowUI() {
JFrame frame = new JFrame("ConstrainedTextArea");
frame.getContentPane().add(new ConstrainedTextArea());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}
謝謝!我需要這種方式,因爲我需要所有文本一次顯示...所以我不能使用滾動條。總的來說,我想要有這些「文本塊」,用戶可以移動並與之交互。 – matthieu 2011-05-10 21:00:27
謝謝!我需要這種方式,因爲我需要所有文字一次可見。總的來說,我想要有這些「文本塊」,用戶可以移動並與之交互。 – matthieu 2011-05-10 20:59:27