1. 程式人生 > >狄慧201771010104《面向物件程式設計(java)》第十四周學習總結

狄慧201771010104《面向物件程式設計(java)》第十四周學習總結

實驗十四  Swing圖形介面元件

實驗時間 20178-11-29

一、知識點總結

1.模型-檢視-控制器模式
模型:儲存內容
檢視:顯示內容
控制器:處理使用者輸入

2.佈局管理

1>局管理器(FlowLayout)
JPanel物件的預設佈局管理器為FlowLayout,元件加入JPanel中總是處於中央,一行可以排列多個元件,如果一行的空間容納不下所有的元件則換行。當頂層視窗縮放時,JPanel中元件的大小不會隨之縮放。
2>邊框佈局管理器(BorderLayout)
是JFrame的內容窗格的預設佈局管理器,可以選擇將空間放在內容窗格的東、南、西、北、中。 且將元件加入其中時,元件會充滿其對應的整個區域,如果在這個方位再加入一個元件,會覆蓋原本存在的元件。當頂層視窗縮放時,東南西北的元件不會隨之變化,中部的元件會等比例變化。
如果要在某方法並排加入幾個元件,則可以先將元件加入JPanel中,再放入邊框佈局管理器。
BorderLayout的常量定義為字串

frame.add(new JButton("Yes"),BorderLayout.SOUTH);
3>網格佈局(Grid Layout)
佈局類似於表格,每個單元大小一致,當頂層視窗縮放時元件大小也隨之變化,但是尺寸比例保持一致。

frame.SetLayout(new GridLayout(4,4));//形成4x4的網格
frame.add(new JButton("1"));
GridLayout(int r,int c) 引數之一可以為0,但是不能同時為0
GridLayout(int r,int c,int hgap,int vgap) hgap表示單元之間的水平間距,vgap表示單元之間的垂直間距

3.文字輸入
1>擴充套件於JTextComponent的JTextField和JTextArea
JTextField和JTextArea都用於文字輸入,其中JTextField接收單行文字的輸入,而JTextArea可接收多行文字的輸入。

列數為文字域的寬度,如果希望文字域最多能輸入N個字元,則將寬度設定為N

JTextField text = new JTextField("Input Here",20);

第二個建構函式可以指定文字區顯示的行數和列數。如果需要設定滾動條,則需要將文字區加入JScrollPane中,再講JScrollPane插入容器。

JTextArea area = new TextArea(4,10);
JScrollPane pane = new JScrollPane(area);
panel.add(pane);
2>擴充套件於JTextField的JPasswordField
接受單行輸入,輸入字元被特殊字元掩蓋

3>JLabel
沒有任何修飾,不能響應使用者輸入,只是容納文字的元件。可以設定標籤的顯示文字、圖示以及對其方式

其中對其方式是SwingConstants裡的常量,如LEFT/RIGHT/CENTER等

JLabel label = new JLabel("User Name:",SwingConstants.RIGHT);
4.選擇元件
1>JCheckBox
複選框自動帶有標籤和圖示,在構造時可以提供,當用戶選中複選框時會觸發動作事件。

JCheckBox box = new JCheckBox("Bold");
box.setSelected(true);
2>單選鈕(JRadioButton)
自帶標籤和圖示。單選鈕只能多選其一,要打到這種效果需要把所有的單選鈕加入ButtonGroup的物件裡,從而使得新按鈕被按下時,取消前一個選中的按鈕的狀態。ButtonGroup直接擴充套件於Object類,所以單選鈕需加入容器中進行佈局,ButtonGroup和容器(如JPanel)是相互獨立的。
選中時觸發動作事件。
3>邊框(Border)
任何繼承自JComponent的元件都可以使用邊框(void setBorder(Border b))。常用的方法是將元件放入容器中,然後容器使用邊框。是通過呼叫BorderFactory的靜態方法構建邊框。
同時可以為邊框設定標題:

Border etch = BorderFactory.createEtchedBorder();
Border title = BorderFactory.createTitleBorder(etch,"Title");
panel.setBorder(title);
4>組合框
JComboBox< T>是泛型類,構建時需注意。
組合框不僅有下拉選擇的功能,還具有文字框編輯的功能。
獲得當前選中內容:

