JTextArea滚到文本位置问题 请问JTextArea通过滚动条滚到后如何得知当前视图显示的文本是那个地方开始的,譬如滚到整个文档的第几个字符?谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 swing 文本域定位和自动滚屏问题随着内容的增加,滚动条会发生变化,但如果出现新的page,scrollBar不会自动显示到新加的内容。一种常见的情况是在JScrollPane中的JTextArea组件,当JTextArea插入新的内容时,默认会在最下面插入新的一行,当内容超过可视界面时便无法看到新加的内容。现以此种情况为例,总结以下几种定位方法: 1. textArea.setCaretPosition(textAtra.getDocument().getLength()); 2. scrollPane.getVerticalScrollBar().setValue(textArea.getHeight()); 3. Point p = new Point(); p.setLocation(0, textArea.getHeight()); scrollPane.getViewport.setViewPosition(p); 如果使用监听器,可监听textArea或scrollbar,但不同的监听器和上面方法的组合可能会有不同的效果。 swing中,JTextArea可使用DocumentListener() JScrollBar可用adjustmentListener() 你可以看看这个http://rcyl2003.javaeye.com/blog/205436 可以得到和设置文本插入符的位置import java.awt.BorderLayout;import java.awt.event.ActionEvent;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;public class ScrollFrame extends JFrame{ JPanel jPanel = new JPanel(); JScrollPane jscrollPane = new JScrollPane(); BorderLayout borderLayout = new BorderLayout(); JTextArea jTextArea = new JTextArea(); JPanel jPanel2 = new JPanel(); String str = "JTextComponent 类 :\n public void setCaretPosition(int position)设置 TextComponent 的文本插入符的位置。\n" + " 注意,插入符可跟踪更改,所以如果组件的底层文本被更改,则此位置可能会移动。\n "+ " 如果文档为 null,则不执行任何操作。位置必须在 0 和组件的文本长度之间,否则将抛出异常。\n " +" public int getCaretPosition()返回文本组件的文本插入符的位置。 \n" + " 设置文本插入位置为文本末尾 \n" + " textArea.setCaretPosition(textArea.getDocument().getLength()); "; JButton jButton1 = new JButton("得到插入符位置"); JButton jButton2 = new JButton("设置插入符到末尾"); private void jbInit() throws Exception{ jTextArea.setText(this.str); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e){ System.out.println(jTextArea.getCaretPosition()); } }); jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e){ jTextArea.setCaretPosition(jTextArea.getDocument().getLength()); jTextArea.append("\n添加到末尾的文字"); } }); this.getContentPane().add(jPanel,BorderLayout.CENTER); jPanel.setLayout(borderLayout); jPanel.add(jscrollPane,BorderLayout.CENTER); jPanel.add(jPanel2,BorderLayout.SOUTH); jPanel2.add(jButton1,null); jPanel2.add(jButton2,null); jscrollPane.getViewport().add(jTextArea,null); } public ScrollFrame(){ try{ jbInit(); }catch(Exception e){ e.printStackTrace(); } } public static void main(String[] args){ ScrollFrame scrollFrame1 = new ScrollFrame(); scrollFrame1.setSize(500,300); scrollFrame1.setLocation(400,300); scrollFrame1.setVisible(true); }} 我记得 读入文件时 JScrollPane自动就可以根据 文档 滚动 的 啊 lz具体看看这个吧 JScrollBar的使用:Swing2006年11月29日 星期三 上午 11:30类层次结构图: java.lang.Object --java.awt.Component --java.awt.Container --javax.swing.JComponent --javax.swing.JScrollBar 在上一节我们看到JScrollPane利用ScrollBar的功能使它可以利用滚动轴滚动窗口,乍看之下我们并不会直接使用到JScrollBar的方法,因为JScrollPane都帮我们处理得好好的,但如果我们想对滚动轴做更细的设置,例如在拖曳时一次滚动多少区域等,就必须了解JScrollBar所提供的功能了。JScrollBar在处理窗口的滚动并不像JScrollPane那么容易,看起来也比JScrollPane简单得许多,因此通常在实现时我们会取一些JScrollBar所提供的功能,来补足我们对JScrollPane的需要,而不会直接拿JScrollBar来做滚动操作。下面是构造函数:JScrollBar构造函数:JScrollBar():建立一个垂直的滚动轴,默认参数值分别为:minimum=0,maximum=100,value="/0,extent=10.JScrollBar(int" orientation):建立一个指定方向的滚动轴,默认参数值分别是: minimum=0,maximum=100,value="/0,extent=10.JScrollBar(int" orientation,int value,int extent,int min,int max):建立一个指定方向的滚动轴,并设置value、extent、 mimimum与maximum四个参数值。JScrollBar四个参数的意义如下:value:JScrollBar一开始的起始位置,若设为0表示在滚动轴的最顶端。extent:延伸区,限制滚动轴可滚动的范围。例如,若minimum值设为0,maximan值设为100,而extent值设为20,则滚动轴可滚动的区域大小为100-20-0=80个刻度,滚动的范围从0~80。若minimum值设为20,maximan值设为100,而extent值设为30,则滚动轴可滚动的区域大小为100-30-20=50个刻度,滚动的范围从20~70。因此可知,延伸区设得越大,可滚动的范围就起小。minimum:设置最小刻度值。maximum:设置最大刻度值。JScrollBar最常用到的就是AdjustmentEvent事件,当用户拖曳滚动轴时就会触发此事件。因此若要处理这类事件,就必须实现AdjustmentEvent界面。此界面定义了一个adjustmentValueChanged()方法,实现此方法就能够得到滚动轴的相关信息。import java.awt.*;import java.awt.event.*;import javax.swing.*;public class JScrollBar1 implements AdjustmentListener{ JScrollBar scrollBar1; JScrollBar scrollBar2; JPanel panel1; JLabel label2=new JLabel("刻度:",JLabel.CENTER); public JScrollBar1(){ JFrame f=new JFrame("JScrollBarDemo"); Container contentPane=f.getContentPane(); JLabel label1=new JLabel(new ImageIcon(".\\icons\\flower.jpg")); panel1=new JPanel(); panel1.add(label1); /*产生一个垂直滚动轴,默认滚动轴位置在10刻度的地方,extent值设10,minimum值为0, *maximan值为100,因此滚动轴一开始在刻度10的位置上,可滚动的区域大小为100-10-0=90 *刻度,滚动范围在0~90中。 */ scrollBar1=new JScrollBar(JScrollBar.VERTICAL,10,10,0,100); scrollBar1.setUnitIncrement(1);//设置拖曳滚动轴时,滚动轴刻度一次的变化量。 scrollBar1.setBlockIncrement(10);//设置当鼠标在滚动轴列上按一下是,滚动轴一次所跳的区块大小 scrollBar1.addAdjustmentListener(this); scrollBar2=new JScrollBar();//建立一个空的JScrollBar scrollBar2.setOrientation(JScrollBar.HORIZONTAL);//设置滚动轴方向为水平方向 scrollBar2.setValue(0);//设置默认滚动轴位置在0刻度的地方。 scrollBar2.setVisibleAmount(20);//extent值设为20 scrollBar2.setMinimum(10);//minmum值设为10 scrollBar2.setMaximum(60);//maximan值设为60,因为minmum值设为10,可滚动的区域大小为60-20-10=30 //个刻度,滚动范围在10~40中。 scrollBar2.setBlockIncrement(5);//当鼠标在滚动轴列上按一下时,滚动轴一次所跳的区块大小为5个刻度 scrollBar2.addAdjustmentListener(this); contentPane.add(panel1,BorderLayout.CENTER); contentPane.add(scrollBar1,BorderLayout.EAST); contentPane.add(scrollBar2,BorderLayout.SOUTH); contentPane.add(label2,BorderLayout.NORTH); f.setSize(new Dimension(200,200)); f.show(); f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } } ); } //实现adjustmentValueChanged方法。当用户改变转轴位置时,会将目前的滚动轴刻度写在labe2上。 public void adjustmentValueChanged(AdjustmentEvent e){ if ((JScrollBar)e.getSource()==scrollBar1) label2.setText("垂直刻度"+e.getValue());//e.getValue()所得的值与scrollBar1.getValue()所得的值一样。 if ((JScrollBar)e.getSource()==scrollBar2) label2.setText("水平刻度"+e.getValue()); } public static void main(String[] args){ new JScrollBar1(); } } 顶~这句,,scrollPane.getVerticalScrollBar().我也是这么做的。 java数据类型 继承中的构造方法的问题 高手才进来: 求一个复杂算法 谁来帮我讲解一下这道题~~~谢谢 做JAVA数字证书时遇到的一个问题。 请教各位老师一个取配置文件test.property的值的问题。。。 急!!!我下载了j2sdk1.4.01.linux.i586.rpm.bin,怎么在我的RedHat8中安装呀,bin文件是个啥呀?(在线等待,弄了一下午了!) 关于java多线程的管理 关于exec的问题 spring mvc控制层方法接受这样的参数该怎么写 请问哪里错了? 输入地址,请赐教
随着内容的增加,滚动条会发生变化,但如果出现新的page,scrollBar不会自动显示到新加的内容。一种常见的情况是在JScrollPane中的JTextArea组件,当JTextArea插入新的内容时,默认会在最下面插入新的一行,当内容超过可视界面时便无法看到新加的内容。现以此种情况为例,总结以下几种定位方法: 1. textArea.setCaretPosition(textAtra.getDocument().getLength()); 2. scrollPane.getVerticalScrollBar().setValue(textArea.getHeight()); 3. Point p = new Point();
p.setLocation(0, textArea.getHeight());
scrollPane.getViewport.setViewPosition(p); 如果使用监听器,可监听textArea或scrollbar,但不同的监听器和上面方法的组合可能会有不同的效果。
swing中,JTextArea可使用DocumentListener()
JScrollBar可用adjustmentListener()
你可以看看这个http://rcyl2003.javaeye.com/blog/205436
import java.awt.event.ActionEvent;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;public class ScrollFrame extends JFrame{
JPanel jPanel = new JPanel();
JScrollPane jscrollPane = new JScrollPane();
BorderLayout borderLayout = new BorderLayout();
JTextArea jTextArea = new JTextArea();
JPanel jPanel2 = new JPanel();
String str = "JTextComponent 类 :\n public void setCaretPosition(int position)设置 TextComponent 的文本插入符的位置。\n"
+ " 注意,插入符可跟踪更改,所以如果组件的底层文本被更改,则此位置可能会移动。\n "+
" 如果文档为 null,则不执行任何操作。位置必须在 0 和组件的文本长度之间,否则将抛出异常。\n "
+" public int getCaretPosition()返回文本组件的文本插入符的位置。 \n"
+ " 设置文本插入位置为文本末尾 \n" +
" textArea.setCaretPosition(textArea.getDocument().getLength()); ";
JButton jButton1 = new JButton("得到插入符位置");
JButton jButton2 = new JButton("设置插入符到末尾");
private void jbInit() throws Exception{
jTextArea.setText(this.str);
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e){
System.out.println(jTextArea.getCaretPosition());
}
});
jButton2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e){
jTextArea.setCaretPosition(jTextArea.getDocument().getLength());
jTextArea.append("\n添加到末尾的文字");
}
});
this.getContentPane().add(jPanel,BorderLayout.CENTER);
jPanel.setLayout(borderLayout);
jPanel.add(jscrollPane,BorderLayout.CENTER);
jPanel.add(jPanel2,BorderLayout.SOUTH);
jPanel2.add(jButton1,null);
jPanel2.add(jButton2,null);
jscrollPane.getViewport().add(jTextArea,null);
}
public ScrollFrame(){
try{
jbInit();
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args){
ScrollFrame scrollFrame1 = new ScrollFrame();
scrollFrame1.setSize(500,300);
scrollFrame1.setLocation(400,300);
scrollFrame1.setVisible(true);
}
}
java.lang.Object
--java.awt.Component
--java.awt.Container
--javax.swing.JComponent
--javax.swing.JScrollBar
在上一节我们看到JScrollPane利用ScrollBar的功能使它可以利用滚动轴滚动窗口,乍看之下我们并不会直接使用到
JScrollBar的方法,因为JScrollPane都帮我们处理得好好的,但如果我们想对滚动轴做更细的设置,例如在拖曳时一次滚动多少
区域等,就必须了解JScrollBar所提供的功能了。JScrollBar在处理窗口的滚动并不像JScrollPane那么容易,看起来也比
JScrollPane简单得许多,因此通常在实现时我们会取一些JScrollBar所提供的功能,来补足我们对JScrollPane的需要,而不会直
接拿JScrollBar来做滚动操作。下面是构造函数:
JScrollBar构造函数:
JScrollBar():建立一个垂直的滚动轴,默认参数值分别为:minimum=0,maximum=100,value="/0,extent=10.
JScrollBar(int" orientation):建立一个指定方向的滚动轴,默认参数值分别是:
minimum=0,maximum=100,value="/0,extent=10.
JScrollBar(int" orientation,int value,int extent,int min,int max):建立一个指定方向的滚动轴,并设置value、extent、
mimimum与maximum四个参数值。
JScrollBar四个参数的意义如下:
value:JScrollBar一开始的起始位置,若设为0表示在滚动轴的最顶端。
extent:延伸区,限制滚动轴可滚动的范围。例如,若minimum值设为0,maximan值设为100,而extent值设为20,则滚动轴可滚动的
区域大小为100-20-0=80个刻度,滚动的范围从0~80。若minimum值设为20,maximan值设为100,而extent值设为30,则滚动轴可滚
动的区域大小为100-30-20=50个刻度,滚动的范围从20~70。因此可知,延伸区设得越大,可滚动的范围就起小。
minimum:设置最小刻度值。
maximum:设置最大刻度值。
JScrollBar最常用到的就是AdjustmentEvent事件,当用户拖曳滚动轴时就会触发此事件。因此若要处理这类事件,就必须实现
AdjustmentEvent界面。此界面定义了一个adjustmentValueChanged()方法,实现此方法就能够得到滚动轴的相关信息。import java.awt.*;
import java.awt.event.*;
import javax.swing.*;public class JScrollBar1 implements AdjustmentListener{
JScrollBar scrollBar1;
JScrollBar scrollBar2;
JPanel panel1;
JLabel label2=new JLabel("刻度:",JLabel.CENTER);
public JScrollBar1(){
JFrame f=new JFrame("JScrollBarDemo");
Container contentPane=f.getContentPane();
JLabel label1=new JLabel(new ImageIcon(".\\icons\\flower.jpg"));
panel1=new JPanel();
panel1.add(label1);
/*产生一个垂直滚动轴,默认滚动轴位置在10刻度的地方,extent值设10,minimum值为0,
*maximan值为100,因此滚动轴一开始在刻度10的位置上,可滚动的区域大小为100-10-0=90
*刻度,滚动范围在0~90中。
*/
scrollBar1=new JScrollBar(JScrollBar.VERTICAL,10,10,0,100);
scrollBar1.setUnitIncrement(1);//设置拖曳滚动轴时,滚动轴刻度一次的变化量。
scrollBar1.setBlockIncrement(10);//设置当鼠标在滚动轴列上按一下是,滚动轴一次所跳的区块大小
scrollBar1.addAdjustmentListener(this);
scrollBar2=new JScrollBar();//建立一个空的JScrollBar
scrollBar2.setOrientation(JScrollBar.HORIZONTAL);//设置滚动轴方向为水平方向
scrollBar2.setValue(0);//设置默认滚动轴位置在0刻度的地方。
scrollBar2.setVisibleAmount(20);//extent值设为20
scrollBar2.setMinimum(10);//minmum值设为10
scrollBar2.setMaximum(60);//maximan值设为60,因为minmum值设为10,可滚动的区域大小为60-20-10=30
//个刻度,滚动范围在10~40中。
scrollBar2.setBlockIncrement(5);//当鼠标在滚动轴列上按一下时,滚动轴一次所跳的区块大小为5个刻度
scrollBar2.addAdjustmentListener(this);
contentPane.add(panel1,BorderLayout.CENTER);
contentPane.add(scrollBar1,BorderLayout.EAST);
contentPane.add(scrollBar2,BorderLayout.SOUTH);
contentPane.add(label2,BorderLayout.NORTH);
f.setSize(new Dimension(200,200));
f.show();
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
);
}
//实现adjustmentValueChanged方法。当用户改变转轴位置时,会将目前的滚动轴刻度写在labe2上。
public void adjustmentValueChanged(AdjustmentEvent e){
if ((JScrollBar)e.getSource()==scrollBar1)
label2.setText("垂直刻度"+e.getValue());//e.getValue()所得的值与scrollBar1.getValue()所得的值一样。
if ((JScrollBar)e.getSource()==scrollBar2)
label2.setText("水平刻度"+e.getValue());
}
public static void main(String[] args){
new JScrollBar1();
}
}
这句,,scrollPane.getVerticalScrollBar().我也是这么做的。