关于JAVA滚动条自动滚动的问题
我把JTable加在JScrollPane上,以实现表格的自动滚动。现在要实现这样的一种滚动效果:信息一条一条在定时增加,当一个窗口显示满了,下一条来的时候,不是向上滚动...
我把JTable加在JScrollPane上,以实现表格的自动滚动。
现在要实现这样的一种滚动效果:
信息一条一条在定时增加,当一个窗口显示满了,下一条来的时候,不是向上滚动一条,而是滚动一页。也就是说,这一条不是顶着窗口底,而是下面有空余。
由于表格只有这么大,要让滚动条定位到表格没到的地方,我不知道该怎么做。。。
JTable加在JScrollPane上,滚动条scrollbar.getMaximum(),最大就是table的长度,现在就是要让滚动条设置到超过table长度的地方。
就是yang163_yang说的意思。 展开
现在要实现这样的一种滚动效果:
信息一条一条在定时增加,当一个窗口显示满了,下一条来的时候,不是向上滚动一条,而是滚动一页。也就是说,这一条不是顶着窗口底,而是下面有空余。
由于表格只有这么大,要让滚动条定位到表格没到的地方,我不知道该怎么做。。。
JTable加在JScrollPane上,滚动条scrollbar.getMaximum(),最大就是table的长度,现在就是要让滚动条设置到超过table长度的地方。
就是yang163_yang说的意思。 展开
3个回答
展开全部
import java.io.*;
import java.util.Hashtable;
import java.util.Vector;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
public class T extends JFrame {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
new T();
}
JButton btnA = new JButton("add");
JTable tab = new JTable();
JScrollBar bar = new JScrollBar();
JScrollPane sp = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_NEVER,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
int row = 0;
Vector<Hashtable<String,String>> data = new Vector<Hashtable<String,String>>();
int page;
int totalPage;
int pageSize = 20;
int displayCount;
public T() {
super("table");
this.setSize(400,400);
this.setLayout(new BorderLayout());
this.add(btnA,BorderLayout.SOUTH);
JPanel p = new JPanel(new BorderLayout());
//p.add(sp,BorderLayout.CENTER);
//p.add(bar,BorderLayout.EAST);
bar.addAdjustmentListener(new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent e) {
page = bar.getValue();
System.out.println(e.getAdjustmentType());
refresh(false);
}
});
bar.setUnitIncrement(1);
bar.setMinimum(1);
bar.setMaximum(1);
bar.setValue(1);
sp.setViewportView(tab);
//sp.setVerticalScrollBar(bar);
//sp.revalidate();
//bar.revalidate();
p.add(sp,BorderLayout.CENTER);
p.add(bar,BorderLayout.EAST);
this.add(p,BorderLayout.CENTER);
tab.setModel(new TModel());
btnA.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Hashtable<String,String> h = new Hashtable<String,String>();
h.put("a", "aa");
h.put("b", "bb");
data.add(h);
refresh(true);
bar.setValue(page);
bar.setMaximum(totalPage);
bar.revalidate();
bar.repaint();
}
});
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.setVisible(true);
}
void refresh(boolean end) {
totalPage = data.size()/pageSize;
if(data.size()%pageSize!=0)totalPage++;
if(end)page = totalPage;
displayCount = (data.size()-(page-1)*pageSize)>pageSize?pageSize:data.size()-(page-1)*pageSize;
if(page==0)displayCount = 0;
System.out.println(displayCount);
//System.out.println(data.size()+","+totalPage+","+page+","+displayCount);
tab.revalidate();
this.repaint();
}
class TModel extends AbstractTableModel {
public int getColumnCount() {
return 2;
}
public int getRowCount() {
return displayCount;
}
public Object getValueAt(int rowIndex, int columnIndex) {
int dataIndex = (page-1)*pageSize+rowIndex;
if(dataIndex>=data.size()||dataIndex<0)return null;
else {
Hashtable<String,String> h = data.get(dataIndex);
switch(columnIndex) {
case 0:return h.get("a");
case 1:return h.get("b");
default:return null;
}
}
}
}
}
不想搞了,就这样了,因为对scrollbar的事件监听不太懂,添加数据超过一页时要再添加第2个才换页,你看大致效果是不是你想要的了。
import java.util.Hashtable;
import java.util.Vector;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
public class T extends JFrame {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
new T();
}
JButton btnA = new JButton("add");
JTable tab = new JTable();
JScrollBar bar = new JScrollBar();
JScrollPane sp = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_NEVER,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
int row = 0;
Vector<Hashtable<String,String>> data = new Vector<Hashtable<String,String>>();
int page;
int totalPage;
int pageSize = 20;
int displayCount;
public T() {
super("table");
this.setSize(400,400);
this.setLayout(new BorderLayout());
this.add(btnA,BorderLayout.SOUTH);
JPanel p = new JPanel(new BorderLayout());
//p.add(sp,BorderLayout.CENTER);
//p.add(bar,BorderLayout.EAST);
bar.addAdjustmentListener(new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent e) {
page = bar.getValue();
System.out.println(e.getAdjustmentType());
refresh(false);
}
});
bar.setUnitIncrement(1);
bar.setMinimum(1);
bar.setMaximum(1);
bar.setValue(1);
sp.setViewportView(tab);
//sp.setVerticalScrollBar(bar);
//sp.revalidate();
//bar.revalidate();
p.add(sp,BorderLayout.CENTER);
p.add(bar,BorderLayout.EAST);
this.add(p,BorderLayout.CENTER);
tab.setModel(new TModel());
btnA.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Hashtable<String,String> h = new Hashtable<String,String>();
h.put("a", "aa");
h.put("b", "bb");
data.add(h);
refresh(true);
bar.setValue(page);
bar.setMaximum(totalPage);
bar.revalidate();
bar.repaint();
}
});
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.setVisible(true);
}
void refresh(boolean end) {
totalPage = data.size()/pageSize;
if(data.size()%pageSize!=0)totalPage++;
if(end)page = totalPage;
displayCount = (data.size()-(page-1)*pageSize)>pageSize?pageSize:data.size()-(page-1)*pageSize;
if(page==0)displayCount = 0;
System.out.println(displayCount);
//System.out.println(data.size()+","+totalPage+","+page+","+displayCount);
tab.revalidate();
this.repaint();
}
class TModel extends AbstractTableModel {
public int getColumnCount() {
return 2;
}
public int getRowCount() {
return displayCount;
}
public Object getValueAt(int rowIndex, int columnIndex) {
int dataIndex = (page-1)*pageSize+rowIndex;
if(dataIndex>=data.size()||dataIndex<0)return null;
else {
Hashtable<String,String> h = data.get(dataIndex);
switch(columnIndex) {
case 0:return h.get("a");
case 1:return h.get("b");
default:return null;
}
}
}
}
}
不想搞了,就这样了,因为对scrollbar的事件监听不太懂,添加数据超过一页时要再添加第2个才换页,你看大致效果是不是你想要的了。
展开全部
我的思路是先在JTable的后蚂唯面插入空字符“”
插到一屏局物老幕的位置,然后再用滚动条滚桐升动。
这样功能就实现了。不过只是初步设想。。。。
提供一些思路吼吼~
插到一屏局物老幕的位置,然后再用滚动条滚桐升动。
这样功能就实现了。不过只是初步设想。。。。
提供一些思路吼吼~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
能实现这样的滚动吗?
我要研究一下。。
我要研究一下。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询