问个关于JTextArea和JScrollPane的问题

sb5000 2010-08-23 09:01:54
我的程序需要实现一个功能,就是从一个txt中读入文本到TextArea中,将TextArea放入滚动面板使其可以滚动,运行后若文本长度超过一定长度会自动显示滚动条
现在的问题是运行程序后如果文本长度过长,滚动条的初始位置是在最下方,光标定位到文本末端
部分代码如下求教如何使滚动条一开始在最上方

String readMe = "";
File file = new File("C:\\Documents and Settings\\Administrator\\桌面\\INSTALL.LOG");
if(file.exists()) {
try {
BufferedReader input = new BufferedReader(new FileReader(file));
StringBuffer buffer = new StringBuffer();
String text;
while((text = input.readLine())!=null)
buffer.append(text+"\n");
input.close();
readMe = buffer.toString();
} catch(IOException ioException) {}
}

textArea.setText(readMe);
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);

scrollPanel = new JScrollPane(textArea,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
...全文
233 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
huntor 2010-08-23
  • 打赏
  • 举报
回复
import javax.swing.*;
import javax.swing.text.*;
import java.awt.*;
import java.awt.event.*;
import static javax.swing.ScrollPaneConstants.*;

public class JTextAreaExample extends JFrame{
private JTextArea textarea = new JTextArea();
private DefaultEditorKit kit = new DefaultEditorKit();
public JTextAreaExample(){
super("JTextArea Example");
setDefaultCloseOperation(EXIT_ON_CLOSE);
textarea.setLineWrap(true);
textarea.setWrapStyleWord(true);
getContentPane().add(new JScrollPane(textarea,VERTICAL_SCROLLBAR_AS_NEEDED,HORIZONTAL_SCROLLBAR_NEVER));

setPreferredSize(new Dimension(800,600));
pack();
setLocationRelativeTo(null);
addWindowListener(new WindowAdapter(){
@Override public void windowOpened(WindowEvent evt){
try{
kit.read(new java.io.FileReader("./JTextAreaExample.java"),textarea.getDocument(),0);
textarea.setCaretPosition(0);
}catch(java.io.IOException e){
textarea.setText(e.getMessage());
}catch(BadLocationException e){
}
}
});
}

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable(){
public void run(){
new JTextAreaExample().setVisible(true);
}
});
}
}
Tassdars 2010-08-23
  • 打赏
  • 举报
回复
和IDE工具没关系,我直接用的javac.exe编译的,没用任何IDE,JDK版本是1.6.0_20,要不楼主试一下,或者换台电脑
sb5000 2010-08-23
  • 打赏
  • 举报
回复
会不会跟编译器有关系呢。。。我用MyEclipse 8.0M1
Tassdars 2010-08-23
  • 打赏
  • 举报
回复
楼主,我用你新发的代码又跑了一遍,滚动条还是最上面,我帮不了你了,不知道你的是啥问题
sb5000 2010-08-23
  • 打赏
  • 举报