combo.getItemAt(combo.getSelectedIndex());
//Object getItemAt(int index)
當用戶從組合框中選中一個選項時,組合框就會產生一個動作事件。

5>.條(JSlider)
滑動條在構造時預設是橫向,如果需要縱向滑動條:

JSlider s = new JSlider(SwingConstants.VERTICAL,min,max,initialValue);
當滑動條滑動時,會觸發ChangeEvent,需要呼叫addChangeListener()並且安裝一個實現了ChangeListener介面的物件。這個介面只有一個StateChanged方法

//得到滑動條的當前值
ChangeListener listen = event ->{
JSlider s = (JSlider)event.getSource();
int val = s.getValue();
...
};
如果需要顯示滑動條的刻度,則setPaintTicks(true);
如果要將滑動條強制對準刻度,則setSnapToTicks(true);
如果要為滑動條設定標籤,則需要先構建一個Hashtable< Integer,Component>,將數字與標籤對應起來,再呼叫setLabelTable(Dictionary label);

5.複雜的佈局管理
1>GridBagLayout(網格組佈局)
即沒有限制的網格佈局,行和列的尺寸可以改變,且單元格可以合併
過程:
1)建議一個GridBagLayout物件,不需要指定行列數
2)將容器setLayout為GBL物件
3)為每個元件建立GridBagConstraints物件,即約束元件的大小以及排放方式
4)通過add(component,constraints)增加元件
使用幫助類來管理約束會方便很多。
2>不使用佈局管理器

frame.setLayout(null);
JButton btn = new JButton("Yes");
frame.add(btn);
btn.setBounds(10,10,100,30);
//void setBounds(int x,int y,int width,int height)//x,y表示左上角的座標,width/height表示元件寬和高,Component類的方法
3>元件的遍歷順序(焦點的順序):從左至右從上到下

component.setFocusable(false);//元件不設定焦點
6.選單
分為JMenuBar/JMenu/JMenuItem,當選擇選單項時會觸發一個動作事件,需要註冊監聽器監聽

7.對話方塊
對話方塊分為模式對話方塊和無模對話方塊,模式對話方塊就是未處理此對話方塊之前不允許與其他視窗互動。
1>JOptionPane
提供了四個用靜態方法(showxxxx)顯示的對話方塊:
構造對話方塊的步驟:
1)選擇對話方塊型別(訊息、確認、選擇、輸入)
2)選擇訊息型別(String/Icon/Component/Object[]/任何其他物件)
3)選擇圖示(ERROR_MESSAGE/INFORMATION_MESSAGE/WARNING_MESSAGE/QUESTION_MESSAGE/PLAIN_MESSAGE)
4)對於確認對話方塊,選擇按鈕型別(DEFAULT_OPTION/YES_NO_OPTION/YES_NO_CANCEL_OPTION/OK_CANCEL_OPTION)
5)對於選項對話方塊,選擇選項(String/Icon/Component)
6)對於輸入對話方塊,選擇文字框或組合框
確認對話方塊和選擇對話方塊呼叫後會返回按鈕值或被選的選項的索引值
2>JDialog類
可以自己建立對話方塊,需呼叫超類JDialog類的構造器

public aboutD extends JDialog
{
public aboutD(JFrame owner)
{
super(owner,"About Text",true);
....
}
}
構造JDialog類後需要setVisible才能時視窗可見

if(dialog == null)
dialog = new JDialog();
dialog.setVisible(true);
3>檔案對話方塊(JFileChooser類)
4>顏色對話方塊(JColorChooser類)

二、實驗內容

1、實驗目的與要求

(1) 掌握GUI佈局管理器用法;

(2) 掌握各類Java Swing元件用途及常用API;

2、實驗內容和步驟

實驗1: 匯入第12示例程式,測試程式並進行組內討論。

測試程式1

elipse IDE中執行教材479頁程式12-1,結合執行結果理解程式;

掌握各種佈局管理器的用法;

理解GUI介面中事件處理技術的用途。

在佈局管理應用程式碼處添加註釋;

測試程式2

elipse IDE中除錯執行教材486頁程式12-2,結合執行結果理解程式;

