幕布斯6054654
2019-08-28 15:29:05
如何計(jì)算文本在JTextArea中的行數(shù)(以及每行中的列數(shù))?在對(duì)問(wèn)題中提出的問(wèn)題感興趣后, 我試圖接近它幾次并且失敗了,我不喜歡那個(gè):)我認(rèn)為如果問(wèn)題被分成子問(wèn)題,它可能有助于解決它。為簡(jiǎn)單起見(jiàn),假設(shè)JTextArea不會(huì)改變其大小,因此我們不需要擔(dān)心重新評(píng)估等。我認(rèn)為重要的問(wèn)題是:1.如何計(jì)算某個(gè)文本在JTextArea中占用的行數(shù)?2. JTextArea中的列數(shù)與它可以放在一行中的字符數(shù)之間的關(guān)系是什么?所以我們可以計(jì)算行長(zhǎng)度。請(qǐng)?jiān)谙旅嬲业桨幚淼奈谋緟^(qū)域的示例代碼:import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JTextArea;import javax.swing.SwingUtilities;public class TextAreaLines{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
JPanel p = new JPanel();
JFrame f = new JFrame();
JTextArea ta = new JTextArea("dadsad sasdasdasdasdasd");
ta.setWrapStyleWord(true);
ta.setLineWrap(true);
ta.setRows(5);
ta.setColumns(5);
p.add(ta);
f.setContentPane(p);
f.setSize(400, 300);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
//BTW the code below prints 1
System.out.println("ta.getLineCount()="+ta.getLineCount());
}
});
}}
3 回答

呼啦一陣風(fēng)
TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超6個(gè)贊
你可以做的一件事是使用FontMetrics
。我寫(xiě)了一些代碼,用于JTextArea
在某些行號(hào)上拆分。設(shè)置代碼如下所示:
Graphics2D g = (Graphics2D) g2;FontMetrics m = g.getFontMetrics();int lineHeight = m.getHeight();
這將告訴您文本行的高度。
不幸的是,大多數(shù)字體中的字母寬度不同。但是,您可以使用以下代碼來(lái)確定String的寬度。
int width = m.getStringBounds("Some String", g).getWidth();
我知道這并沒(méi)有完全回答你的問(wèn)題,但我希望它有所幫助。
如果你沒(méi)有使用自動(dòng)換行,這里是你可以使用的通用算法:(在paint組件方法中)
String text[] = getText().split("\n");String newText = "";for (String line: text) { newText = line + "| " + line.length() + "\n";}setText(newText);
這是一般的想法。不確定它會(huì)有多好。如果你試試,請(qǐng)告訴我。

Helenr
TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超4個(gè)贊
不確定這是否有幫助,但您需要設(shè)置文本區(qū)域的寬度,以便視圖知道何時(shí)包裝文本。設(shè)置尺寸后,您可以確定首選高度。當(dāng)您知道首選高度時(shí),可以使用字體metrice行高來(lái)確定包括包裹行(如果有)的總行數(shù)。
import java.awt.*;import javax.swing.*;public class TextAreaPreferredHeight extends JFrame{ public TextAreaPreferredHeight() { JTextArea textArea = new JTextArea(); textArea.setText("one two three four five six seven eight nine ten"); textArea.setLineWrap( true ); textArea.setWrapStyleWord( true ); FontMetrics fm = textArea.getFontMetrics( textArea.getFont() ); int height = fm.getHeight(); System.out.println("000: " + textArea.getPreferredSize()); textArea.setSize(100, 1); System.out.println("100: " + textArea.getPreferredSize()); System.out.println("lines : " + textArea.getPreferredSize().height / height); textArea.setSize(200, 1); System.out.println("200: " + textArea.getPreferredSize()); System.out.println("lines : " + textArea.getPreferredSize().height / height); textArea.setSize(300, 1); System.out.println("300: " + textArea.getPreferredSize()); System.out.println("lines : " + textArea.getPreferredSize().height / height); add(textArea); pack(); setVisible(true);} public static void main(String[] args) { new TextAreaPreferredHeight(); }}
添加回答
舉報(bào)
0/150
提交
取消