回复
public class Help extends JFrame{
private JTextArea textArea;
private JScrollPane scrollPanel;

public Help(String title) {
super(title);

textArea = new JTextArea();

String readMe = "";
File file = new File("C:\\Documents and Settings\\Administrator\\桌面\\test.txt");
if(file.exists()) {
try {
BufferedReader input = new BufferedReader(new FileReader(file));
StringBuffer buffer = new StringBuffer();
String text;
while((text = input.readLine())!=null)
buffer.append(text+"\n");
input.close();
readMe = buffer.toString();
} catch(IOException ioException) {}
}

textArea.setText(readMe);


scrollPanel = new JScrollPane(textArea,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

this.add(scrollPanel);

this.setSize(300,600);
this.setLocation(400, 50);

}



我把其他代码都注释掉了,就剩这样最简单的跑。。。滚动条还是在最下面- -我也搞不懂了
Tassdars 2010-08-23
  • 打赏
  • 举报
回复
楼主,我搞不懂了,我用你的代码跑了以后,光标出现在第一行第一个字符,滚动条在最上面,我不知道你是怎么弄的,根本都不用设置滚动条位置,然后我在想,你是不是在代码的其他地方干了什么事
sb5000 2010-08-23
  • 打赏
  • 举报
回复
是不是因为我文件读取方式跟你不一样造成的问题呢。。。
Tassdars 2010-08-23
  • 打赏
  • 举报
回复
但是我这个是经过实践检验才发上来的啊,我用你的代码试试
sb5000 2010-08-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tassdars 的回复:]
JScrollPane.getVerticalScrollBar().setValue(JScrollPane.getVerticalScrollBar().getMinimum());
或者直接设为0,但Minimum可能不为0,虽然大多数情况下我们都设为0,或者说组件默认设为0
JScrollPane.getVerticalScrollBar().setValue(0);
水平滚动条用这……
[/Quote]


这个方法我试过,设成0或者设成Minimum都不管用- -
Tassdars 2010-08-23
  • 打赏
  • 举报
回复
JScrollPane.getVerticalScrollBar().setValue(JScrollPane.getVerticalScrollBar().getMinimum());
或者直接设为0,但Minimum可能不为0,虽然大多数情况下我们都设为0,或者说组件默认设为0
JScrollPane.getVerticalScrollBar().setValue(0);
水平滚动条用这个:JScrollPane.getHorizontalScrollBar().
owen_008 2010-08-23
  • 打赏
  • 举报
回复
给楼主顶一个~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~呵呵
sb5000 2010-08-23
  • 打赏
  • 举报
回复
谢谢楼上了,其实就是再加一行代码
textArea.setCaretPosition(0);
哈哈,万分感谢
java万年历课程设计,有源代码 源代码片段:public class wannianli extends JFrame implements ActionListener, MouseListener { private Calendar cld = Calendar.getInstance(); private String [] astr = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"}; private DefaultTableModel dtm = new DefaultTableModel(null,astr); private JTable table = new JTable(dtm); //装日期的表格 private JScrollPane sp = new JScrollPane(table); private JButton bLastYear = new JButton("上一年"); private JButton bNextYear = new JButton("下一年"); private JButton bLastMonth = new JButton("上月"); private JButton bNextMonth = new JButton("下月"); private JTextField jtfYear = new JTextField(5);//jtfYear年份显示和输入文本框,允许编辑单行文本 private JTextField jtfMonth = new JTextField(2);//jtfMonth月份显示文本框 private JPanel p1 = new JPanel(); //装入控制日期按钮的模块 private JPanel p2 = new JPanel(); private JPanel p3 = new JPanel(new BorderLayout()); private JPanel p4 = new JPanel(new GridLayout(2,1)); private JPanel p5 = new JPanel(new BorderLayout()); private JButton bAdd = new JButton("保存日志"); private JButton bDel = new JButton("删除日志"); private JTextArea jta = new JTextArea(); //JTextArea 是一个显示纯文本的多行区域 private JScrollPane jsp = new JScrollPane(jta); //管理视口、可选的垂直和水平滚动条以及可选的行和列标题视口 private JLabel l = new JLabel("小提示:可直接输入年份,提高查询效率!"); private JLabel lt = new JLabel();//系统时间 private JLabel ld = new JLabel();//日期是否被选择 private int lastTime; JMenuBar jmb = new JMenuBar(); JMenu view;
//package chapter1; import java.text.*; import javax.swing.*; import java.awt.*; import javax.swing.event.*; import java.awt.event.*; import java.util.*; //package chapter1; import java.awt.BorderLayout; import java.awt.event.*; import javax.swing.*; public class MainFrame extends JFrame { private Inventory inventory=new Inventory(); private Invoice invoice=new Invoice(inventory); final JTextArea textArea_1=new JTextArea(); //显示存货单信息 final JTextArea textArea_2=new JTextArea(); //显示提货单信息 public static void main(String args[]) { MainFrame frame=new MainFrame(); frame.setBounds(100,100,450,300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); //框架可见 } public MainFrame() { super(); setTitle("商品库存管理系统"); final JTabbedPane tabbedPane =new JTabbedPane(); //定义总和面板tabbedPane 包含提货单和存货单 final JPanel panel_1=new JPanel(); //定义放存货单面板 final JPanel panel_2=new JPanel(); //定义放提货单面板 final JScrollPane srcollPane_1 =new JScrollPane(textArea_1); final JScrollPane srcollPane_2 =new JScrollPane(textArea_2); final JTextField id_1=new JTextField(4); final JTextField number_1=new JTextField(4); //欲修改的存货单某项的数量 final JTextField id_2=new JTextField(4); final JTextField number_2=new JTextField(4); //欲修改的提货单某项的数量 final JPanel paneButton_1 =new JPanel(); final JPanel paneButton_2 =new JPanel(); final JPanel paneInputl_1=new JPanel(); final JPanel paneInput_2=new JPanel();
服务器端: import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import java.net.*; public class Server extends JFrame implements ActionListener{ JPanel contentPane; JLabel jLabel2 = new JLabel(); JTextField jTextField2 = new JTextField("4700"); JButton jButton1 = new JButton(); JLabel jLabel3 = new JLabel(); JTextField jTextField3 = new JTextField(); JButton jButton2 = new JButton(); JScrollPane jScrollPane1 = new JScrollPane(); JTextArea jTextArea1 = new JTextArea(); ServerSocket server = null; Socket socket = null;BufferedReader instr =null;PrintWriter os=null ; //Construct the frame public Server() { jbInit(); } class MyThread extends Thread{//该线程负责接受数据 public void run(){ try{ while(true){ this.sleep(100); instr= new BufferedReader(new InputStreamReader(socket.getInputStream())); if(instr.ready()){ //检查是否有数据 jTextArea1.append("客户端: "+instr.readLine()+"\n"); } } }catch(Exception ex){} } } public void actionPerformed(ActionEvent e){ if(e.getSource()==jButton1){ int port=Integer.parseInt(jTextField2.getText().trim()); listenClient(port); } if(e.getSource()==jButton2){ String s=this.jTextField3.getText().trim(); sendData(s); } } private void listenClient(int port){//侦听 try{ if(jButton1.getText().trim().equals("侦听")){ server = new ServerSocket(port); jButton1.setText("正在侦听..."); socket=server.accept();//等待,一直到客户端连接才望下执行 sendData("已经成功连接。。。"); jButton1.setText("正在聊天..."); jTextArea1.append("客户端已经连接到服务器\n"); MyThread t=new MyThread(); t.start(); } }catch(Exception ex){ } } private void sendData(String s){//发送数据 try{ os= new PrintWriter(socket.getOutputStream()); os.println(s); os.flush(); if(!s.equals("已经成功连接。。。")) this.jTextArea1.append("Server:"+s+"\n"); }catch(Exception ex){ } } //Component initialization private void jbInit() { contentPane = (JPanel) this.getContentPane(); contentPane.setLayout(null); this.setSize(new Dimension(540, 340)); this.setTitle("服务器"); jLabel2.setBounds(new Rectangle(22, 27, 72, 28)); jLabel2.setText("端口号"); jLabel2.setFont(new java.awt.Font("宋体", 0, 14)); jTextField2.setBounds(new Rectangle(113, 27, 315, 24)); jButton1.setBounds(new Rectangle(440, 28, 73, 25)); jButton1.setFont(new java.awt.Font("Dialog", 0, 14)); jButton1.setBorder(BorderFactory.createEtchedBorder()); jButton1.setActionCommand("jButton1"); jButton1.setText("侦听"); jLabel3.setBounds(new Rectangle(23, 57, 87, 28)); jLabel3.setText("请输入信息"); jLabel3.setFont(new java.awt.Font("宋体", 0, 14)); jTextField3.setBounds(new Rectangle(114, 60, 314, 24)); jTextField3.setText(""); jButton2.setText("发送"); jButton2.setActionCommand("jButton1"); jButton2.setBorder(BorderFactory.createEtchedBorder()); jButton2.setFont(new java.awt.Font("Dialog", 0, 14)); jButton2.setBounds(new Rectangle(440, 58, 73, 25)); jScrollPane1.setBounds(new Rectangle(23, 92, 493, 189)); contentPane.add(jTextField2, null); contentPane.add(jButton1, null); contentPane.add(jLabel3, null); contentPane.add(jTextField3, null); contentPane.add(jButton2, null); contentPane.add(jScrollPane1, null); contentPane.add(jLabel2, null); jScrollPane1.getViewport().add(jTextArea1, null); jButton1.addActionListener(this); jButton2.addActionListener(this); this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ try{ socket.close(); instr.close(); System.exit(0); }catch(Exception ex){ } } }); } public static void main(String arg[]){ JFrame.setDefaultLookAndFeelDecorated(true); Server frm=new Server(); frm.setVisible(true); } } 客户端: import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import java.net.*; public class Client extends JFrame implements ActionListener{ JPanel contentPane; JLabel jLabel1 = new JLabel(); JTextField jTextField1 = new JTextField("127.0.0.1"); JLabel jLabel2 = new JLabel(); JTextField jTextField2 = new JTextField("4700"); JButton jButton1 = new JButton(); JLabel jLabel3 = new JLabel(); JTextField jTextField3 = new JTextField(); JButton jButton2 = new JButton(); JScrollPane jScrollPane1 = new JScrollPane(); JTextArea jTextArea1 = new JTextArea(); BufferedReader instr =null; Socket socket = null; PrintWriter os=null; public Client() { jbInit(); } class MyThread extends Thread{ public void run(){ try{ os=new PrintWriter(socket.getOutputStream()); instr=new BufferedReader(new InputStreamReader(socket.getInputStream())); while(true){ this.sleep(100); if(instr.ready()){ jTextArea1.append("服务器: " +instr.readLine()+"\n"); } } }catch(Exception ex){ } } } public void actionPerformed(ActionEvent e){ if(e.getSource()==jButton1){ String ip=jTextField3.getText().trim(); int port=Integer.parseInt(jTextField2.getText().trim()); connectServer(ip,port); } if(e.getSource()==jButton2){ String s=this.jTextField3.getText().trim(); sendData(s); } } private void connectServer(String ip,int port){//连接 try{ if(jButton1.getText().trim().equals("连接")){ jButton1.setText("连接服务器..."); socket=new Socket(ip,port); jButton1.setText("正在聊天"); MyThread t=new MyThread(); t.start(); } }catch(Exception ex){ } } private void sendData(String s){//发送数据 try{ os = new PrintWriter(socket.getOutputStream()); os.println(s); os.flush(); this.jTextArea1.append("Server:"+s+"\n"); }catch(Exception ex){ } } private void jbInit() { contentPane = (JPanel) this.getContentPane(); jLabel1.setFont(new java.awt.Font("宋体", 0, 14)); jLabel1.setText("服务器名称"); jLabel1.setBounds(new Rectangle(20, 22, 87, 28)); contentPane.setLayout(null); this.setSize(new Dimension(540, 340)); this.setTitle("客户端"); jTextField1.setBounds(new Rectangle(114, 26, 108, 24)); jLabel2.setBounds(new Rectangle(250, 25, 72, 28)); jLabel2.setText("端口号"); jLabel2.setFont(new java.awt.Font("宋体", 0, 14)); jTextField2.setBounds(new Rectangle(320, 27, 108, 24)); jButton1.setBounds(new Rectangle(440, 28, 73, 25)); jButton1.setFont(new java.awt.Font("Dialog", 0, 14)); jButton1.setBorder(BorderFactory.createEtchedBorder()); jButton1.setActionCommand("jButton1"); jButton1.setText("连接"); jLabel3.setBounds(new Rectangle(23, 57, 87, 28)); jLabel3.setText("请输入信息"); jLabel3.setFont(new java.awt.Font("宋体", 0, 14)); jTextField3.setBounds(new Rectangle(114, 60, 314, 24)); jButton2.setText("发送"); jButton2.setActionCommand("jButton1"); jButton2.setBorder(BorderFactory.createEtchedBorder()); jButton2.setFont(new java.awt.Font("Dialog", 0, 14)); jButton2.setBounds(new Rectangle(440, 58, 73, 25)); jScrollPane1.setBounds(new Rectangle(23, 92, 493, 189)); contentPane.add(jLabel1, null); contentPane.add(jTextField1, null); contentPane.add(jLabel2, null); contentPane.add(jTextField2, null); contentPane.add(jButton1, null); contentPane.add(jLabel3, null); contentPane.add(jTextField3, null); contentPane.add(jButton2, null); contentPane.add(jScrollPane1, null); jScrollPane1.getViewport().add(jTextArea1, null); jButton1.addActionListener(this); jButton2.addActionListener(this); this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ try{ socket.close();instr.close();os.close();System.exit(0); }catch(Exception ex){ } } }); } public static void main(String arg[]){ JFrame.setDefaultLookAndFeelDecorated(true); Client frm=new Client(); frm.setVisible(true); } } 先启动服务器端,侦听端口,再启动客户端,就行了

62,614

社区成员

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

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