国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Java 圖形用戶界面設(shè)計(jì)(下)

2019-11-18 13:02:49
字體:
供稿:網(wǎng)友

  四. 文本輸入框、密碼輸入框
  文本輸入框包括兩種,單行文本輸入框 (JTextField) 和多行文本輸入框 (JTextArea)。密碼輸入框則只有一種 (JPassWordField)。JPasswordField 是 JTextField 的子類,它們的主要區(qū)別是 JPasswordField 不會顯示出用戶輸入的東西,而只會顯示出程序員設(shè)定的一個(gè)固定字符,比如 '*'。
  下面的示例圖和代碼是 JTextField、JPasswordField 和 JTextArea 的示例:
   Java 圖形用戶界面設(shè)計(jì)(下)(圖一)


  /**
  * TestTexts.java
  * @author Fancy
  */
  import javax.swing.*;
  import javax.swing.event.*;
  public class TestTexts extends JFrame {
  PRivate JLabel label = new JLabel("Status");
  private JTextField textField;
  private JPasswordField pwdField;
  private JTextArea textArea;
  public TestTexts() {
  super("Test Texts");
  setDefaultCloSEOperation(EXIT_ON_CLOSE);
  getContentPane().setLayout(new java.awt.FlowLayout());
  textField = new JTextField(15);
  /* 監(jiān)聽文本光標(biāo)移動(dòng)事件 */
  textField.addCaretListener(new CaretListener() {
  public void caretUpdate(CaretEvent e) {
  // 假如改變了內(nèi)容,就可以即時(shí)更新 label 顯示的內(nèi)容
  label.setText(textField.getText());
  }
  });
  pwdField = new JPasswordField(15);
  pwdField.setEchoChar('#');
  textArea = new JTextArea(5, 15);
  textArea.setLineWrap(true);
  getContentPane().add(textField);
  getContentPane().add(pwdField);
  getContentPane().add(textArea);
  getContentPane().add(label);
  setSize(200, 200);
  }
  public static
  void main(String[] args) {
  TestTexts tt = new TestTexts();
  tt.show();
  }
  }
  上例中,我們構(gòu)造了一個(gè)寬度為 15 個(gè)字符的單行文本框 (textField = new JTextField(15);),并使用 addCaretListener 方法添加了一個(gè) CaretListener (textField.addCaretListener ...)。CaretListener 監(jiān)聽文本光標(biāo)的移動(dòng)事件。當(dāng)用戶使用鍵盤、鼠標(biāo)等移動(dòng)了文本光標(biāo)在 JTextField 中的位置時(shí)觸發(fā)這個(gè)事件。我們需要重載 caretUpdate(CaretEvent e) 對事件進(jìn)行處理 (public void caretUpdate(CaretEvent e) ...)。這樣,我們可以在這里做類似 VB 中 TextBox 的 OnChange 事件中做的事情。
  JTextField 有 5 個(gè)構(gòu)造方法,常用其中的四個(gè):
  JTextField()
  JTextField(int columns),如上例 textField = new JTextField(15);
  JTextField(String text)
  JTextField(String text, int columns)
  其中,參數(shù) text 是單行文本框的初始內(nèi)容,而 columns 指定了單行文本框的寬度,以字符為單位。JTextField 中的文本內(nèi)容可以用 getText() 方法獲得。也可以用 setText 方法指定 JTextField 中的文本內(nèi)容。
  JPasswordField 是 JTextField 的子類,其構(gòu)造方法也是類似的。JPasswordField 提供了 setEchoChar(char ch) 方法設(shè)置為了隱藏密碼而顯示的字符,默認(rèn)為 '*' 字符,上例中則設(shè)置為了 '#' 字符 (pwdField.setEchoChar('#');)。與 JTextField 一樣,JPasswordField 也用 getText 方法和 setText 獲得或者設(shè)置文本內(nèi)容 (當(dāng)然在用戶界面上是隱藏的)。
  JTextField 是單行文本框,不能顯示多行文本,假如想要顯示多行文本,就只好使用多行文本框 JTextArea 了。JTextArea 有六個(gè)構(gòu)造方法,常用的也是四個(gè):
  JTextArea()
  JTextArea(int rows, int columns)
  JTextArea(String text)
  JTextArea(String text, int rows, int columns) 
  text 為 JTextArea 的初始化文本內(nèi)容;rows 為 JTextArea 的高度,以行為單位;columns 為 JTextArea 的寬度,以字符為單位。如上例中就構(gòu)造了一個(gè)高 5 行,寬 15 個(gè)字符的多行文本框 (textArea = new JTextArea(5, 15);)。
  多行文本框默認(rèn)是不會自動(dòng)折行的 (不過可以輸入回車符換行),我們可以使用 JTextArea 的 setLineWrap 方法設(shè)置是否答應(yīng)自動(dòng)折行。setLineWrap(true) 是答應(yīng)自動(dòng)折行,setLineWrap(false) 則是不答應(yīng)自動(dòng)折行。多行文本框會根據(jù)用戶輸入的內(nèi)容自動(dòng)擴(kuò)展大小,不信,自己做個(gè)實(shí)驗(yàn)——假如不自動(dòng)折行,那么多行文本框的寬度由最長的一行文字確定的;假如行數(shù)據(jù)超過了預(yù)設(shè)的行數(shù),則多行文本框會擴(kuò)展自身的高度去適應(yīng)。換句話說,多行文本框不會自動(dòng)產(chǎn)生滾動(dòng)條。怎么辦?后面講到滾動(dòng)窗格 (JScrollPane) 的時(shí)候,你就知道了。
  多行文本框里文本內(nèi)容的獲得和設(shè)置,同樣可以使用 getText 和 setText 兩個(gè)方法來完成。
  五. 窗格、滾動(dòng)窗格和布局治理
  窗格 (JPanel) 和滾動(dòng)窗格 (JScrollPane) 在圖形用戶界面設(shè)計(jì)中大量用于各種組件在窗口上的布置和安排。這里所謂的布置和安排,就是布局 (Layout),因此不得不先說說布局。
  將加入到容器(通常為窗口等) 的組件按照一定的順序和規(guī)則放置,使之看起來更美觀,這就是布局。布局由布局治理器 (Layout Manager) 來治理。那么,我們在什么時(shí)候應(yīng)該使用布局治理器?應(yīng)用選擇哪種布局治理器?又該怎樣使用布局治理器呢?
  往往,我們設(shè)計(jì)一個(gè)窗口,其中是要添加若干組件的。為了治理好這些治理的布局,我們就要使用布局治理器。比如說,設(shè)計(jì)一個(gè)簡單的編輯器,這個(gè)編輯器中只需要放置兩個(gè)按鈕和一個(gè)多行文本框。這些組件是讓 Java 自己任意安排呢?還是按照一定的位置關(guān)系較規(guī)范的安排呢?當(dāng)然應(yīng)該選擇后者。那么,為了按照一定的位置關(guān)系安排這些組件,我們就需要用到布局治理器了。
  然后我們碰到了一個(gè)選擇題——使用哪種布局治理器。為此,我們首先要知道有些什么布局治理器,它們的布局特點(diǎn)是什么。常用的布局治理器有: FlowLayout、BorderLayout、GridLayout、BoxLayout 等,其中 FlowLayout 和 BorderLayout 最常用,本文主要也就只談?wù)勥@兩種布局治理器。下面列表說明它們的布局特點(diǎn):
   Java 圖形用戶界面設(shè)計(jì)(下)(圖二)
  就上述的編輯器為例,假如選用 FlowLayout,那么兩個(gè)按鈕和一個(gè)多行文本框就會排列在一行——當(dāng)然這是窗口足夠?qū)挼那闆r;假如窗口稍窄一些,則可能分兩行排列,第一行有兩個(gè)按鈕,而第二行是多行文本框——這是最理想的情況;假如窗口再窄一些,就可能分三行排列,第一行和第二行分別放置一個(gè)按鈕,第三行放置多行文本框。因此,假如窗口大小可以改變,那么三個(gè)組件的位置關(guān)系也可能隨著窗口大小的變化而變化。所以,F(xiàn)lowLayout 不適用。其實(shí)上面所舉的例程中,大部分都是用的 FlowLayout,那是因?yàn)槲覀儧]有要求組件的布局。
  假如選用 BorderLayout 的情況又如何呢?我們可以試著加入一個(gè)窗格 (JPanel,稍后講解),并將兩個(gè)按鈕放置在其中,然后將這個(gè)窗格加入到 BorderLayout 的北部 (即上部);再將多行文本框加入到 BorderLayout 中部。結(jié)果類似使用 FlowLayout 的第二種可能,是最理想的情況。而且,假如改變窗口大小,它們的位置關(guān)系仍然是北-中的關(guān)系,不會隨之改變。
  剩下的兩種布局治理器,加以窗格 (JPanel) 的配合,也能夠很好的安排上述編輯器所需的三個(gè)組件。但是由于它們的使用稍為復(fù)雜一些,所以就不講了。下面就講講如何使用 FlowLayout 和 BorderLayout。
  任何布局治理器,都需要用在容器上,比如 JFrame 的 Content Pane 和下面要說的 JPanel 都是容器。容器組件提供了一個(gè) setLayout 方法,就是用來改變其布局治理器的。默認(rèn)情況下,JFrame 的 Content Pane 使用的是 BorderLayout,而 JPanel 使用的是 FlowLayout。但不管怎樣,我們都可以調(diào)用它們的 setLayout 方法來改變其布局治理器。比如上述的編輯器中,我們要讓窗口 (JFrame 對象,假設(shè)為 frame) 使用 BorderLayout,就可以使用 frame.getContentPane().setLayout(new BorderLayout()); 來改變其布局治理器為一個(gè)新的 BorderLayout 對象。
  然后,我們對布局治理器的直接操作就結(jié)束了,剩下的只需要往容器里添加組件。假如使用 FlowLayout,我們只需要使用容器的 add(Component c) 方法添加組件就行了。但是,假如使用 BorderLayout 就不一樣了,因?yàn)橐付ㄊ前呀M件添加到哪個(gè)區(qū)域啊。那我們就使用容器的 add(Component c, Object o) 方法添加組件,該方法的第二個(gè)參數(shù)就是指明添加到的區(qū)域用的。例如,上述編輯器中要添加一個(gè)多行文本框到 BorderLayout 的中部,就可以用 frame.getContentPane().add(new JTextArea(5, 15), BorderLayout.CENTER) 來實(shí)現(xiàn)。
  BorderLayout 的五個(gè)區(qū)域分別是用下列五個(gè)常量來描述的:
  BorderLayout.EAST 東
  BorderLayout.SOUTH 南
  BorderLayout.WEST 西
  BorderLayout.NORTH 北
  BorderLayout.CENTER 中
  剛才已經(jīng)提到了使用 JPanel。JPanel 作為一個(gè)容器,可以包容一些組件,然后將這個(gè) JPanel 對象作為一個(gè)組件添加到另一個(gè)容器 (稱作父容器) 中。這個(gè)功能有什么好處呢?
  上面不是提到 BorderLayout 的一個(gè)區(qū)域中只能添加一個(gè)組件嗎?但是我們的編輯器需要添加兩個(gè)按鈕到它的北部,怎么辦?上面的例子中,我們就是用的一個(gè) JPanel 包容了這兩個(gè)按鈕,然后再將這個(gè) JPanel 對象作為一個(gè)組件添加到設(shè)置布局治理器為 BorderLayout 的 Content Pane 中。
  上面說到各布局治理器的布局特點(diǎn)的時(shí)候,幾乎每一種都是一個(gè)區(qū)域只能添加一個(gè)組件,那我們想添加多個(gè)組件到一個(gè)區(qū)域的時(shí)候,就要用到 JPanel 了。假如還沒有明白,稍后看一段程序可能更易于理解。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 营山县| 瑞安市| 乌恰县| 临城县| 湖口县| 彭泽县| 云梦县| 子洲县| 宁城县| 太仆寺旗| 惠安县| 徐闻县| 云南省| 英山县| 辉南县| 原平市| 军事| 邹城市| 庆安县| 满城县| 阳春市| 清水县| 九江市| 开远市| 新泰市| 镇雄县| 长武县| 顺昌县| 武汉市| 龙州县| 泾阳县| 库车县| 明水县| 体育| 四川省| 防城港市| 达拉特旗| 娱乐| 丰城市| 兴文县| 叶城县|