掌握各種文字元件的用法;

記錄示例程式碼閱讀理解中存在的問題與疑惑。

測試程式3

elipse IDE中除錯執行教材489頁程式12-3,結合執行結果理解程式;

掌握複選框元件的用法;

記錄示例程式碼閱讀理解中存在的問題與疑惑。

測試程式4

elipse IDE中除錯執行教材491頁程式12-4,執行結果理解程式;

掌握單選按鈕元件的用法;

記錄示例程式碼閱讀理解中存在的問題與疑惑。

測試程式5

elipse IDE中除錯執行教材494頁程式12-5,結合執行結果理解程式;

掌握邊框的用法;

記錄示例程式碼閱讀理解中存在的問題與疑惑。

測試程式6

elipse IDE中除錯執行教材498頁程式12-6,結合執行結果理解程式;

掌握組合框元件的用法;

記錄示例程式碼閱讀理解中存在的問題與疑惑。

測試程式7

elipse IDE中除錯執行教材501頁程式12-7,結合執行結果理解程式;

掌握滑動條元件的用法;

記錄示例程式碼閱讀理解中存在的問題與疑惑。

測試程式8

elipse IDE中除錯執行教材512頁程式12-8,結合執行結果理解程式;

掌握選單的建立、選單事件監聽器、複選框和單選按鈕選單項、彈出選單以及快捷鍵和加速器的用法。

記錄示例程式碼閱讀理解中存在的問題與疑惑。

測試程式9

elipse IDE中除錯執行教材517頁程式12-9,結合執行結果理解程式;

掌握工具欄和工具提示的用法;

記錄示例程式碼閱讀理解中存在的問題與疑惑。

測試程式10

elipse IDE中除錯執行教材524頁程式12-1012-11,結合執行結果理解程式,瞭解GridbagLayout的用法。

elipse IDE中除錯執行教材533頁程式12-12,結合程式執行結果理解程式,瞭解GroupLayout的用法。

記錄示例程式碼閱讀理解中存在的問題與疑惑。

測試程式11

elipse IDE中除錯執行教材539頁程式12-1312-14,結合執行結果理解程式;

掌握定製佈局管理器的用法。

記錄示例程式碼閱讀理解中存在的問題與疑惑。

測試程式12

elipse IDE中除錯執行教材544頁程式12-1512-16,結合執行結果理解程式;

掌握選項對話方塊的用法。

記錄示例程式碼閱讀理解中存在的問題與疑惑。

測試程式13

elipse IDE中除錯執行教材552頁程式12-1712-18,結合執行結果理解程式;

掌握對話方塊的建立方法;

記錄示例程式碼閱讀理解中存在的問題與疑惑。

測試程式14

elipse IDE中除錯執行教材556頁程式12-1912-20,結合執行結果理解程式;

掌握對話方塊的資料交換用法;

記錄示例程式碼閱讀理解中存在的問題與疑惑。

測試程式15

elipse IDE中除錯執行教材556頁程式12-21、12-2212-23,結合程式執行結果理解程式;

掌握檔案對話方塊的用法;

記錄示例程式碼閱讀理解中存在的問題與疑惑。

測試程式16

elipse IDE中除錯執行教材570頁程式12-24,結合執行結果理解程式;

瞭解顏色選擇器的用法。

記錄示例程式碼閱讀理解中存在的問題與疑惑。

實驗2組內討論反思本組負責程式,理解程式總體結構,梳理程式GUI設計中應用的相關元件,整理相關元件的API,對程式中元件應用的相關程式碼添加註釋。

 

package menu;

import java.awt.event.*;
import javax.swing.*;

/**
 * 帶有示例選單欄的框架。
 */
public class MenuFrame extends JFrame
{
   private static final int DEFAULT_WIDTH = 300;
   private static final int DEFAULT_HEIGHT = 200;
   private Action saveAction;//
   private Action saveAsAction;
   private JCheckBoxMenuItem readonlyItem;//用給定的readonlyItem標籤構造一個複選框選單項
   private JPopupMenu popup;//彈出選單

   /**
    * 將操作名稱列印到System.out的示例操作
    */
   class TestAction extends AbstractAction
   {
      public TestAction(String name)
      {
         super(name);
      }

