Reputation: 39
I have used this answer to get the functionality of Autoscrolling on a JTextArea. But it seems that it works only when the setEditable property of the same JTextArea is set to TRUE. Of course, i use a JScrollPane.
I'm developing a chat application as a college project. The area where the messages are displayed is the very same JTextArea. I've used the 2nd set of code in the 1st answer in the above link. But I need it to make it work when setEditable is set to FALSE.
It wont work even after the setAutoScrolls properties of JTextArea & JScrollPane are set to TRUE.
Please help. Thanx.
Upvotes: 1
Views: 656
Reputation: 4305
Try this small example:
JPanel myPanel=new JPanel();
myPanel.setBorder(new TitledBorder(new EtchedBorder(), "My Application"));
JTextAea textArea = new JTextArea(16, 58);
textArea.setEditable(false); // set textArea to non editable
JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
myPanel.add(scrollPane);
Does it work?
Upvotes: 0
Reputation: 109813
I have used this answer to get the functionality of Autoscrolling on a JTextArea. But it seems that it works only when the setEditable property of the same JTextArea is set to TRUE. Of course, i use a JScrollPane
I didn't see there any issue for setEditable(false)
and/or setEnabled(false)
with theirs possible combinations
(wild shot into dark) excluding issue with EventDispatchThread
, when setText
, append
etc isn't done on EDT, e.g. wrapped into invokeLater()
import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.DefaultCaret;
public class CaretAndJTextArea {
private JTextArea textArea = new JTextArea();
private static final String string =
"Trail: Creating a GUI with JFC/Swing\n"
+ "Lesson: Learning Swing by Example\n"
+ "This lesson explains the concepts you need to\n"
+ " use Swing components in building a user interface.\n"
+ " First we examine the simplest Swing application you can write.\n"
+ " Then we present several progressively complicated examples of creating\n"
+ " user interfaces using components in the javax.swing package.\n"
+ " We cover several Swing components, such as buttons, labels, and text areas.\n"
+ " The handling of events is also discussed,\n"
+ " as are layout management and accessibility.\n"
+ " This lesson ends with a set of questions and exercises\n"
+ " so you can test yourself on what you've learned.\n"
+ "http://docs.oracle.com/javase/tutorial/uiswing/learn/index.html\n";
public CaretAndJTextArea() {
DefaultCaret caret = (DefaultCaret) textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
textArea.setEditable(false);
textArea.setEnabled(false);
textArea.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
setModelText();
}
@Override
public void removeUpdate(DocumentEvent e) {
setModelText();
}
@Override
public void changedUpdate(DocumentEvent e) {
setModelText();
}
private void setModelText() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
//textArea.setText(textArea.getText());
}
});
}
});
JButton button2 = new JButton("Append String");
button2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
textArea.append(string);
}
});
JFrame frame = new JFrame();
frame.add(new JScrollPane(textArea), BorderLayout.CENTER);
frame.add(button2, BorderLayout.SOUTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new CaretAndJTextArea();
}
});
}
}
Upvotes: 3