Java語言程序設計課程實驗題目 第九次實驗

Java語言程序設計課程實驗題目

第九次實驗

 

1. 在Eclipse或NetBeans中輸入並觀察以下代碼,分析該段程序的作用。

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class PopupExample extends JPanel {

    static JFrame myFrame;

    protected JLabel label;

    JPopupMenu popup;

    public PopupExample(){

        label = new JLabel ("Hello World!");

        this.setBackground(Color.blue);

        add(label);

        popup = new JPopupMenu();

        //create the first menu item

       JMenuItem menuItem1 = new JMenuItem("Open");

        menuItem1.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent ae){

                label.setText("Open");

            }

        });

        //create the second menu item

       JMenuItem menuItem2 = new JMenuItem("Save");

        menuItem2.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent ae){

                label.setText("Save");

            }

        });

        //add the menu items to the popup menu

        popup.add(menuItem1);

        popup.add(menuItem2);

        addMouseListener(new MouseAdapter(){

            public void mouseReleased(MouseEvent evt){

                //Popup the menu at the location where the mouse was pressed

                if (evt.isPopupTrigger()){

                popup.show(evt.getComponent(),evt.getX(),evt.getY());

                }

            }

        });

    }

    public static void main(String args[]){

        myFrame = new JFrame("Popup Example");

        PopupExample example = new PopupExample();

       myFrame.getContentPane().add("Center",example);

        myFrame.setSize(300,75);   

        myFrame.addWindowListener(new WindowAdapter() {

           public void windowClosing(WindowEvent e) {System.exit(0);}

        });

        myFrame.setVisible(true);

    }

}

 

2. 在IDE中輸入並觀察以下代碼,分析該段程序的作用。

public class TwoThree {

         public static void main(String args[]) {

                   char a[][] = new char[5][5];

                   int i, j, k = 0;

                   for (i = 0; i < a.length; i++) {

                            for (j = 0; j < a[i].length; j++) {

                                     if ((i + j) < 5) {

                                               a[i][j] = (char) ('a' + k);

                                     } else {

                                               a[i][j] = 'A';

                                               continue;

                                     }

                                     k++;

                            }

                   }

                   for (i = 0; i < a.length; i++) {

                            for (j = 0; j < a[i].length; j++) {

                                     System.out.print(a[i][j] + " ");

                            }

                            System.out.println();

                   }

         }

}

 

3. 編寫程序。

基於Swing圖形化界面設計以及多線程方面的知識構建彩票抽獎系統。

通過程序實現,達到以下方面的要求:

(1)在1-36(包含1和36)範圍內隨機生成6個互不相同的整數;

(2)將6個數字顯示在圖形化界面上,程序的初始效果如下圖所示:

 

 

(3)在初始界面,點擊Start按鈕,則該按鈕的顯示變爲Stop。此時,按鈕上方的六個數字將被更新爲6個生成的隨機數,如果此時不點擊Stop按鈕,則上述六個數字將持續更新;

 

(4)當點擊Stop按鈕,則該按鈕的顯示變爲Start,並且上述處於持續更新的六個數字將停止更新,顯示爲六個確定的彼此不相同的數字。

 

1、

