【问题标题】:JAVA Appending stringbuilder to textarea, not replacing textarea just adding to it (need to replace instead of adding)JAVA将stringbuilder附加到textarea,而不是替换textarea只是添加到它(需要替换而不是添加)
【发布时间】:2015-02-05 00:30:56
【问题描述】:

我有一个字符串生成器来加载一些字符串列表,我的问题是当我添加到 textarea 时,我想替换那里的内容,而不仅仅是添加到它。我发布了我所有的代码,这是一个很多,所以我会进一步解释是否有人需要更多信息。我认为问题是当我在附加时使用 .toString() 方法转换字符串生成器时,这可能每次都会添加到列表中,如果是这种情况,我不知道如何解决这个问题......

import java.awt.GridLayout;
import javax.swing.JFrame;
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.util.Scanner;
import java.util.Arrays;
import javax.swing.JComboBox;


public class Lab10 extends JPanel
{
  private StringBuilder string, string2, string3, string4; //loads SuperStrings faster by appending all at once
  private JRadioButton occurrence, alphabetical;
  private JPanel text;
  private JComboBox<Integer> input;
  private JLabel label, file1,file2, unique, unique2;
  private JButton load, go,go2;
  private CountLinkedList<SuperString> words, words3; //Change impliments CountList to extends BinaryCountTree
  private OrderedLinkedList<SuperString> words2, words4;//Change impliments CountList to extends BinaryCountTree
  private String filename,filename2;
  private int width = 450;
  private int height = 550;
  private TextArea textarea,textarea2;
  Scanner scan;

  public Lab10()
  {
    string = new StringBuilder();
    string2 = new StringBuilder();
    string3 = new StringBuilder();
    string4 = new StringBuilder();
    ButtonListener listener = new ButtonListener();
    Button2Listener listener2 = new Button2Listener();
    Integer [] select = {1,2,3,4};
    input = new JComboBox<Integer>(select);
    text = new JPanel(new GridLayout(1,2));
    go = new JButton("Select Text File 1: ");
    go2 = new JButton("Select Text File 2: ");
    label = new JLabel("N: " );
    unique = new JLabel("");
    unique2 = new JLabel("");
    file1 = new JLabel("");
    file1.setFont(new Font("Helvetica",Font.PLAIN,24));
    unique.setFont(new Font("Helvetica",Font.PLAIN,24));
    file2 = new JLabel("");
    file2.setFont(new Font("Helvetica",Font.PLAIN,24));
    unique2.setFont(new Font("Helvetica",Font.PLAIN,24));

    occurrence= new JRadioButton("Occurrence");
    occurrence.setMnemonic(KeyEvent.VK_O);
    occurrence.addActionListener(listener);
    occurrence.addActionListener(listener2);
    occurrence.setSelected(true);


    alphabetical = new JRadioButton("Alphabetical");
    alphabetical.setMnemonic(KeyEvent.VK_A);
    alphabetical.addActionListener(listener);
    alphabetical.addActionListener(listener2);

    ButtonGroup group = new ButtonGroup();
    group.add(occurrence);
    group.add(alphabetical);

    go.addActionListener(listener);
    go2.addActionListener(listener2);
    input.addActionListener(listener);
    input.addActionListener(listener2);

    textarea = new TextArea("",0,0,TextArea.SCROLLBARS_VERTICAL_ONLY);
    textarea2 = new TextArea("",0,0,TextArea.SCROLLBARS_VERTICAL_ONLY);
    textarea.setFont(new Font("Helvetica",Font.PLAIN,24));
    textarea2.setFont(new Font("Helvetica",Font.PLAIN,24));
    textarea.setPreferredSize(new Dimension(width,height));
    textarea2.setPreferredSize(new Dimension(width,height));
    setPreferredSize(new Dimension(1000,700));
    text.add(textarea);
    text.add(textarea2);
    add(occurrence);
    add(alphabetical);
    add(label);
    add(input);
    add(go);
    add(file1);
    add(unique);
    add(go2);
    add(file2);
    add(unique2);

    add(text);

    textarea.setText("No File Selected");
    textarea2.setText("No File Selected");


  }
    public class ButtonListener implements ActionListener //makes buttons do things
    {
      JFileChooser chooser = new JFileChooser("../Text");