      public void actionPerformed(ActionEvent event)
      {
         System.out.println(getValue(Action.NAME) + " selected.");//實現介面方法
      }
   }

   public MenuFrame()
   {
      setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

      JMenu fileMenu = new JMenu("File");//選單物件
      fileMenu.add(new TestAction("New"));//將TestAction物件新增到選單中

      // 演示加速器

      JMenuItem openItem = fileMenu.add(new TestAction("Open"));
      openItem.setAccelerator(KeyStroke.getKeyStroke("ctrl O"));//呼叫setAccelerator方法將加速器鍵關聯到一個選單項上,使用KeyStroke型別的物件作為引數,將CTRL+O關聯到OpenItem選單項

      fileMenu.addSeparator();//Jmenu的一個方法將新分隔符追加到選單的末尾。 

      saveAction = new TestAction("Save");
      JMenuItem saveItem = fileMenu.add(saveAction);
      saveItem.setAccelerator(KeyStroke.getKeyStroke("ctrl S"));

      saveAsAction = new TestAction("Save As");//將要執行的行為賦值給選單子項
      fileMenu.add(saveAsAction);
      fileMenu.addSeparator();

      fileMenu.add(new TestAction("Exit")// AbstractAction或者TestAction都可以,,,因為子類繼承了出構造器外的所有方法
         {
            public void actionPerformed(ActionEvent event)
            {
               System.exit(0);
            }
         });

      // 演示覆選框和單選按鈕選單

      readonlyItem = new JCheckBoxMenuItem("Read-only");//建立複選框選單項
      readonlyItem.addActionListener(new ActionListener()
         {
            public void actionPerformed(ActionEvent event)
            {
               boolean saveOk = !readonlyItem.isSelected();
               saveAction.setEnabled(saveOk);//呼叫setEnable方法,啟用save選單項
               saveAsAction.setEnabled(saveOk);//呼叫setEnable方法,啟用saveAs選單項
            }
         });
      //將單選鈕選單項加入到按鈕組中,當按鈕組中的一個按鈕被選中時,其他的按鈕都自動的變為未選擇項
      ButtonGroup group = new ButtonGroup();

      JRadioButtonMenuItem insertItem = new JRadioButtonMenuItem("Insert");
      insertItem.setSelected(true);//呼叫setSelected方法,設定insert這個選單項的選擇狀態
      JRadioButtonMenuItem overtypeItem = new JRadioButtonMenuItem("Overtype");

      group.add(insertItem);
      group.add(overtypeItem);

      // 演示圖示

      Action cutAction = new TestAction("Cut");
      cutAction.putValue(Action.SMALL_ICON, new ImageIcon("cut.gif"));//使用關聯的鍵設定此物件的一個屬性
      Action copyAction = new TestAction("Copy");
      copyAction.putValue(Action.SMALL_ICON, new ImageIcon("copy.gif"));
      Action pasteAction = new TestAction("Paste");
      pasteAction.putValue(Action.SMALL_ICON, new ImageIcon("paste.gif"));

      JMenu editMenu = new JMenu("Edit");//構建一個JMenu類物件,為每一個選單建立一個選單物件
      editMenu.add(cutAction);
      editMenu.add(copyAction);
      editMenu.add(pasteAction);

      // 演示巢狀選單

      JMenu optionMenu = new JMenu("Options");

      optionMenu.add(readonlyItem);
      optionMenu.addSeparator();
      optionMenu.add(insertItem);
      optionMenu.add(overtypeItem);

      editMenu.addSeparator();
      editMenu.add(optionMenu);

      // 說明助記符

      JMenu helpMenu = new JMenu("Help");
      helpMenu.setMnemonic('H');//呼叫setMnemonic方法,為help選單設定快捷鍵

      JMenuItem indexItem = new JMenuItem("Index");
      indexItem.setMnemonic('I');//呼叫setMnemonic方法,為index選單設定快捷鍵,該字元會在標籤中以帶下劃線的形式顯示
      helpMenu.add(indexItem);

      // 您還可以向操作新增助記符鍵
      Action aboutAction = new TestAction("About");
      aboutAction.putValue(Action.MNEMONIC_KEY, new Integer('A'));//把快捷鍵作為Action.MNEMONIC_KEY的鍵值新增到物件中
      helpMenu.add(aboutAction);
      
      // 將所有頂級選單新增到選單欄

      JMenuBar menuBar = new JMenuBar();
      setJMenuBar(menuBar);//呼叫setMenuBar方法將選單欄新增到框架上

      menuBar.add(fileMenu);
      menuBar.add(editMenu);
      menuBar.add(helpMenu);

      // 顯示彈出視窗

      popup = new JPopupMenu();
      popup.add(cutAction);
      popup.add(copyAction);
      popup.add(pasteAction);

      JPanel panel = new JPanel();
      panel.setComponentPopupMenu(popup);
      add(panel);
   }
}
View Code

 