package org.cust.test9;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class PopupExample extends JPanel {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	static JFrame myFrame;
	protected JLabel label;
	JPopupMenu popup;
  	public PopupExample(){
	    label = new JLabel ("Hello World!");
	    this.setBackground(Color.blue);
	    add(label);
	    popup = new JPopupMenu();
	    //create the first menu item
	    JMenuItem menuItem1 = new JMenuItem("Open");
	    menuItem1.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent ae){
				label.setText("Open");
			}
	    });
	    //create the second menu item
	    JMenuItem menuItem2 = new JMenuItem("Save");
	    menuItem2.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent ae){
				label.setText("Save");
			}
		});
	    //add the menu items to the popup menu
	    popup.add(menuItem1);
	    popup.add(menuItem2);
	    addMouseListener(new MouseAdapter(){
			public void mouseReleased(MouseEvent evt){
				//Popup the menu at the location where the mouse was pressed
				//此處方法參數,鼠標右鍵則觸發爲真,並使菜單出現在鼠標右鍵點擊位置
				if (evt.isPopupTrigger()){
					popup.show(evt.getComponent(),evt.getX(),evt.getY());
				}
			}
	    });
  	}
	public static void main(String args[]){
		myFrame = new JFrame("Popup Example");
		PopupExample example = new PopupExample();
		myFrame.getContentPane().add("Center",example);
		myFrame.setSize(1000,800);    
		myFrame.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {System.exit(0);}
		});
		myFrame.setVisible(true);
	}
}
//一個JLabel標籤顯示helloworld
//這個JPanel背景顏色設置爲藍色,再內含與一個靜態JFrame
//最後通過JPopupMenu+MouseListener監聽中的mouseReleased(鼠標釋放)實現鼠標右鍵彈出菜單

2、

package org.cust.test9;

public class TwoThree {
	public static void main(String args[]) {
		char a[][] = new char[5][5];
		int i, j, k = 0;

		// 此處起往字符數組a存值

		for (i = 0; i < a.length; i++) {
			for (j = 0; j < a[i].length; j++) {

				// 此處起控制對角線分割元素值
				// 對角線左邊包括對角線爲a到o
				if ((i + j) < 5) {
					// 通過增加字符的ASII值再強行轉換爲char實現字母的順序轉換存儲
					a[i][j] = (char) ('a' + k);
				} else {
					// 對角線右邊不包括對角線儲存爲'A'
					a[i][j] = 'A';
					// 結束當成循環,防止k自增導致字母順序錯亂
					continue;
				}
				k++;
			}
		}

		// 此處起遍歷字符數組a中所有元素
		// 每個元素輸出後加空格,輸出完一行元素就轉行
		for (i = 0; i < a.length; i++) {
			for (j = 0; j < a[i].length; j++) {
				System.out.print(a[i][j] + " ");
			}
			System.out.println();
		}
	}
}

3、