      public void actionPerformed(ActionEvent event)
      {
       Integer N = input.getSelectedIndex()+1;

        if(event.getSource() == go)
      {

        int returnvalue = chooser.showOpenDialog(null);

    if(returnvalue == JFileChooser.APPROVE_OPTION)
    {
      try
      {
        File file = chooser.getSelectedFile();
        String text1= file.getName();
        file1.setText(text1);
        filename = file.getName();
        System.err.println(filename);
        scan = new Scanner(file);

      }
      catch (IOException e)
      {
        System.err.println("IO EXCEPTION");
        return;
      }       
    }
    else
    {
      return;
    }


     String[] storage = new String[N];
    words = new CountLinkedList<SuperString>();
    words2 = new OrderedLinkedList<SuperString>();
   for(int i=1;i<N;i++)
     storage[i] = scan.next().toLowerCase().replaceAll("[^A-Za-z0-9]", "")
                  .replaceAll("[.,':]","");

    while(scan.hasNext())
    {
      for(int i=0;i<=N-2;i++)
        storage[i] = storage[i+1];
      storage[N-1] = scan.next().toLowerCase();
      storage[N-1] = storage[N-1].replace(",","").replace(".","").replaceAll("[^A-Za-z0-9]", "")
                  .replaceAll("[.,':]","");
      SuperString ss = new SuperString(storage);
      SuperString ss2= new SuperString(storage);
      words.add(ss );
      words2.add(ss2 );
    }

    textarea.setText("");
        }
    SuperString[] ss = new SuperString[words.size()];
    SuperString[] ss2 = new SuperString[words2.size()];
    int i=0;
    int count =0, count2= 0;


    for(SuperString word: words)
    {
      ss[i] = word;
      i++;
    }
    int j=0;
    for(SuperString word: words2)
    {
      ss2[j] = word;
      j++;
    }


    Arrays.sort(ss, new SuperStringCountOrder());

    for(SuperString word : ss)
    {
      count++;
      string.append(Integer.toString(count)+ "       "+ word+ "\n");
    }
    if(occurrence.isSelected())
    {
      string.replace(0,0,"");
     textarea.setText("");
     textarea.append("    "+filename+" has wordcount: "+words.size()+
      "\n-------------------------\n\n");
     textarea.append(string.toString());
    }


     for(SuperString word : ss2)
    {
       count2++;
       string2.append(Integer.toString(count2)+ "       "+ word.toString()+ "\n");  
    }
         if(alphabetical.isSelected())
    {
                 string.replace(0,0,"");
      textarea.setText("");
      textarea.append("    "+filename+" has wordcount: "+words.size()+
      "\n-------------------------\n\n");
      textarea.append(string2.toString());

    }
     unique.setText("Unique Count: "+ Integer.toString(words.size()));

      }
    }


    public class Button2Listener implements ActionListener
    {
       JFileChooser chooser = new JFileChooser("../Text");


      public void actionPerformed(ActionEvent event)
      {
       Integer N = input.getSelectedIndex()+1;

         if(event.getSource() == go2)
      {

        int returnvalue = chooser.showOpenDialog(null);

    if(returnvalue == JFileChooser.APPROVE_OPTION)
    {
      try
      {
        File file = chooser.getSelectedFile();
        String text2= file.getName();
        file2.setText(text2);
        filename2 = file.getName();
        System.err.println(filename);
        scan = new Scanner(file);

      }
      catch (IOException e)
      {
        System.err.println("IO EXCEPTION");
        return;
      }       
    }
    else
    {
      return;
    }

     String[] storage = new String[N];
    words3 = new CountLinkedList<SuperString>();
    words4 = new OrderedLinkedList<SuperString>();
   for(int i=1;i<N;i++)
     storage[i] = scan.next().toLowerCase().replace(",","").replace(".","");

    while(scan.hasNext())
    {
      for(int i=0;i<=N-2;i++)
        storage[i] = storage[i+1];
      storage[N-1] = scan.next().toLowerCase();
      storage[N-1] = storage[N-1].replace(",","").replace(".","").replaceAll("[^A-Za-z0-9]", "")
                  .replaceAll("[.,':]","");
      SuperString ss = new SuperString(storage);
      SuperString ss2= new SuperString(storage);
      words3.add(ss );
      words4.add(ss2 );
    }
    textarea2.setText("");
         }
    SuperString[] sstwo = new SuperString[words3.size()];
    SuperString[] ss2two = new SuperString[words4.size()];
    int i=0;
    int count =0, count2= 0;

    for(SuperString word2: words3)
    {
      sstwo[i] = word2;
      i++;
    }

    int j=0;
    for(SuperString word2: words4)
    {
      ss2two[j] = word2;
      j++;
    }  

    Arrays.sort(sstwo, new SuperStringCountOrder());

        for(SuperString word2 : sstwo)
    {
      count++;
      string3.append(Integer.toString(count)+ "       "+ word2+ "\n");
    }
    if(occurrence.isSelected())
    {
     textarea2.setText("");
     textarea2.append("    "+filename2+" has wordcount: "+words3.size()+
      "\n-------------------------\n\n");
     textarea2.append(string3.toString());
    }

     for(SuperString word2 : ss2two)
    {
       count2++;
        string4.append(count2+"   "+ "  "+word2+"\n");     
    }
     if(alphabetical.isSelected())
          {
       textarea2.setText("");
       textarea2.append("    "+filename2+" has wordcount: "+words3.size()+
      "\n-------------------------\n\n");
       textarea2.append(string4.toString());
       }

     unique2.setText("Unique Count: "+ Integer.toString(words3.size()));

      }
    }



