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();
}
});
}
}
效果圖: