用Java Swing编写简单的测试小工具界面(源码) 分类: Java 2015-07-30 10:49 23人阅读 评论(0) 收藏

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: 改为实际运行的程序即可。

原文地址:https://www.cnblogs.com/xieping/p/4714154.html