`
923723914
  • 浏览: 636347 次
文章分类
社区版块
存档分类
最新评论

让 JScrollbar 滚动条自动滚动到底端

 
阅读更多

由于项目需要,自定义了一个面板,JScrollpane下填充一个JTable表格,表格的单元格采用自定义的渲染器 TableTextAreaCellRenderer(用JTextArea代替JLabel,后者其实就是默认的 DefaultCellRenderer)。按照要求,面板填完内容之后,滚动条自动滚动到最低端。貌似是个简单的问题,考虑过的实现方式如下:

JScrollBar scrollBar = this.jScrollPane1.getVerticalScrollBar();
scrollBar.setValue(scrollBar.getMaxmium());

实际效果很不理想,特别是当单元格内容行数很多时。所以又用了变通的第二种方法,让最后一行的单元格去获取焦点,自然也就实现了滚动条到下面

if (noteTable.getRowCount() != 0) {
int rowCount = noteTable.getRowCount();
noteTable.getSelectionModel().setSelectionInterval(rowCount - 1, rowCount - 1);//选定该单元格,可有可无
Rectangle rect = noteTable.getCellRect(rowCount - 1, 0, false);
noteTable.scrollRectToVisible(rect);

}

测试时和第一种方法的结果类似,所以也放弃了,接着有了第三种方法:

JScrollBar scrollBar = this.jScrollPane1.getVerticalScrollBar();

scrollBar.setValue(scrollBar.getModel().getMaximum() - scrollBar.getModel().getExtent());

直接用还是会有问题,JScrollPane构建后会自动调整界面,填充内容之后立即调用上面的代码会发现 scrollBar.getModel().getMaximum() 和 scrollBar.getModel().getExtent()仍然为零或者不稳定, 也就意味着自动调整尚未结束,结果就不会是value被设置到最大值或者说滚动条置底。解决的办法就是添加侦听事件,当监听到自动调整完毕,调用以上方法。但此时又遇到另一个问题,自动调整结束的标志是什么,该监听哪种事件判断哪个属性的改变,我的方法是:

jScrollPane1.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {

public void adjustmentValueChanged(AdjustmentEvent evt) {
if(evt.getAdjustmentType() == AdjustmentEvent.TRACK && isNeedBottom <= 3) { jScrollPane1.getVerticalScrollBar().setValue(jScrollPane1.getVerticalScrollBar().getModel().getMaximum() - jScrollPane1.getVerticalScrollBar().getModel().getExtent());
isNeedBottom++;
}
}

});

红色部分意味着正在进行自动调整,蓝色部分的意思是进行三次调整(原因是自动调整并不是进行一次,采用调试-局部变量查看可以知道,多数情况两次,最多三次),isNeedBottom 是定义的全局整型变量,需要滚动条自动滚动到底端时将其设置为0即可。经过测试,按这种方法最终达到了要求。

回过头来想想,监听状态是变通的方法,自己并没有找到自动调整反映在哪个属性上,如果可以监听该属性的改变,方法更明确也更简单。
分享到:
评论

相关推荐

    优酷使用的滚动条插件jscrollbar

    前段时间研究了优酷的滚动条,发现优酷也是使用的插件jscrollbar

    jquery 网页 滚动条 jScrollbar

    jquery 网页 滚动条 jScrollbar,用起来挺方便的,样式也容易修改。

    java用滚动条实现的调色板(swing)

    java用滚动条实现的调色板(swing)

    java美化JScrollPanel的滚动条

    setTitle("滚动美化"); setSize(800, 600); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container container = getContentPane(); container.setLayout(null); DefaultMutableTreeNode root = ...

    java swing-JScrollBar的使用

    JScrollBar 是 Java Swing 库提供的一个用于创建滚动条的组件,常用于在用户界面中显示和控制可滚动组件(如 JScrollPane)的滚动位置。

    页面滚动条

    页面滚动条,滚动条(JScrollBar)也称为滑块,用来表示一个相对值,该值代表指定范围内的一个整数。例如,用Word编辑文档时,编辑窗右边的滑块对应当前编辑位置在整个文档中的相对位置,可以通过移动选择新的编辑位置...

    Swing组件下载(常用组件)

    滚动条:JScrollBar 滑块:JSlider 进度栏:JProgressBar 格式化字段:JFormattedTextField 口令字段:JPasswordField Spinner:JSpinner 分隔符:JSeparator 文本窗格:JTextPane 编辑器窗格:JEditorPane 树:...

    Swing 窗口与面版的使用

    介绍Frame和Panel容器的使用方法和时机。针对JFrame,JInternalFrame,JLayeredPane,JPanel,JScrollBar,JSplitPane,JTabbedPane写有详细的可执行代码。

    合并排序算法的演示

    //设置垂直滚动条总是显示 con.add(sp); //shows.setFont(f); // shows.setBounds(700,130,400,360); // shows.setBounds(700,0,400,900); /////////////////////////////// // shows.setBounds(700,0,400,600...

    基于SNT的科学计算器

    定义JScrollBar hScroll用于当用户输入超出显示范围时,用户单击移动按钮查看整个输入。 定义String oldResult = "0.0"是用于记录上一步的计算结果,当前算式可以直接使用。 计算器进行动态编译时,先由程序生成一...

    java经典面试2010集锦100题(不看你后悔)

    JAVA试题(100道) —————————————————————————————————————— 题目1: 下面不属于基本类型的是:c (选择1项) A) boolean B) long C) String D) byte ...(1)public class Char...

    Java语言程序设计(一)课后习题第十二章(附答案).doc

    a.JScrollPane b.JFrame c.JWindows d.JScrollBar 8.创建下面的GUI,颜色列表框为红色、绿色和蓝色(不必为各组件提供功能)。 参考答案 1.false 2.true 3.标签 4.B D 5.B 6.C 7.D 8. 参考程序如下: import ...

Global site tag (gtag.js) - Google Analytics