请教:如何让一个JTextField即不可以编辑,又可以在其中自由移动光标?

nt941 2003-10-29 10:23:33
我需要用一个长度有限的JTextField来显示一条信息,不希望用户编辑这个信息,但因为信息长度比JTextField可显示的长度长,所以希望可以允许用户滚动信息,以便用户完整地浏览信息。
把JTextField设置为可编辑状态用户倒是可以滚动,可是这不符合我的不允许用户修改信息的要求;设置为不可编辑状态光标又不可插入,因此无法滚动……
如何解决?请高手赐教!
谢谢!
...全文
1032 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ab612 2003-11-01
  • 打赏
  • 举报
回复
import javax.swing.*;

public class ReadOnlyText extends JTextField {
public ReadOnlyText(int num) {
super(num);
setEditable(false);
}
public ReadOnlyText(String str,int num) {
super(str,num);
setEditable(false);
}
}
sun2927 2003-11-01
  • 打赏
  • 举报
回复
up-
Djava 2003-10-31
  • 打赏
  • 举报
回复
JTextField txt=new JTextField(20);
txt.setBackground(...);
txt.setEditable(false);
wobelisk 2003-10-31
  • 打赏
  • 举报
回复
give me credits. haha
nt941 2003-10-30
  • 打赏
  • 举报
回复
谢谢!
楼上兄弟真是高人,佩服!
消化中……
wobelisk 2003-10-30
  • 打赏
  • 举报
回复
Class NoneEditableField is what you need,
Class ReadonlyField copied from ShellMarx, just for test.
wobelisk 2003-10-30
  • 打赏
  • 举报
回复
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);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(field,BorderLayout.CENTER);
frame.setSize(200, 100);
frame.setLocation(300, 220);
frame.setVisible(true);
}
}
nt941 2003-10-30
  • 打赏
  • 举报
回复
提,请高手赐教!
207 2003-10-29
  • 打赏
  • 举报
回复
学习!
cbhyk 2003-10-29
  • 打赏
  • 举报
回复
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
}
}
}
}
ligenlee 2003-10-29
  • 打赏
  • 举报
回复
addxxxlistener
and do nothing when key press but -> <- etc
nt941 2003-10-29
  • 打赏
  • 举报
回复
严重感谢各位!
再请教:

ligenlee兄:
我想我明白你的思路,你是想通过按键盘上的左右箭头键来滚动文本,但如何在程序内滚动TextField内的文本,我还不知道。

cbhyk兄:
谢谢你!可是我水平太底,还没看懂,我继续看,如果你能解释一下程序更好。

cxyPioneer兄:
你说的好像挺简单,不过我不知道应如何实现,能说细点吗?

ShellMarx兄:
目前我最感兴趣的就是你说的方法了,虽然你的方法是个变通的方法,但实现起来比较容易。你是想通过工具提示条ToolTipText来显示TextField内的文字是吗?可是如果TextField内的文字的长度超过屏幕的宽度呢?它会自动在ToolTipText中分成两行显示吗?

再次感谢赐教的各位!



ShellMarx 2003-10-29
  • 打赏
  • 举报
回复
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);
}
}
cxyPioneer 2003-10-29
  • 打赏
  • 举报
回复
可以用JTextField 的对象.SetEnabled(),SetVisible()来设置

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