import java.awt.BorderLayout;import javax.swing.JFrame; import javax.swing.JTextField; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.PlainDocument; public class ReadOnlyField { public static void main(String[] args) { ReadOnlyDocument doc = new ReadOnlyDocument(); doc.setText("the read only text content"); JTextField field = new JTextField(doc, null, 20); JFrame frame = new JFrame("test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(field, BorderLayout.NORTH); frame.setSize(320, 240); frame.setLocation(240, 180); frame.setVisible(true); } private static class ReadOnlyDocument extends PlainDocument { public void insertString(int offs, String str, AttributeSet a) { } public void remove(int offs, int len) { } public void setText(String text) { try { super.remove(0, getLength()); super.insertString(0, text, null); } catch (BadLocationException e) { //never happen } } } }
可以用JTextField 的对象.SetEnabled(),SetVisible()来设置
import javax.swing.JFrame; import javax.swing.JTextField;public class ReadOnlyField{ public static void main(String[] args){ JFrame frame = new JFrame("test"); JTextField field = new JTextField("this is a test for read only textfield,you can check it", 10); field.setEditable(false); field.setToolTipText(field.getText()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(field, BorderLayout.NORTH); frame.setSize(200, 100); frame.setLocation(300, 220); frame.setVisible(true); } }
import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.text.*; class NoneEditableField extends JTextField{ public NoneEditableField(String s,int columns){ super(s,columns); setEditable(false); addFocusListener(new FocusListener(){ int caretPosition=0; public void focusGained(FocusEvent e){ if(!getCaret().isVisible()){ getCaret().setVisible(true); setCaretPosition(caretPosition); } } public void focusLost(FocusEvent e){ if(getCaretPosition()>0) caretPosition=getCaretPosition(); } });
} public NoneEditableField(){ this(new String(),0); } public NoneEditableField(int columns){ this(new String(),columns); } public NoneEditableField(String s){ this(s,0); }}public class ReadonlyField{ public static void main(String[] args){ JFrame frame = new JFrame("test"); NoneEditableField field = new NoneEditableField("this is a test for read only textfield,you can check it", 10);
import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
public class ReadOnlyField
{
public static void main(String[] args)
{
ReadOnlyDocument doc = new ReadOnlyDocument();
doc.setText("the read only text content");
JTextField field = new JTextField(doc, null, 20);
JFrame frame = new JFrame("test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(field, BorderLayout.NORTH);
frame.setSize(320, 240);
frame.setLocation(240, 180);
frame.setVisible(true);
} private static class ReadOnlyDocument extends PlainDocument
{
public void insertString(int offs, String str, AttributeSet a)
{
} public void remove(int offs, int len)
{
} public void setText(String text)
{
try
{
super.remove(0, getLength());
super.insertString(0, text, null);
}
catch (BadLocationException e)
{
//never happen
}
}
}
}
import javax.swing.JTextField;public class ReadOnlyField{
public static void main(String[] args){
JFrame frame = new JFrame("test");
JTextField field = new JTextField("this is a test for read only textfield,you can check it", 10);
field.setEditable(false);
field.setToolTipText(field.getText());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(field, BorderLayout.NORTH);
frame.setSize(200, 100);
frame.setLocation(300, 220);
frame.setVisible(true);
}
}
再请教:ligenlee兄:
我想我明白你的思路,你是想通过按键盘上的左右箭头键来滚动文本,但如何在程序内滚动TextField内的文本,我还不知道。cbhyk兄:
谢谢你!可是我水平太底,还没看懂,我继续看,如果你能解释一下程序更好。cxyPioneer兄:
你说的好像挺简单,不过我不知道应如何实现,能说细点吗?ShellMarx兄:
目前我最感兴趣的就是你说的方法了,虽然你的方法是个变通的方法,但实现起来比较容易。你是想通过工具提示条ToolTipText来显示TextField内的文字是吗?可是如果TextField内的文字的长度超过屏幕的宽度呢?它会自动在ToolTipText中分成两行显示吗?再次感谢赐教的各位!
import java.awt.*;
import java.awt.event.*;
import javax.swing.text.*;
class NoneEditableField extends JTextField{
public NoneEditableField(String s,int columns){
super(s,columns);
setEditable(false);
addFocusListener(new FocusListener(){
int caretPosition=0;
public void focusGained(FocusEvent e){
if(!getCaret().isVisible()){
getCaret().setVisible(true);
setCaretPosition(caretPosition);
}
}
public void focusLost(FocusEvent e){
if(getCaretPosition()>0)
caretPosition=getCaretPosition();
}
});
}
public NoneEditableField(){
this(new String(),0);
}
public NoneEditableField(int columns){
this(new String(),columns);
}
public NoneEditableField(String s){
this(s,0);
}}public class ReadonlyField{
public static void main(String[] args){
JFrame frame = new JFrame("test");
NoneEditableField field = new NoneEditableField("this is a test for read only textfield,you can check it", 10);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(field,BorderLayout.CENTER);
frame.setSize(200, 100);
frame.setLocation(300, 220);
frame.setVisible(true);
}
}
Class ReadonlyField copied from ShellMarx, just for test.
txt.setBackground(...);
txt.setEditable(false);
public ReadOnlyText(int num) {
super(num);
setEditable(false);
}
public ReadOnlyText(String str,int num) {
super(str,num);
setEditable(false);
}
}