   public static void main(String[] arg)
  {
    JFrame frame = new JFrame("Lab 10");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
    frame.getContentPane().add(new Lab10());
    frame.pack();
    frame.setVisible(true);
  }
}

【问题讨论】:

  • 这段代码没有替换文本区域的文本吗?
  • Noooo 我不知道为什么yyy
  • textarea2.setText(""); textarea2.append(" "+filename2+" 有字数: "+words3.size()+ "\n-------------------------\n \n"); textarea2.append(string4.toString());这是附加文本而不是添加的代码吗?
  • JTextArea#setText?
  • 实际上唯一添加到它的是列表,所以它必须是“textarea2.append(string4.toString());”位....我的每个列表也是如此

标签: java string append textarea stringbuilder


【解决方案1】:

看起来您的“字符串”是一个 StringBuilder 实例变量,而您从未重置它。你会的

textarea.setText("");
textarea.append(string.toString());

所以你首先要清除文本区域。但就我所见,“字符串”的值只会被附加到。你想用

清除它吗
string.replace(0,0,"");

也许在第 187 行?那是行不通的。 replace(0,0,"") 不会替换任何东西。第二个参数需要是要替换的字符数。 (严格来说,它是第一个不替换的字符的索引,但在这种情况下,这相当于同一件事。)这个的输出可能有助于澄清它在做什么。

public class A {
    public static void main(String[] args) {
      StringBuilder sb = new StringBuilder();
      sb.append("abcdefg");
      System.out.println("String is [" +sb + "]");
      sb.replace(0,0,"");
      System.out.println("String is [" +sb + "]");
      sb.replace(0,1000,"");
      System.out.println("String is [" +sb + "]");
    }
}

输出:

字符串是 [abcdefg]

字符串是 [abcdefg]

字符串是 []

【讨论】:

  • 好的,所以我做到了 (string.replace(0,string.size(),""); .. 这有效但它会打印出 2 个列表,除非我选择两次出现或字母顺序然后它归结为一个列表。所以我的 string.replace 代码在被选中两次之后才起作用......?如果这有意义
  • 所以最初它打印出 2 个列表,再次选择按钮后它打印出 1(这是我想要的)
  • 一般来说,在最接近您使用它们的范围内声明变量是个好主意。您可以在 public void actionPerformed(ActionEvent event) 方法中添加您的 string = new StringBuilder(); 行。然后你会确保每次动作发生时它都会被重置/重新创建。就目前而言,它在点击之间持续存在。另外,我认为第 200 行附近有一个错误。该代码区域正在操作 string2 变量,但是在该行中,您调用的是对 string 而不是 string2 的重置。
  • 还有一件小事……当我加载列表时,滚动条会一直向下滚动,无论如何让它不会自动滚动到底部?
  • 添加文本后,您可以使用textArea.setCaretPosition(0) 将插入点设置回文本的开头。我认为文本区域会自动滚动回顶部,以便插入点可见。
猜你喜欢
  • 2022-11-18
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 2012-12-10
  • 2015-08-06
  • 1970-01-01
相关资源
最近更新 更多