2010-03-16 2 views
7

Ich verwende ein Objekt von JTextArea in meiner Anwendung, die sich mit dem Senden von SMS beschäftigt.Wie man die Größe von JTextArea konstant hält?

Ich habe einen DocumentFilter verwendet, so dass nur 160 Zeichen in das Textfeld eingegeben werden können, aber jetzt möchte ich, dass die Größe des Textfelds konstant ist. es geht weiter, wenn ich in der gleichen Zeile schreibe, ohne die Eingabetaste zu drücken, oder wenn ich nur weiter drücke Geben Sie den Schlüssel ein. Ich habe es auch einmal mit der Bildlaufleiste versucht, aber das Problem bleibt gleich. Schlage mir etwas vor. Unten ist mein Code. Überprüfen Sie bitte das.

class Send_sms extends JPanel implements ActionListener,DocumentListener  
{  
    JButton send; 
    JTextArea smst; 
    JLabel title,limit; 
    JPanel mainp,titlep,sendp,wrap,titlewrap,blankp1,blankp2,sendwrap; 
    JScrollPane scroll; 
    Border br,blackbr; 
    Boolean flag = false; 
    PlainDocument plane; 
    public static final int LINES = 4; 
    public static final int CHAR_PER_LINE = 40;  
     //character limit 160 for a sms 

    public Send_sms() 
     { 
     br = BorderFactory.createLineBorder(Color.RED); 
     blackbr = BorderFactory.createEtchedBorder(EtchedBorder.RAISED,Color.DARK_GRAY,Color.GRAY); 
     setBorder(blackbr); 

       title = new JLabel("Enter the text you want to send!"); 
     title.setFont(new Font("",Font.BOLD,17)); 
     limit = new JLabel(""+charCount+" Characters"); 
     smst = new JTextArea(LINES,CHAR_PER_LINE); 
     smst.setSize(100,100); 
     plane = (PlainDocument)smst.getDocument(); 
     //adding DocumentSizeFilter 2 keep track of characters entered 
     plane.setDocumentFilter(new DocumentSizeFilter(charCount)); 
     plane.addDocumentListener(this); 
     send = new JButton("Send"); 
     send.setToolTipText("Click Here To Send SMS"); 
     send.addActionListener(this); 

     //scroll = new JScrollPane(smst); 
     //scroll.setPreferredSize(new Dimension(200,200)); 
     //scroll.setVerticalScrollBarPolicy(null); 
     //scroll.setHorizontalScrollBarPolicy(null); 
     smst.setBorder(br); 

     blankp1 = new JPanel(); 
     blankp2 = new JPanel(); 
     titlep = new JPanel(new FlowLayout(FlowLayout.CENTER)); 
     titlewrap = new JPanel(new GridLayout(2,1)); 
     mainp = new JPanel(new BorderLayout()); 
     sendwrap = new JPanel(new GridLayout(3,1)); 
     sendp = new JPanel(new FlowLayout(FlowLayout.CENTER)); 
     wrap = new JPanel(new BorderLayout()); 

     titlep.add(title); 
     titlewrap.add(titlep); 
     titlewrap.add(blankp1); 

     sendp.add(send); 
     sendwrap.add(limit); 
     sendwrap.add(blankp2); 
     sendwrap.add(sendp); 

     wrap.add(smst,BorderLayout.CENTER); 
     mainp.add(titlewrap,BorderLayout.NORTH); 
     mainp.add(wrap,BorderLayout.CENTER); 
     mainp.add(sendwrap,BorderLayout.SOUTH); 
     add(mainp); 


       } 

    public void actionPerformed(ActionEvent e) 
    { 
     Vector<Vector<String>> info = new Vector<Vector<String>>(); 
     Vector<String> numbers = new Vector<String>(); 
     if(e.getSource() == send) 
     { 
      //Call a function to send he message to all the clients using text 
      //charCount = 165; 
      String msg = smst.getText(); 
      if(msg.length() == 0) 
       JOptionPane.showMessageDialog(null,"Please Enter Message","Error",JOptionPane.ERROR_MESSAGE); 
      else 
      { 
      // System.out.println("Message:"+msg); 

       Viewdata frame = new Viewdata(msg); 

       limit.setText(""+charCount+" Characters"); 
       charCount = 160; 
       } 
     } 
    } 
    public void insertUpdate(DocumentEvent e) 
    { 
     System.out.println("The legth:(insert) "+e.getLength()); 
     for(int i = 0;i<e.getLength(); i++) 
     { 
      if(charCount >0) 
       charCount--; 
      else 
       break; 
     } 
     limit.setText(""+charCount+" Characters"); 

    } 
    public void removeUpdate(DocumentEvent e) 
    { 
     //System.out.println("The legth(remove): "+e.getLength()); 
     for(int i = 0;i<e.getLength(); i++) 
     { 

      charCount++; 

     } 
     limit.setText(""+charCount+" Characters");  
    } 
    public void changedUpdate(DocumentEvent e) 
    { 
     //System.out.println("The legth(change): "+e.getLength()); 

    } 

}//end Send_sms 

Antwort

5

Sie müssen angeben:

textArea.setColumns (160); 
textArea.setLineWrap (true); 
textArea.setWrapStyleWord (false); //default 

Aber das eigentliche Problem ist, dass Sie zur Eingabe von mehr als 160 Zeichen ermöglichen. Sie müssen eine Art Validator erstellen, der alle eingegebenen Zeichen überspringt, wenn bereits 160 Zeichen geschrieben wurden.

10

klingen wie Sie den Textbereich

JTextArea textArea = new JTextArea(); 

Bei Verwendung dieses Formats des Textbereich nicht über eine bevorzugte Größe unter Verwendung schaffen, so dass es immer wichtigere Rolle. Wenn Sie:

JTextArea textArea = new JTextArea(2, 30); 
JScrollPane scrollPane = new JScrollPane(textArea); 

Dann wird der Textbereich eine bevorzugte Größe von 2 Zeilen und (ungefähr) 30 Spalten. Wenn Sie die bevorzugte Breite eingeben, wird die horizontale Bildlaufleiste angezeigt. Wenn Sie den Umbruch aktivieren, wird der Text umbrochen und eine vertikale Bildlaufleiste wird angezeigt.

-1

Initialisiere das Textfeld mit einem Dokument, das PlainDocument und in dem insert Verfahren begrenzt die Zeichen auf 160

+0

-1 erstreckt, hat dies nichts mit der Steuerung der Größe des Textbereiches zu tun, nur die Anzahl der Zeichen, die dem Dokument hinzugefügt werden. Außerdem hat der Benutzer hierfür bereits einen DocumentFilter geschrieben. Dies ist der bevorzugte Ansatz, um die Anzahl der Zeichen zu begrenzen. – camickr