[英]Updating dynamic TextArea in Java
我正在嘗試使用Java中的動態文本區域創建簡單的文本編輯器。
該應用程序開始時只有1個文本區域。 每次按ENTER鍵,應用程序都會創建一個新的文本區域。 是工作! 大聲笑。 但是,當我嘗試更改上一個文本區域時,該文本區域未更改。 問題是因為我以前的文本區域已經在容器中。 因此,我的問題是我們如何更新容器中的所有文本區域?
看我的代碼:
import javax.swing.*;
import javax.swing.text.*;
import java.awt.*;
import java.io.*;
import java.awt.event.*;
public class SimpleEditor extends JFrame {
int count = 0;
Container content = getContentPane();
private JTextComponent[] textComp;
public static void main(String[] args) {
SimpleEditor editor = new SimpleEditor();
editor.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
editor.setVisible(true);
}
// Create an editor.
public SimpleEditor() {
super("Swing Editor");
dinamicTA();
content.setLayout(new FlowLayout());
for(int i=0;i<count;i++) {
content.add(textComp[i]);
}
pack();
content.setSize(content.getPreferredSize());
pack();
}
//create DINAMIC TEXT AREA
public void dinamicTA () {
if(count==0) {
textComp = new JTextComponent[1];
textComp[0] = createTextComponent();
count+=1;
}
else {
JTextComponent[] texttemp;
texttemp = new JTextComponent[count];
for(int i=0;i<count;i++) {
texttemp[i] = createTextComponent();
}
count+=1;
textComp = new JTextComponent[count];
for(int i=0;i<count-1;i++) {
textComp[i] = createTextComponent();
//textComp[i].setText(texttemp[i].getText()+"wow"); <-- not working
}
textComp[count-1] = createTextComponent();
content.add(textComp[count-1]);
}
}
// Create the JTextComponent subclass.
protected JTextComponent createTextComponent() {
JTextArea ta = new JTextArea();
if (count%2==0)
ta.setForeground(Color.red);
else
ta.setForeground(Color.GREEN);
ta.setFont(new Font("Courier New",Font.PLAIN,12));
ta.setLineWrap(true);
ta.setWrapStyleWord(true);
ta.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyReleased(java.awt.event.KeyEvent ev) {
taKeyReleased(ev);
}
});
ta.setColumns(15);
pack();
ta.setSize(ta.getPreferredSize());
pack();
return ta;
}
private void taKeyReleased(java.awt.event.KeyEvent ev) {
int key = ev.getKeyCode();
if (key == KeyEvent.VK_ENTER) {
dinamicTA();
pack();
content.setSize(content.getPreferredSize());
pack();
}
}
}
還有2個問題。 每次按ENTER鍵,都會創建一個文本區域,而上一個文本區域會得到一個換行符。 您是否有刪除分隔線的想法? 下一個問題:我按ENTER鍵而不單擊新的文本區域后如何轉到下一個文本區域?
抱歉,有太多問題..哈哈哈。 在此之前:)
數組旨在用於固定大小的數據結構。 您嘗試跟蹤新創建的文本區域的代碼過於混亂,容易出錯。 創建新陣列並從舊陣列復制數據太混亂了,容易出錯並且不必要。
如果要動態創建文本區域,請使用動態存儲(如ArrayList)。 然后,您只需將新創建的文本區域添加到ArrayList。 因此,您可以像這樣創建ArrayList作為類變量:
ArrayList<JTextComponent> components = new ArrayList<JTextComponent>();
添加一個文本組件,您只需使用:
components.add(...);
我將讓您看一下API,以了解如何從ArrayList中“獲取”元素。
每次按ENTER鍵,都會創建一個文本區域,而上一個文本區域會得到一個換行符。 您是否有刪除分隔線的想法?
Enter鍵的默認操作將換行符字符串添加到文本區域。 該動作仍與KeyListener一起執行
因此,請勿使用KeyListener。 相反,您需要使用自定義操作替換默認操作。 執行此操作的代碼如下所示:
Action enter = new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
// add your MouseListener code here
}
});
textArea.getActionMap().put("insert-break", enter);
有關更多信息,請參見鍵綁定 ,包括指向鍵綁定的Swing教程的鏈接。
對於您的第一個問題,我將代碼更改為`
import javax.swing.*;
import javax.swing.text.*;
import java.awt.*;
import java.awt.event.*;
public class SimpleEditor extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
int count = 0;
Container content = getContentPane();
private JTextComponent[] textComp;
// Create an editor.
public SimpleEditor() {
super("Swing Editor");
dinamicTA();
content.setLayout(new FlowLayout());
for(int i=0;i<count;i++) {
content.add(textComp[i]);
}
pack();
content.setSize(content.getPreferredSize());
pack();
}
//create DINAMIC TEXT AREA
public void dinamicTA () {
if(count==0) {
textComp = new JTextComponent[1];
textComp[0] = createTextComponent();
count+=1;
}
else {
JTextComponent[] texttemp;
texttemp = textComp;
count+=1;
textComp = new JTextComponent[count];
for(int i=0;i<count-1;i++) {
textComp[i] = texttemp[i];
textComp[i].setText(textComp[i].getText()+"wow"); //<-- not working
}
textComp[count-1] = createTextComponent();
content.add(textComp[count-1]);
textComp[count-1].requestFocus(); //get focus
}
}
// Create the JTextComponent subclass.
protected JTextComponent createTextComponent() {
final JTextArea ta = new JTextArea();
if (count%2==0)
ta.setForeground(Color.red);
else
ta.setForeground(Color.GREEN);
ta.setFont(new Font("Courier New",Font.PLAIN,12));
ta.setLineWrap(true);
ta.setWrapStyleWord(true);
ta.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyReleased(java.awt.event.KeyEvent ev) {
taKeyReleased(ev);
}
});
ta.setColumns(15);
pack();
ta.setSize(ta.getPreferredSize());
pack();
return ta;
}
private void taKeyReleased(java.awt.event.KeyEvent ev) {
int key = ev.getKeyCode();
if (key == KeyEvent.VK_ENTER) {
dinamicTA();
pack();
content.setSize(content.getPreferredSize());
pack();
}
}
public static void main(String[] args) {
SimpleEditor editor = new SimpleEditor();
editor.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
editor.setVisible(true);
}
}
`
我認為原始代碼的問題是:每次添加新組件時,它都會丟失對先前組件的引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.