2012-03-23 11 views
0

Ein Teil der Anwendung, die ich Anforderungen am Gebäude, das ich Anzeige eine Variable Menge an Text in einer nicht bearbeitbaren Komponente irgendeine Art. Derzeit wurde dies in JTextArea implementiert, aber JTextArea hat nur die setRows(), um die vertikale Größe der Komponente festzulegen.erweiterbar JTextArea

Was ich will, ist eine Komponente, die auf die benötigte Größe erweitert wird. Dies stellt kein Problem dar, da das Panel, auf dem dieses Ding eingebettet ist, scrollbar ist. Es muss nicht immer zu einer bestimmten Zeit erscheinen, aber es muss sichtbar sein. (Und ich will nicht Scrollbalken innerhalb Scrollbalken, die ich ein Gräuel betrachten

Welche Swing-Komponente ist am besten für diese Anforderungen

(Anmerkung:.? Ich bin nur diese hier gefragt, da die gesamte # $%^& * Oracle Java Dokumentation Website einschließlich aller Swing-Demos und Tutorials erscheint unten jetzt sein).

Antwort

0

Emm ... im Fall, dass Sie nicht wollen, zu Text eingeben Sie JTextArea nicht brauchen. .. Um nur einen Text anzuzeigen, können Sie einfach JLabel verwenden, JLabel unterstützt das HTML-Textformat, so dass Sie es einfach verwenden können mich Weise wie diese

... 

JPanel aPanel=new JLanel(new FlowLayout()); 
JLabel aLabel=new JLabel(); 
aPanel.add(aLabel); 


void showFormattedText(String html) 
{ 
aLabel.setText(html); 
} 

... 

Wie Sie erraten können, kann der formatierten Text etwas wie dieses

<html> 
Put some text<br> 
...<br> 

</html> 

sein Ich hoffe, Sie haben die Vorstellung

...

mini Parser - nicht getestet

String getFormattedText(String text) 
{ 
    char commonBR='\n'; 
    String htmlBR="<br>"; 
    char check; 
    String result=""; 

    for(int i=0; i<text.length(); i++) 
    { 
     check=text.charAt(i); 
     if(check==commonBR) 

    { 

    result+=htmlBR; 
    continue; 
    } 

    result+=check; 

    } 

    return result; 

    } 
obwohl

...

void test 
{ 
     String text="Hello world \n Hello World once again \n ...and again "; 

     System.out.println(this.getFormattedText(text)); 
} 

... es ist keine endgültige Lösung, sondern eine Basis Konzeption. Ich hoffe, es war hilfreich

Viel Glück

+0

Dank. Ich habe diesen Code geerbt und das haben sie benutzt. Ich stimme Ihnen jedoch zu, dass JTextArea nicht notwendig ist, da es keine Bearbeitung gibt. Nur so verstehe ich Sie, denn das ist HTML, wenn ich nicht setzen
Tags wird der JLabel klug genug sein, um die Zeilen selbst zu zerlegen und Zeilen wie nötig hinzufügen (wie eine HTML-Seite würde)? Der Text, den ich zeige, ist nur eine zufällige Zeichenfolge, die irgendwo anders eingegeben wurde. Und wird es schlau genug sein, Wortgrenzen zu durchbrechen? Wenn ja, dann ist das genau das, was ich brauche. –

+0

'Setzen Sie einen Text
' Verwenden Sie Stile statt harte Zeilenumbrüche. Auf diese Weise kann der Text bei Bedarf ohne Komplikationen in die nächste Zeile eingefügt werden. Siehe [ein Beispiel] (http://stackoverflow.com/a/7861833/418556). –

+0

@SteveCohen Nein, der HTML-Inhalt wird nicht automatisch umbrochen. Sehen Sie sich mein Beispiel mit CSS an, um das Problem zu beheben. –

0

ich einen funktionierenden Prototyp für diese die dynamische Größenanpassung Probleme in dem ursprünglichen Problem Adressierung geschafft haben. Wenn mehr Text hinzugefügt wird, wird die Größe des Textbereichs so geändert, dass er groß genug ist, um den Text zu enthalten. Verwenden Sie offensichtlich setEditable (false), um die Bearbeitung von Text zu stoppen. Hoffentlich gibt es dir ein paar Ideen.

  • stellen Sie den Text
  • Änderung der Spalte auf einen ungefähren Wert zählen - hier verwendete ich Quadratwurzel der Gesamt Zeichen * ein beliebiger Faktor.
  • nicht der Textbereich ist eine angemessene Breite, aber wir müssen immer noch die Höhe zu beheben.
  • bevorzugte Größe auf einen niedrigen Wert setzen - dies erzwingt eine Neuberechnung
  • bevorzugte Höhe auf die minimale Höhe setzen - dies wird aus der minimalen Bounding Box des Inhalts berechnet.

-Code

JFrame frame = new JFrame(); 
GroupLayout gLayout = new GroupLayout(frame.getContentPane()); 
frame.getContentPane().setLayout(gLayout); 

final JTextArea area = new JTextArea(); 
area.setEditable(false); 
area.setLineWrap(true); 
area.setWrapStyleWord(true); 

JButton button = new JButton("Add more"); 
button.addActionListener(new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     area.setText(area.getText() 
       + "apple banana carrot dingo eagle fox gibbon "); 

     // set approx number of cols 
     int chars = area.getText().length(); 
     int cols = (int) Math.round(Math.sqrt(chars) * 1.3); 
     area.setColumns(cols); 

     // force recalculation 
     area.setPreferredSize(new Dimension(25, 25)); 

     // downsize 
     area.setPreferredSize(new Dimension(
       area.getPreferredSize().width, 
       area.getMinimumSize().height)); 

    } 
}); 

ParallelGroup hGroup = gLayout 
     .createParallelGroup() 
     .addComponent(button) 
     .addComponent(area, GroupLayout.PREFERRED_SIZE, 
       GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE); 
gLayout.setHorizontalGroup(hGroup); 

SequentialGroup vGroup = gLayout 
     .createSequentialGroup() 
     .addComponent(button) 
     .addComponent(area, GroupLayout.PREFERRED_SIZE, 
       GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE); 
gLayout.setVerticalGroup(vGroup); 

frame.setSize(600, 500); 
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

frame.invalidate(); 
frame.validate(); 
frame.setVisible(true);