package org.cust.test9;

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.InvocationTargetException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Lottery extends JFrame implements ActionListener, Runnable {

	// 靜態按鈕
	static JButton jb;
	// 靜態標籤
	static JLabel jlb;
	// 用作窗體裏的行級內容作爲填充
	JPanel jp1, jp2, jp3, jp4, jp5, jp6;

	// 用作存儲六個隨機數的數組
	static int numArray[] = new int[6];
	// 用作達成程序啓動時初始顯示效果0 0 0 0 0 0
	static String numS[] = new String[] { "0", "0", "0", "0", "0", "0" };

	static String result = numS[0] + "   " + numS[1] + "   " + numS[2] + "   " + numS[3] + "   " + numS[4] + "   "
			+ numS[5] + "   ";
	// 靜態線程
	static Thread td;
	// 線程運行判斷
	static boolean runJudge = true;

	public Lottery() {
		// 構造函數內初始化各類標籤
		jb = new JButton("Start");
		// 此處放置監聽
		jb.addActionListener(this);
		// 設置標籤內容爲result的String類型字符串
		jlb = new JLabel(result);
		// 自定義大小
		jb.setPreferredSize(new Dimension(160, 80));
		// jlb.setPreferredSize(new Dimension(170,80));
		// 自定義字體樣式
		jb.setFont(new java.awt.Font("楷書", 3, 33));
		jlb.setFont(new java.awt.Font("楷書", 3, 33));

		jp1 = new JPanel();
		jp2 = new JPanel();
		jp3 = new JPanel();
		jp4 = new JPanel();
		jp5 = new JPanel();
		jp6 = new JPanel();
		// 初始化線程
		td = new Thread(this);
		// 將按鈕和文本顯示標籤填入JPanel
		jp2.add(jlb);
		jp3.add(jb);
		// 將JPanel填入窗體JFrame

		this.add(jp1);
		this.add(jp4);
		this.add(jp2);
		this.add(jp3);
		this.add(jp5);
		this.add(jp6);
		// 設置排列格式6行一列
		this.setLayout(new GridLayout(6, 1));
		// 設置標題
		this.setTitle("Lottery");
		// 設置窗體大小
		this.setSize(800, 600);
		// 設置初始化相對位置爲窗體居中
		this.setLocationRelativeTo(null);
		// 設置窗體可調節大小
		this.setResizable(true);
		// 設置窗體爲可見
		this.setVisible(true);

	}

	public static void getResult() {
		// 隨機數類
		Random rand = new Random();
		// HashSet集合類,用集合內元素的互異性來存儲保證6個不同的1-36的數,
		// 之所以加1是因爲這個方法裏面是從0開始到36)的正型數據,就是是開區間
		HashSet<Integer> hash = new HashSet<Integer>();
		boolean b = true;
		while (b) {
			// 死循環
			// 取1-36的整型整數,加1是因爲默認是到
			int i = rand.nextInt(36) + 1;
			// 將取得的數作爲元素存入Hashset集合對象hash,若有與之前存入元素相同則不會存入
			hash.add(i);
			// 當集合內元素個數爲6個時,設置b=false,跳出死循環
			if (hash.size() == 6) {
				b = false;
			}
		}
		// 迭代器取出hash中的元素給numArray

		// hash中的元素讀到了it裏
		Iterator<Integer> it = hash.iterator();
		int j = 0;
		// 當it裏有元素就爲真值,則.next()取出
		while (it.hasNext()) {
			numArray[j] = it.next();
			j++;
		}
		for (int k = 0; k < numArray.length; k++) {
			// 直接加"",由int轉換爲String
			numS[k] = numArray[k] + "";
		}
		result = "";
		for (int q = 0; q < numS.length; q++) {
			// 加空格,爲了顯示效果不擠在一起
			result += numS[q] + "   ";
		}
		// 設置jlb的文本內容,也就是顯示6位 1-36的隨機數
		jlb.setText(result);

	}

	// 動作監聽
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		// 如果點擊Start按鈕
		if (e.getActionCommand() == "Start") {
			if (runJudge) {
				// 控制檯輸出Start
				System.out.println("Start");
				// 改按鈕文本內容爲Stop
				jb.setText("Stop");
				// 線程td開始
				td.start();
			} else {
				// 如果runJudge爲false,就是上一次操作是點了Stop
				// 控制檯輸出Start
				System.out.println("Start");
				// 一樣,改按鈕文本內容爲Stop
				jb.setText("Stop");
				// 把線程判斷改爲true,重新執行隨機數滾動
				runJudge = true;
			}

			// 以下類似
		} else if (e.getActionCommand() == "Stop") {

			System.out.println("Stop");
			jb.setText("Start");
			runJudge = false;
		}

	}

	// 實現Runnable接口後的抽象方法重寫
	@Override
	public void run() {
		// TODO Auto-generated method stub
		// 死循環,一直跑隨機數,一直調用getResult,獲取不同隨機數並顯示
		while (true) {
			// runJudge若爲真則,隨機數滾動
			if (runJudge) {
				// 調用此方法
				this.getResult();
				try {
					// 線程睡眠200毫秒也就是0.2秒跑一次循環
					Thread.sleep(200);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}

			} else {// 如果線程判斷runJudge爲假,讓它一直睡眠,0.1秒睡眠一次(一次0.1秒)也就是一直睡眠,因爲上面是死循環
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}

			}
		}

	}

	public static void main(String[] args) throws InvocationTargetException, InterruptedException {
		EventQueue.invokeAndWait(new Runnable() {
			// 這樣運行是因爲swing的不穩定性
			@Override
			public void run() {
				// TODO Auto-generated method stub
				// 因爲這個類本身就是JFrame的子類,本身就是一個窗體
				// 而且各種控件都在本類的構造函數完成初始化和佈局
				// 所以本身創造對象同時會初始化(也就是調用構造函數,這裏設置只有無參,必調用)
				// 所以main方法裏初始化本類對象就可以了
				Lottery lottery = new Lottery();
			}

		});
	}

}

效果圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章