package menu;

import java.awt.event.*;
import javax.swing.*;

/**
 * 帶有示例選單欄的框架。
 */
public class MenuFrame extends JFrame
{
   private static final int DEFAULT_WIDTH = 300;
   private static final int DEFAULT_HEIGHT = 200;
   private Action saveAction;//
   private Action saveAsAction;
   private JCheckBoxMenuItem readonlyItem;//用給定的readonlyItem標籤構造一個複選框選單項
   private JPopupMenu popup;//彈出選單

   /**
    * 將操作名稱列印到System.out的示例操作
    */
   class TestAction extends AbstractAction
   {
      public TestAction(String name)
      {
         super(name);
      }

      public void actionPerformed(ActionEvent event)
      {
         System.out.println(getValue(Action.NAME) + " selected.");//實現介面方法
      }
   }

   public MenuFrame()
   {
      setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

      JMenu fileMenu = new JMenu("File");//選單物件
      fileMenu.add(new TestAction("New"));//將TestAction物件新增到選單中

      // 演示加速器

      JMenuItem openItem = fileMenu.add(new TestAction("Open"));
      openItem.setAccelerator(KeyStroke.getKeyStroke("ctrl O"));//呼叫setAccelerator方法將加速器鍵關聯到一個選單項上,使用KeyStroke型別的物件作為引數,將CTRL+O關聯到OpenItem選單項

      fileMenu.addSeparator();//Jmenu的一個方法將新分隔符追加到選單的末尾。 

      saveAction = new TestAction("Save");
      JMenuItem saveItem = fileMenu.add(saveAction);
      saveItem.setAccelerator(KeyStroke.getKeyStroke("ctrl S"));

      saveAsAction = new TestAction("Save As");//將要執行的行為賦值給選單子項
      fileMenu.add(saveAsAction);
      fileMenu.addSeparator();

      fileMenu.add(new TestAction("Exit")// AbstractAction或者TestAction都可以,,,因為子類繼承了出構造器外的所有方法
         {
            public void actionPerformed(ActionEvent event)
            {
               System.exit(0);
            }
         });

      // 演示覆選框和單選按鈕選單

      readonlyItem = new JCheckBoxMenuItem("Read-only");//建立複選框選單項
      readonlyItem.addActionListener(new ActionListener()
         {
            public void actionPerformed(ActionEvent event)
            {
               boolean saveOk = !readonlyItem.isSelected();
               saveAction.setEnabled(saveOk);//呼叫setEnable方法,啟用save選單項
               saveAsAction.setEnabled(saveOk);//呼叫setEnable方法,啟用saveAs選單項
            }
         });
      //將單選鈕選單項加入到按鈕組中,當按鈕組中的一個按鈕被選中時,其他的按鈕都自動的變為未選擇項
      ButtonGroup group = new ButtonGroup();

      JRadioButtonMenuItem insertItem = new JRadioButtonMenuItem("Insert");
      insertItem.setSelected(true);//呼叫setSelected方法,設定insert這個選單項的選擇狀態
      JRadioButtonMenuItem overtypeItem = new JRadioButtonMenuItem("Overtype");

      group.add(insertItem);
      group.add(overtypeItem);

      // 演示圖示

      Action cutAction = new TestAction("Cut");
      cutAction.putValue(Action.SMALL_ICON, new ImageIcon("cut.gif"));//使用關聯的鍵設定此物件的一個屬性
      Action copyAction = new TestAction("Copy");
      copyAction.putValue(Action.SMALL_ICON, new ImageIcon("copy.gif"));
      Action pasteAction = new TestAction("Paste");
      pasteAction.putValue(Action.SMALL_ICON, new ImageIcon("paste.gif"));

      JMenu editMenu = new JMenu("Edit");//構建一個JMenu類物件,為每一個選單建立一個選單物件
      editMenu.add(cutAction);
      editMenu.add(copyAction);
      editMenu.add(pasteAction);

      // 演示巢狀選單

      JMenu optionMenu = new JMenu("Options");

      optionMenu.add(readonlyItem);
      optionMenu.addSeparator();
      optionMenu.add(insertItem);
      optionMenu.add(overtypeItem);

      editMenu.addSeparator();
      editMenu.add(optionMenu);

      // 說明助記符

      JMenu helpMenu = new JMenu("Help");
      helpMenu.setMnemonic('H');//呼叫setMnemonic方法,為help選單設定快捷鍵

      JMenuItem indexItem = new JMenuItem("Index");
      indexItem.setMnemonic('I');//呼叫setMnemonic方法,為index選單設定快捷鍵,該字元會在標籤中以帶下劃線的形式顯示
      helpMenu.add(indexItem);

      // 您還可以向操作新增助記符鍵
      Action aboutAction = new TestAction("About");
      aboutAction.putValue(Action.MNEMONIC_KEY, new Integer('A'));//把快捷鍵作為Action.MNEMONIC_KEY的鍵值新增到物件中
      helpMenu.add(aboutAction);
      
      // 將所有頂級選單新增到選單欄

      JMenuBar menuBar = new JMenuBar();
      setJMenuBar(menuBar);//呼叫setMenuBar方法將選單欄新增到框架上

      menuBar.add(fileMenu);
      menuBar.add(editMenu);
      menuBar.add(helpMenu);

      // 顯示彈出視窗

      popup = new JPopupMenu();
      popup.add(cutAction);
      popup.add(copyAction);
      popup.add(pasteAction);

      JPanel panel = new JPanel();
      panel.setComponentPopupMenu(popup);
      add(panel);
   }
}
View Code
package menu;

