Author:Pirate Leo
前段时间我负责在系统中添加了HBase用于管理海量数据,功能实现后自然到了性能测试阶段,性能、可靠性、稳定性,性性都不能少。
因此就有了个内部的小需求:“给测试部提供一个工具,可以向HBase写入数据,以达到测试所需的数据量”。
由于我们的系统是由Java编写,Client的代码也用的Hadoop的Java API,因此小工具的界面编写理所应当的选择了Java Swing。
之前没有用过Swing,本次完全是在网上一边翻博一边编码。
myBlog:http://blog.csdn.net/pirateleo/
myEmail:codeevoship@gmail.com
转载请注明出处,谢谢。
Begin!
首先是成品图:
OK,我知道很丑,咱不就图个实用么……
这里可以输入Hadoop集群的IP,可以选择需要操作的表,可以清空表中的记录,还有写入耗时统计。
下面是代码,代码分为两个文件,一个是MainView负责界面展示;另一个是Worker线程,负责干活和刷新进度条与显示数据。
MainView代码:
package com.codeevoship.gui;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
@SuppressWarnings("serial")
public class MainWindow extends JFrame {
private JLabel welcomeLbl;
private JLabel ipLbl;
private JTextField ipTxt;
private JLabel numLbl;
private JTextField numTxt;
private JProgressBar probar;
private JTextField txtResultShow;
private JRadioButton archiveSel;
private JRadioButton contentSel;
private JRadioButton systemLogSel;
private JRadioButton clearDataSel;
private JButton startBtn;
private JButton exitBtn;
private Thread thdWorker;
public MainWindow() {
// 获取本JFrame的ContentPane
Container contentPane = getContentPane();
GridBagLayout gridbag = new GridBagLayout();
contentPane.setLayout(gridbag);
GridBagConstraints c = new GridBagConstraints();
// Title
welcomeLbl = new JLabel("CodeEvoShip HBase 数据填充工具");
welcomeLbl.setFont(new Font("Serif",Font.BOLD,20));
c = getGridBagConstraints(0, 0, 0, 1, 0, 0,
GridBagConstraints.CENTER, GridBagConstraints.NONE,
new Insets(10, 0, 0, 0), 10, 0);
gridbag.setConstraints(welcomeLbl, c);
contentPane.add(welcomeLbl);
// IP
ipLbl = new JLabel("Cluster IP:");
c = getGridBagConstraints(0, 1, 1, 1, 0, 0,
GridBagConstraints.WEST, GridBagConstraints.NONE,
new Insets(10, 0, 10, 0), 10, 0);
gridbag.setConstraints(ipLbl, c);
contentPane.add(ipLbl);
ipTxt = new JTextField("127.0.0.1;127.0.0.2;127.0.0.3");
c = getGridBagConstraints(1, 1, 0, 1, 0, 0,
GridBagConstraints.WEST, GridBagConstraints.NONE,
new Insets(10, 0, 10, 0), 85, 0);
gridbag.setConstraints(ipTxt, c);
contentPane.add(ipTxt);
// 数量填写
numLbl = new JLabel("Write Number:");
c = getGridBagConstraints(0, 2, 1, 1, 0, 0,
GridBagConstraints.WEST, GridBagConstraints.NONE,
new Insets(10, 0, 10, 0), 10, 0);
gridbag.setConstraints(numLbl, c);
contentPane.add(numLbl);
numTxt = new JTextField("10000");
c = getGridBagConstraints(1, 2, 0, 1, 0, 0,
GridBagConstraints.WEST, GridBagConstraints.NONE,
new Insets(10, 0, 10, 0), 230, 0);
gridbag.setConstraints(numTxt, c);
contentPane.add(numTxt);
// 多选框
archiveSel = new JRadioButton("Archive Table");
c = getGridBagConstraints(0, 3, 1, 1, 0, 0,
GridBagConstraints.WEST, GridBagConstraints.NONE,
new Insets(0, 0, 0, 0), 0, 0);
gridbag.setConstraints(archiveSel, c);
contentPane.add(archiveSel);
contentSel = new JRadioButton("Content Table");
c = getGridBagConstraints(1, 3, 1, 1, 0, 0,
GridBagConstraints.WEST, GridBagConstraints.NONE,
new Insets(0, 0, 0, 0), 0, 0);
gridbag.setConstraints(contentSel, c);
contentPane.add(contentSel);
systemLogSel = new JRadioButton("SystemLog Table");
c = getGridBagConstraints(2, 3, 1, 1, 0, 0,
GridBagConstraints.WEST, GridBagConstraints.NONE,
new Insets(0, 0, 5, 0), 0, 0);
gridbag.setConstraints(systemLogSel, c);
contentPane.add(systemLogSel);
clearDataSel = new JRadioButton("Clear old data of selected Tables!!");
c = getGridBagConstraints(0, 4, 0, 1, 0, 0,
GridBagConstraints.WEST, GridBagConstraints.NONE,
new Insets(0, 0, 15, 0), 0, 0);
gridbag.setConstraints(clearDataSel, c);
contentPane.add(clearDataSel);
// 进度条
probar = new JProgressBar(0, 100);
probar.setStringPainted(true);
c = getGridBagConstraints(0, 6, 0, 1, 0, 0,
GridBagConstraints.WEST, GridBagConstraints.NONE,
new Insets(5, 5, 5, 5), 250, 0);
gridbag.setConstraints(probar, c);
contentPane.add(probar);
txtResultShow = new JTextField("Not Begin");
txtResultShow.setEditable(false);
txtResultShow.setHorizontalAlignment(JTextField.CENTER);
c = getGridBagConstraints(0, 7, 0, 1, 0, 0,
GridBagConstraints.WEST, GridBagConstraints.NONE,
new Insets(0, 0, 5, 0), 325, 0);
gridbag.setConstraints(txtResultShow, c);
contentPane.add(txtResultShow);
//执行与退出
startBtn = new JButton("Start");
c = getGridBagConstraints(0, 5, 0, 1, 0, 0,
GridBagConstraints.WEST, GridBagConstraints.NONE,
new Insets(0, 0, 5, 0), 50, 0);
gridbag.setConstraints(startBtn, c);
startBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if (!paraPassCheck()) {
return;
}
if (null != thdWorker && thdWorker.isAlive()) {
JOptionPane.showMessageDialog(null,"There already is a task running now, please wait");
return;
}
DoWork doWork = new DoWork(ipTxt.getText(),Long.parseLong(numTxt.getText()),
contentSel.isSelected(),archiveSel.isSelected(),
systemLogSel.isSelected(),clearDataSel.isSelected(),
probar, txtResultShow);
thdWorker = new Thread(doWork);
thdWorker.start();
}
});
contentPane.add(startBtn);
exitBtn = new JButton("Exit");
c = getGridBagConstraints(1, 5, 0, 1, 0, 0,
GridBagConstraints.EAST, GridBagConstraints.NONE,
new Insets(0, 0, 5, 0), 50, 0);
gridbag.setConstraints(exitBtn, c);
exitBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
System.exit(0);
}
});
contentPane.add(exitBtn);
}
private boolean paraPassCheck() {
try {
Long.parseLong(numTxt.getText());
return true;
} catch (Exception e) {
JOptionPane.showMessageDialog(null,"Invalid number ");
return false;
}
}
private static GridBagConstraints getGridBagConstraints(int gridx,
int gridy, int gridwidth, int gridheight, double weightx,
double weighty, int anchor, int fill, Insets insets, int ipadx,
int ipady) {
return new GridBagConstraints(gridx, gridy, gridwidth, gridheight,
weightx, weighty, anchor, fill, insets, ipadx, ipady);
}
public static void main(String args[]) {
MainWindow mainWindow = new MainWindow();
mainWindow.setTitle("CodeEvoShip");
mainWindow.pack();
mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainWindow.setVisible(true);
}
}
Worker代码:
package com.codeevoship.gui;
import javax.swing.JProgressBar;
import javax.swing.JTextField;
public class DoWork implements Runnable {
JProgressBar probar;
JTextField curTxtShow;
long totalNum = 0;
long curNum = 0;
long startTime = 0;
long curTime = 0;
public DoWork(String ip, long num, boolean isWriteCon, boolean isWriteArc, boolean isWriteSys, boolean isClearData, JProgressBar probar, JTextField curTxtShow) {
System.out.println("IP:" + ip + ", Num:" + num);
System.out.println("Write Content[" + isWriteCon + "], Write Archive[" + isWriteArc + "], Write SystemLog[" + isWriteSys + "].");
startTime = 0;
curNum = 0;
totalNum = num;
this.probar = probar;
this.curTxtShow = curTxtShow;
}
@Override
public void run() {
startTime = System.currentTimeMillis();
// 开始工作
System.out.println("Do Work Start!");
StringBuilder sb = new StringBuilder();
while (true) {
if (curNum >= totalNum) {
break;
}
try {
// TODO: Real work here
Thread.sleep(10);
// 更新界面显示
curNum += 1;
probar.setValue((int) (curNum*100/totalNum));
curTime = System.currentTimeMillis();
sb.setLength(0);
sb.append(curNum);
sb.append('/');
sb.append(totalNum);
sb.append(" cost time: ");
sb.append((curTime - startTime)/1000);
sb.append('s');
curTxtShow.setText(sb.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("Do Work End!");
}
}
大家如需要可随意使用,改成自己的小工具,只要把Worker中的// TODO: 改为实际运行的程序即可。
分享到:
相关推荐
Java开发基于swing编写的客户端界面简单的考试系统信息管理系统源码.zipJava开发基于swing编写的客户端界面简单的考试系统信息管理系统源码.zipJava开发基于swing编写的客户端界面简单的考试系统信息管理系统源码....
Java Swing实例源码包,包括了JComboBox 、Border、JList、JMenu、JSlider、JTabbedPane、JTable、JToolTip、JTree等常用Swing组件的用法示例,对Java编写界面来说,Swing确实是个不错的选择,希望这些示例能让你更...
该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值 二、技术实现 java Swing 、面向对象 三、系统功能 年月日时间的切换,点击上月或下月直接改变月份 可以直接输入年份数字,...
包含:项目源码、项目文档、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,确保可以运行! 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值 二、技术...
因为Java是一门很优秀的编程语言,具有面向对象、与平台无关、安全、稳定和多线程等特点,所以用Java编程为我们本次程序的编写提供了方便。在设计中我们主要进行了数据库及类的设计,把整系统分成了8个类和2个表。...
使用java swing编写的图形界面贪吃蛇程序,源码很简单,一看就懂啦,非常适合JAVA入门新手做练习使用!也可以当课程大作业
用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字 Java波浪文字,一个利用...
系统介绍 三只松鼠超市管理系统是一款辅助超市管理员管理超市的实用性项目,根据超市的日常管理需要,超市管理系统应包括基本档案管理、采购订货管理、仓库入库管理、仓库出库管理、人员管理、部门管理6大功能。...
本项目是一套基于Java Swing实现的程序员计算器,主要针对计算机相关专业的正在学习java的学生与需要项目实战练习的Java学习者。 包含:项目源码、jar包、exe可执行文件等。 项目都经过严格调试,确保可以运行! 该...
SWING 程序,模仿editplus,检查自己的corejava基础,欢迎大家下载学习,分享学习经验。源码在这个文件里,直接解压出来,就是那4个.java文件了!
一个用java编写的通讯录,可以将记录保存为文件. 注: 图形界面下实现
用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字 Java波浪文字,一个利用...
javaswing编写的一个简单得登陆注册界面,刚接触java一个学期,里面是个人对java对象序列化的理解
Java Swing常用组件应用实例源码,包括一些窗体选项框、Windows的一些任务面板、任务栏等,还附有文档,从事JAVA开发的时候,在编写界面程序时会用得到。
高铁订票系统java源码 StationTicketingSystem 这是一个 Java GUI 系统设计:使用 Java Swing 编写的铁路售票应用系统。 技术栈 所使用到的技术:Java Swing + Java AWT + MySQL 5.5.62 运行截图 登录界面 注册用户 ...
Java 3DMenu 界面源码.rar Java 3D魔方游戏源码及中文注释包.rar Java EJB中有、无状态SessionBean的两个例子 Java Socket 聊天通信演示代码 java Socket通信实现.rar Java Telnet客户端实例源码 Java zip压缩包查看...
此系统采用Java程序设计语言编写,数据库采用MySQL数据库管理系统。自己亲手做完这个项目后发现自己有些地方仍需要加强和改进。而且把以前所学的知识综合运用了一下,在程序设计过程中组员们的帮助也是必不可少的。...
纯Java编写的记事本 包含源码 实现了许多功能例如:定时保存、日历、字数统计,工具栏等一些功能。特别适合初学swing的人员阅读。
(使用MySQL数据库) 题目要求: 1) 创建一个菜单窗口类,菜单子项包括“图书查询”,“图书增加”,“图书修改”,“图书删除”,“退出”五个子项,通过编写事件代码,调用对应的窗体和代码。 2) “图书查询...
学生信息管理系统,使用Java开发。 1、登录界面可以进行登录操作。有俩种权限选择。分别跳转到不同的界面。 2、使用了事件监听、Java操作SQLserver数据库等知识。 3、图形化界面中使用了JTable等组件,将查询结果...