JAVA滚动条自动下滑到底部

本文介绍在JTextArea和JTextPane中实现滚动条自动下滑至最新记录的方法,包括使用selectAll(), setCaretPosition()及修改Viewport位置等技巧,适用于聊天软件和日志显示场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JTextArea chat;
JScrollPane scollPanel;
JScrollBar jsb;

我喜欢的方法是:
chat.selectAll();//显示在最后一行


官方方法是:

jsb=scollPanel.getVerticalScrollBar();//
 jsb.setValue(jsb.getMaximum());//

 

 


为了在聊天软件中实现把最新的记录明显的显示出来的功能,我想让滚动条自动的滚动到JTextArea的最后,但是找了很久都没找到合适的方法。曾经想在JScrollBar上做做文章,但是很可惜找不到出路。
    后来发现了几个方法,虽然有投机取巧的嫌疑,但是思路很灵活,拿出来和大家共享。
(1)JTextArea.selectAll();
(2)JTextArea.setCaretPosition(JTextArea.getText().length());
(3)JScrollPane.getViewport().add(JTextArea,null);
     Point p = new Point();
     p.setLocation(0,JTextArea,getLineCount() * int);
     JScrollPane.getViewprot.setViewPosition(p);

说明:1)(1)(2)两种方法都是强制将光标移动到JTextArea中文字部分的末尾,而且两者都是在JTextArea的父类JTextComponent中定义的方法。孰优孰劣暂时看不出来,不过猫猫使用的是第一种,因为需要敲的字符数少。
     2)(3)虽然麻烦但是属于学院派的用法,完全不会给人投机取巧的感觉。
     3)三种方法都必须在JTextArea中添加了新内容后再调用,不能先调用此方法再添加内容,那样不会有任何效果。也就是说,此三种方法不是静态的设置 属性,而是对属性的一种动态的修改,一次修改只能在当时这一次操作中有效,必须在每次修改属性所关联的内容后再修改才有用。
     4)三种方法在JDK1.5.0_02下测试正确。其他环境下调试出现异常请酌情处理。

 

JTextPane或JTextPane设置了滚动条,文本增加后,滚动条自动下滑 
博客分类: Swing 
 
JTextPane或JTextPane设置了滚动条,文本增加后,滚动条自动下滑
例如:日志打印窗口,日志增加后,滚动条自动下滑,显示最新的日志。
实现方法:将光标移动到文本的最后。
JTextArea的实现:
Java代码  
//实现垂直滚动条自动下滑到最低端  
logTxtArea.setCaretPosition(logTxtArea.getText().length());  
JTextPane的实现:
Java代码  
//实现垂直滚动条自动下滑到最低端  
msgShowTxtPane.setCaretPosition(msgShowTxtPane.getStyledDocument().getLength());  

 

 

 

以下是一个简单的Java Swing界面,实现了创建商品列表、自定义字体和图标、滚轮控制下滑、隐藏滚动条等功能: ```java import javax.swing.*; import java.awt.*; import java.awt.event.*; public class ProductListGUI extends JFrame implements MouseWheelListener { private JPanel mainPanel; private JScrollPane scrollPane; private JPanel productListPanel; private JButton addButton; public ProductListGUI() { initUI(); } private void initUI() { setTitle("Product List"); setSize(500, 500); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); mainPanel = new JPanel(); mainPanel.setLayout(new BorderLayout()); productListPanel = new JPanel(); productListPanel.setLayout(new BoxLayout(productListPanel, BoxLayout.Y_AXIS)); productListPanel.setBackground(Color.WHITE); scrollPane = new JScrollPane(productListPanel); scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); scrollPane.getVerticalScrollBar().setUnitIncrement(16); scrollPane.setBorder(BorderFactory.createEmptyBorder()); addButton = new JButton("Add Product"); addButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { addProduct(); } }); mainPanel.add(scrollPane, BorderLayout.CENTER); mainPanel.add(addButton, BorderLayout.SOUTH); setContentPane(mainPanel); addMouseWheelListener(this); } private void addProduct() { JLabel productLabel = new JLabel("Product"); Font font = new Font("Arial", Font.BOLD, 18); productLabel.setFont(font); ImageIcon icon = new ImageIcon("product.png"); JLabel iconLabel = new JLabel(icon); JPanel productPanel = new JPanel(); productPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); productPanel.add(iconLabel); productPanel.add(productLabel); productPanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, productPanel.getPreferredSize().height)); productPanel.setAlignmentX(Component.LEFT_ALIGNMENT); productListPanel.add(productPanel); productListPanel.revalidate(); productListPanel.repaint(); } @Override public void mouseWheelMoved(MouseWheelEvent e) { int scrollAmount = scrollPane.getVerticalScrollBar().getUnitIncrement() * 3; int scroll = scrollPane.getVerticalScrollBar().getValue() - e.getWheelRotation() * scrollAmount; scrollPane.getVerticalScrollBar().setValue(scroll); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { ProductListGUI gui = new ProductListGUI(); gui.setVisible(true); } }); } } ``` 这个界面包含了一个主面板mainPanel,里面包含了一个商品列表面板productListPanel和一个添加商品按钮addButton。商品列表面板使用了BoxLayout,可以自适应高度,而添加商品按钮则放在了底部。商品列表面板使用了JScrollPane来实现滚动功能,水平和垂直滚动条都被隐藏。商品列表面板里的每个商品都是一个JPanel,包含了一个商品图标和一个商品名称,同时使用了自定义的字体。当用户点击添加商品按钮时,会在商品列表面板中添加一个新的商品。 注意,为了实现鼠标滚轮下滑功能,我们需要在ProductListGUI类中实现MouseWheelListener接口,并将自身添加为鼠标滚轮监听器。当用户滚动鼠标滚轮时,会触发mouseWheelMoved方法,我们可以在这个方法中计算滚动距离,并将滚动条的位置更新。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值