import java.awt.event.*;
import javax.swing.*;

/**
 * 帶有示例選單欄的框架。
 */
public class MenuFrame extends JFrame
{
   private static final int DEFAULT_WIDTH = 300;
   private static final int DEFAULT_HEIGHT = 200;
   private Action saveAction;//
   private Action saveAsAction;
   private JCheckBoxMenuItem readonlyItem;//用給定的readonlyItem標籤構造一個複選框選單項
   private JPopupMenu popup;//彈出選單

   /**
    * 將操作名稱列印到System.out的示例操作
    */
   class TestAction extends AbstractAction
   {
      public TestAction(String name)
      {
         super(name);
      }

      public void actionPerformed(ActionEvent event)
      {
         System.out.println(getValue(Action.NAME) + " selected.");//實現介面方法
      }
   }

   public MenuFrame()
   {
      setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

      JMenu fileMenu = new JMenu("File");//選單物件
      fileMenu.add(new TestAction("New"));//將TestAction物件新增到選單中

      // 演示加速器

      JMenuItem openItem = fileMenu.add(new TestAction("Open"));
      openItem.setAccelerator(KeyStroke.getKeyStroke("ctrl O"));//呼叫setAccelerator方法將加速器鍵關聯到一個選單項上,使用KeyStroke型別的物件作為引數,將CTRL+O關聯到OpenItem選單項

      fileMenu.addSeparator();//Jmenu的一個方法將新分隔符追加到選單的末尾。 

      saveAction = new TestAction("Save");
      JMenuItem saveItem = fileMenu.add(saveAction);
      saveItem.setAccelerator(KeyStroke.getKeyStroke("ctrl S"));

      saveAsAction = new TestAction("Save As");//將要執行的行為賦值給選單子項
      fileMenu.add(saveAsAction);
      fileMenu.addSeparator();

      fileMenu.add(new TestAction("Exit")// AbstractAction或者TestAction都可以,,,因為子類繼承了出構造器外的所有方法
         {
            public void actionPerformed(ActionEvent event)
            {
               System.exit(0);
            }
         });

      // 演示覆選框和單選按鈕選單

      readonlyItem = new JCheckBoxMenuItem("Read-only");//建立複選框選單項
      readonlyItem.addActionListener(new ActionListener()
         {
            public void actionPerformed(ActionEvent event)
            {
               boolean saveOk = !readonlyItem.isSelected();
               saveAction.setEnabled(saveOk);//呼叫setEnable方法,啟用save選單項
               saveAsAction.setEnabled(saveOk);//呼叫setEnable方法,啟用saveAs選單項
            }
         });
      //將單選鈕選單項加入到按鈕組中,當按鈕組中的一個按鈕被選中時,其他的按鈕都自動的變為未選擇項
      ButtonGroup group = new ButtonGroup();

      JRadioButtonMenuItem insertItem = new JRadioButtonMenuItem("Insert");
      insertItem.setSelected(true);//呼叫setSelected方法,設定insert這個選單項的選擇狀態
      JRadioButtonMenuItem overtypeItem = new JRadioButtonMenuItem("Overtype");

      group.add(insertItem);
      group.add(overtypeItem);

      // 演示圖示

      Action cutAction = new TestAction("Cut");
      cutAction.putValue(Action.SMALL_ICON, new ImageIcon("cut.gif"));//使用關聯的鍵設定此物件的一個屬性
      Action copyAction = new TestAction("Copy");
      copyAction.putValue(Action.SMALL_ICON, new ImageIcon("copy.gif"));
      Action pasteAction = new TestAction("Paste");
      pasteAction.putValue(Action.SMALL_ICON, new ImageIcon("paste.gif"));

      JMenu editMenu = new JMenu("Edit");//構建一個JMenu類物件,為每一個選單建立一個選單物件
      editMenu.add(cutAction);
      editMenu.add(copyAction);
      editMenu.add(pasteAction);

      // 演示巢狀選單

      JMenu optionMenu = new JMenu("Options");

      optionMenu.add(readonlyItem);
      optionMenu.addSeparator();
      optionMenu.add(insertItem);
      optionMenu.add(overtypeItem);

      editMenu.addSeparator();
      editMenu.add(optionMenu);

      // 說明助記符

      JMenu helpMenu = new JMenu("Help");
      helpMenu.setMnemonic('H');//呼叫setMnemonic方法,為help選單設定快捷鍵

      JMenuItem indexItem = new JMenuItem("Index");
      indexItem.setMnemonic('I');//呼叫setMnemonic方法,為index選單設定快捷鍵,該字元會在標籤中以帶下劃線的形式顯示
      helpMenu.add(indexItem);

      // 您還可以向操作新增助記符鍵
      Action aboutAction = new TestAction("About");
      aboutAction.putValue(Action.MNEMONIC_KEY, new Integer('A'));//把快捷鍵作為Action.MNEMONIC_KEY的鍵值新增到物件中
      helpMenu.add(aboutAction);
      
      // 將所有頂級選單新增到選單欄

      JMenuBar menuBar = new JMenuBar();
      setJMenuBar(menuBar);//呼叫setMenuBar方法將選單欄新增到框架上

      menuBar.add(fileMenu);
      menuBar.add(editMenu);
      menuBar.add(helpMenu);

      // 顯示彈出視窗

      popup = new JPopupMenu();
      popup.add(cutAction);
      popup.add(copyAction);
      popup.add(pasteAction);

      JPanel panel = new JPanel();
      panel.setComponentPopupMenu(popup);
      add(panel);
   }
}

 

 

實驗3:組間協同學習:在本班課程QQ群內,各位同學對實驗1中存在的問題進行提問,提問時註明實驗1中的測試程式編號,負責對應程式的小組需及時對群內提問進行回答。

三、實驗總結

        通過本週的測試程式,結合書中的知識,學習程式GUI設計中應用的相關元件以及各類Java Swing元件用途及常用API,我發現隊以前所學知識掌握還不夠,在以後的學習中,不僅要學習新知識,也有複習已學知識。