简介: JScrollPane 是 java 中滚动条组件,当我们的界面内容太多,界面无法容纳下所有内容,这时就需要用上 JScrollPane 组件了,它是一个容器,可以让界面带有滚动条,将界面外的内容滑入界面中。
缺点:只能放一个组件。
效果图请看文章结尾
1.那怎么让 JScrollPane 放更多组件呢?
其实也只能放一个组件,但我们知道 JPanel 可以嵌套,我们可以把我们需要的组件放入一个 JPanel 中,然后再把 JPanel 放入 JScrollPane 中,这样看起来在滚动面板中放置了很多组件。
2.怎么在 JScrollPane 中显示不同组件,比如切换显示不同的表格(JTable)?
//jsp是 JScrollPane 对象,table是 JTable 对象
jsp.getViewport().add(table);
3.表格的点击事件
//通过鼠标事件来实现
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
//双击表格
if (e.getClickCount() == 2) {
System.out.println("表格双击点击事件");
}
}
});
下面结合一个具体例子,实现在 JScrollPane 显示不同组件,不同表格。
窗体构造类如下:
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class JSPTest extends JFrame implements ActionListener{
//面板
JPanel button_jp; //顶部按钮面板
JPanel inJSP_jp; //在JScrollPane中面板
//滚动容器
JScrollPane jsp;
//表格
JTable table;
//按钮
JButton table_btn1; //显示表格按钮
JButton table_btn2;
JButton lb_btn; //显示标签和输入框按钮
//Constructor
public JSPTest() {
init();
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//界面初始化函数
private void init() {
//组件构造
button_jp = new JPanel();
inJSP_jp = new JPanel();
//设置inJSP_jp布局为网格布局,16行1列
inJSP_jp.setLayout(new GridLayout(20,1));
for (int i=0; i<20; i++) {
JLabel lable = new JLabel("标签" + i);
inJSP_jp.add(lable);
}
jsp = new JScrollPane(inJSP_jp);
table = new JTable();
table_btn1 = new JButton("显示表格1");
table_btn2 = new JButton("显示表格2");
lb_btn = new JButton("显示标签");
//注册监听
table_btn1.addActionListener(this);
table_btn2.addActionListener(this);
lb_btn.addActionListener(this);
//按钮加入button_jp面板
button_jp.add(table_btn1);
button_jp.add(table_btn2);
button_jp.add(lb_btn);
this.add(button_jp,BorderLayout.NORTH);
this.add(jsp);
}
//按钮监听
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == lb_btn) {
//显示标签布局
jsp.getViewport().add(inJSP_jp);
} else if (e.getSource() == table_btn1) {
TableModel model = new TableModel(1);
table.setModel(model);
jsp.getViewport().add(table);
//表格的双击点击事件
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
//双击表格
if (e.getClickCount() == 2) {
System.out.println("表格双击点击事件");
}
}
});
} else if (e.getSource() == table_btn2) {
TableModel model = new TableModel(2);
table.setModel(model);
jsp.getViewport().add(table);
}
}
public static void main(String[] args) {
JSPTest test = new JSPTest();
test.setBounds(200,200,500,300);
test.setTitle("JScrollPane实验");
}
}
表格构造类如下,需要继承 AbstractTableModel 类。
import java.util.Vector;
import javax.swing.table.AbstractTableModel;
public class TableModel extends AbstractTableModel {
int select;
Vector rowData; //数据行
Vector columnNames; //列名
//Constructor
public TableModel(int num) {
this.select = num;
columnNames = new Vector();
if (select == 1) {
columnNames.add("考号");
columnNames.add("政治成绩");
columnNames.add("英语成绩");
columnNames.add("专业课成绩");
//数据记录
rowData = new Vector();
for (int i=0; i<20; i++) {
Vector rowDataItem = new Vector();
rowDataItem.add("考号" + i);
rowDataItem.add("政治成绩" + i);
rowDataItem.add("英语成绩" + i);
rowDataItem.add("专业课成绩" + i);
rowData.add(rowDataItem);
}
} else if (select == 2) {
columnNames.add("考号");
columnNames.add("姓名");
columnNames.add("专业");
columnNames.add("初试成绩");
columnNames.add("复试成绩");
columnNames.add("总成绩");
columnNames.add("平均成绩");
//数据记录
rowData = new Vector();
for (int i=0; i<20; i++) {
Vector rowDataItem = new Vector();
rowDataItem.add("考号" + i);
rowDataItem.add("姓名" + i);
rowDataItem.add("专业" + i);
rowDataItem.add("初试成绩" + i);
rowDataItem.add("复试成绩" + i);
rowDataItem.add("总成绩" + i);
rowDataItem.add("平均成绩" + i);
rowData.add(rowDataItem);
}
}
}
@Override
public int getRowCount() {
return rowData.size();
}
@Override
public int getColumnCount() {
return columnNames.size();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return ((Vector)(rowData.get(rowIndex))).get(columnIndex);
}
@Override
public String getColumnName(int columnIndex) {
return (String)columnNames.get(columnIndex);
}
}
效果如下:
在 JScrollPane 中显示标签
在 JScrollPane 中显示表格1
在 JScrollPane 中显示表格2
到这里本次实验就结束了,小编不才,希望可以帮助到大家。