怎么在JScrollPane中承载不同组件,显示不同表格?

简介: 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
在这里插入图片描述
到这里本次实验就结束了,小编不才,希望可以帮助到大家。

发布了38 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43851639/article/details/93168467