`

Swing浅谈(2)(..)

阅读更多
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); 
          /* 监听文本光标移动事件 */ 
          textField.addCaretListener(new CaretListener() { 
              public void caretUpdate(CaretEvent e) { 
                  // 如果改变了内容,就可以即时更新 label 显示的内容 
                  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(); 
      } 
  }

  上例中,我们构造了一个宽度为 15 个字符的单行文本框 (textField = new JTextField(15);),并使用 addCaretListener 方法添加了一个 CaretListener (textField.addCaretListener ...)。CaretListener 监听文本光标的移动事件。当用户使用键盘、鼠标等移动了文本光标在 JTextField 中的位置时触发这个事件。我们需要重载 caretUpdate(CaretEvent e) 对事件进行处理 (public void caretUpdate(CaretEvent e) ...)。这样,我们可以在这里做类似 VB 中 TextBox 的 OnChange 事件中做的事情。

  JTextField 有 5 个构造方法,常用其中的四个: 

JTextField()
JTextField(int columns),如上例 textField = new JTextField(15);
JTextField(String text)
JTextField(String text, int columns) 

  其中,参数 text 是单行文本框的初始内容,而 columns 指定了单行文本框的宽度,以字符为单位。JTextField 中的文本内容可以用 getText() 方法获得。也可以用 setText 方法指定 JTextField 中的文本内容。

  JPasswordField 是 JTextField 的子类,其构造方法也是类似的。JPasswordField 提供了 setEchoChar(char ch) 方法设置为了隐藏密码而显示的字符,默认为 '*' 字符,上例中则设置为了 '#' 字符 (pwdField.setEchoChar('#');)。与 JTextField 一样,JPasswordField 也用 getText 方法和 setText 获得或者设置文本内容 (当然在用户界面上是隐藏的)。

  JTextField 是单行文本框,不能显示多行文本,如果想要显示多行文本,就只好使用多行文本框 JTextArea 了。JTextArea 有六个构造方法,常用的也是四个:

JTextArea()
JTextArea(int rows, int columns) 
JTextArea(String text) 
JTextArea(String text, int rows, int columns)  

  text 为 JTextArea 的初始化文本内容;rows 为 JTextArea 的高度,以行为单位;columns 为 JTextArea 的宽度,以字符为单位。如上例中就构造了一个高 5 行,宽 15 个字符的多行文本框 (textArea = new JTextArea(5, 15);)。

  多行文本框默认是不会自动折行的 (不过可以输入回车符换行),我们可以使用 JTextArea 的 setLineWrap 方法设置是否允许自动折行。setLineWrap(true) 是允许自动折行,setLineWrap(false) 则是不允许自动折行。多行文本框会根据用户输入的内容自动扩展大小,不信,自己做个实验——如果不自动折行,那么多行文本框的宽度由最长的一行文字确定的;如果行数据超过了预设的行数,则多行文本框会扩展自身的高度去适应。换句话说,多行文本框不会自动产生滚动条。怎么办?后面讲到滚动窗格 (JScrollPane) 的时候,你就知道了。

  多行文本框里文本内容的获得和设置,同样可以使用 getText 和 setText 两个方法来完成。

  五. 窗格、滚动窗格和布局管理 

  窗格 (JPanel) 和滚动窗格 (JScrollPane) 在图形用户界面设计中大量用于各种组件在窗口上的布置和安排。这里所谓的布置和安排,就是布局 (Layout),因此不得不先说说布局。

  将加入到容器(通常为窗口等) 的组件按照一定的顺序和规则放置,使之看起来更美观,这就是布局。布局由布局管理器 (Layout Manager) 来管理。那么,我们在什么时候应该使用布局管理器?应用选择哪种布局管理器?又该怎样使用布局管理器呢?

  往往,我们设计一个窗口,其中是要添加若干组件的。为了管理好这些管理的布局,我们就要使用布局管理器。比如说,设计一个简单的编辑器,这个编辑器中只需要放置两个按钮和一个多行文本框。这些组件是让 Java 自己任意安排呢?还是按照一定的位置关系较规范的安排呢?当然应该选择后者。那么,为了按照一定的位置关系安排这些组件,我们就需要用到布局管理器了。

  然后我们遇到了一个选择题——使用哪种布局管理器。为此,我们首先要知道有些什么布局管理器,它们的布局特点是什么。常用的布局管理器有: FlowLayout、BorderLayout、GridLayout、BoxLayout 等,其中 FlowLayout 和 BorderLayout 最常用,本文主要也就只谈谈这两种布局管理器。下面列表说明它们的布局特点:



布局管理器 布局特点 
FlowLayout 将组件按从左到右从上到下的顺序依次排列,一行不能放完则折到下一行继续放置 
BorderLayout 将组件按东、南、西、北、中五个区域放置,每个方向最多只能放置一个组件 
GridLayout 形似一个无框线的表格,每个单元格中放一个组件  
BoxLayout 就像整齐放置的一行或者一列盒子,每个盒子中一个组件 



  就上述的编辑器为例,如果选用 FlowLayout,那么两个按钮和一个多行文本框就会排列在一行——当然这是窗口足够宽的情况;如果窗口稍窄一些,则可能分两行排列,第一行有两个按钮,而第二行是多行文本框——这是最理想的情况;如果窗口再窄一些,就可能分三行排列,第一行和第二行分别放置一个按钮,第三行放置多行文本框。因此,如果窗口大小可以改变,那么三个组件的位置关系也可能随着窗口大小的变化而变化。所以,FlowLayout 不适用。其实上面所举的例程中,大部分都是用的 FlowLayout,那是因为我们没有要求组件的布局。

  如果选用 BorderLayout 的情况又如何呢?我们可以试着加入一个窗格 (JPanel,稍后讲解),并将两个按钮放置在其中,然后将这个窗格加入到 BorderLayout 的北部 (即上部);再将多行文本框加入到 BorderLayout 中部。结果类似使用 FlowLayout 的第二种可能,是最理想的情况。而且,如果改变窗口大小,它们的位置关系仍然是北-中的关系,不会随之改变。

  剩下的两种布局管理器,加以窗格 (JPanel) 的配合,也能够很好的安排上述编辑器所需的三个组件。但是由于它们的使用稍为复杂一些,所以就不讲了。下面就讲讲如何使用 FlowLayout 和 BorderLayout。

  任何布局管理器,都需要用在容器上,比如 JFrame 的 Content Pane 和下面要说的 JPanel 都是容器。容器组件提供了一个 setLayout 方法,就是用来改变其布局管理器的。默认情况下,JFrame 的 Content Pane 使用的是 BorderLayout,而 JPanel 使用的是 FlowLayout。但不管怎样,我们都可以调用它们的 setLayout 方法来改变其布局管理器。比如上述的编辑器中,我们要让窗口 (JFrame 对象,假设为 frame) 使用 BorderLayout,就可以使用 frame.getContentPane().setLayout(new BorderLayout()); 来改变其布局管理器为一个新的 BorderLayout 对象。

  然后,我们对布局管理器的直接操作就结束了,剩下的只需要往容器里添加组件。如果使用 FlowLayout,我们只需要使用容器的 add(Component c) 方法添加组件就行了。但是,如果使用 BorderLayout 就不一样了,因为要指定是把组件添加到哪个区域啊。那我们就使用容器的 add(Component c, Object o) 方法添加组件,该方法的第二个参数就是指明添加到的区域用的。例如,上述编辑器中要添加一个多行文本框到 BorderLayout 的中部,就可以用 frame.getContentPane().add(new JTextArea(5, 15), BorderLayout.CENTER) 来实现。 

  BorderLayout 的五个区域分别是用下列五个常量来描述的:

BorderLayout.EAST 东 
BorderLayout.SOUTH 南 
BorderLayout.WEST 西 
BorderLayout.NORTH 北 
BorderLayout.CENTER 中 

  刚才已经提到了使用 JPanel。JPanel 作为一个容器,可以包容一些组件,然后将这个 JPanel 对象作为一个组件添加到另一个容器 (称作父容器) 中。这个功能有什么好处呢?

  上面不是提到 BorderLayout 的一个区域中只能添加一个组件吗?但是我们的编辑器需要添加两个按钮到它的北部,怎么办?上面的例子中,我们就是用的一个 JPanel 包容了这两个按钮,然后再将这个 JPanel 对象作为一个组件添加到设置布局管理器为 BorderLayout 的 Content Pane 中。

  上面说到各布局管理器的布局特点的时候,几乎每一种都是一个区域只能添加一个组件,那我们想添加多个组件到一个区域的时候,就要用到 JPanel 了。如果还没有明白,稍后看一段程序可能更易于理解。

  而滚动窗格 (JScrollPane) 呢?它是一个能够自己产生滚动条的容器,通常只包容一个组件,并且根据这个组件的大小自动产生滚动条。比如上面讲 JTextArea 的时候提到:JTextAera 会随用户输入的内容自动扩展大小,很容易打破各组件的布局。但是,如果我们将它包容在一个滚动窗格中,它的扩展就不会直接反映在大小的变化上,而会反映在滚动窗格的滚动条上,也就不会打破各组件的布局了。稍后的例子会让你清清楚楚。

  是不是等着看例子了?好,例子来了:

import javax.swing.*; 
import java.awt.*; 
public class TestPanels extends JFrame { 
    public TestPanels() { 
        setDefaultCloseOperation(EXIT_ON_CLOSE); 
        JPanel panel = new JPanel(); 
        for (int i = 0; i < 2; i++) { 
            panel.add(new JButton("Button 00" + i)); 
        } 

        JTextArea textArea = new JTextArea(5, 15); 
        textArea.setLineWrap(true); 
        JScrollPane scrollPane = new JScrollPane(textArea); 
        getContentPane().add(panel, BorderLayout.NORTH); 
        getContentPane().add(scrollPane, BorderLayout.CENTER); 
        pack(); 

    } 

    public static void main(String[] args) { 

        TestPanels tp = new TestPanels(); 
        tp.setVisible(true);    } 
}

  这个例子的运行结果如下图,正是我们想要的结果——上面两个按钮,下面是一个可以滚动的多行文本框:



  上例中首先产生了一个 JPanel 对象 (JPanel panel = new JPanel();),然后将两个按钮置于其中 (panel.add ...);然后产生了一个多行文本框 (JTextArea textArea = new JTextArea(5, 15);),并使用一个滚动窗格将它包裹起来 (JScrollPane scrollPane = new JScrollPane(textArea);),使之成为可以滚动的多行文本框。最后将两个容器 (JPanel 对象和 JScrollPane 对象) 分别添加到了窗口的北部 (getContentPane().add(panel, BorderLayout.NORTH);) 和中部 (也就是剩余部分,getContentPane().add(scrollPane, BorderLayout.CENTER);)。

  好像有点不对劲,是什么呢?对了,我们没有设置 Content Pane 的布局管理器为 BorderLayout 啊,为什么……刚才不是说了吗,JFrame 的 Content Pane 的默认布局管理器就是 BorderLayout,所以不用再设置了。

 

分享到:
评论

相关推荐

    Manning - Swing - 2nd.pdf

    《Manning - Swing - 2nd.pdf》是一本针对中级到高级Swing开发者的宝贵资源,它不仅深入浅出地讲解了Swing的核心技术和设计理念,还提供了大量的实用案例和实践经验。无论是对于初学者还是经验丰富的开发者而言,这...

    浅谈Java图形界面事件处理的方法.pdf

    "浅谈Java图形界面事件处理的方法.pdf" Java 语言在图形界面设计中,事件处理是非常重要的一部分。事件处理是指用户与图形用户界面(GUI)之间的交互操作,即当用户触发某一事件时,系统做出的响应,对事件进行...

    浅谈心得体会 如何成为一个优秀的jsp程序员

    不必深入研究Swing或Applet等图形界面组件,因为这些在JSP中并不常用。 - **建议**:通过实际项目练习,加深对Java的理解。 ##### 4. 学习JavaScript - **时间**:1~2周 - **目标**:掌握如何使用JavaScript进行...

    浅谈Java语言评价胜出的8大技术优势

    ### 浅谈Java语言评价胜出的8大技术优势 #### 1. 强大的API支持 Java提供了非常丰富的API支持,包括网络编程中的Socket API、数据库操作中的SQL API、图形用户界面的Swing和AWT API等。这些API不仅功能强大而且...

    基于Java的连连看游戏设计与实现毕业设计.docx

    浅谈 Java 的发展及特点[J]. 硅谷, 2010(6):50-50. 2. Burns B. Darkstar: the java game server[J]. 2007. 3. 吴越胜、李新磊.Eclipse 3.0 程序开发技术详解[M]:清华大学出版社,2010.1~3 4. 岷江. Java 的运行...

    浅谈Java 将图片打包到jar中的路径问题

    今天,我们将深入浅谈该问题,并提供两种解决方法:通过使用外部资源文件的方式和通过使用内部资源文件的方式。 问题描述 当我们将 Java 项目打包成 Jar 文件后,发现图片无法加载。这是因为 Jar 文件中的路径问题...

    浅谈用java实现事件驱动机制

    Java的标准库并未内置事件驱动的功能,但在GUI组件如Swing中,有一些基础的事件处理支持。然而,这些并不适用于非GUI应用,因此我们需要自定义一套通用的事件驱动框架。 观察者模式是实现事件驱动的一种常见设计...

    浅谈jQuery animate easing的具体使用方法(推荐)

    "linear"是一种线性过渡,动画速度在整个过程中保持恒定,而"swing"则是非线性的,它模拟了传统的物理摆动,速度在开始和结束时较慢,中间较快,这是jQuery默认的效果。 然而,如果你想要更多的缓动效果,比如...

    浅谈Java绝对布局 <font color=red>原创</font>

    在Java的Swing图形用户界面(GUI)开发中,布局管理是至关重要的,它负责自动安排组件在容器内的位置和大小。然而,有时开发者可能希望对组件的位置有精确的控制,这时就可以使用“绝对布局”(Absolute Layout)。...

    浅谈使用setBounds()方法需要注意的地方

    Java Swing中的布局管理器(Layout Manager)负责自动调整和排列容器中的组件。不同类型的布局管理器有其特定的布局规则。当你尝试使用`setBounds()`方法时,必须考虑到当前使用的布局管理器类型。 - **绝对布局...

    浅谈java中文本框和文本区

    它是由javax.swing.JTextField类提供的,可以用来创建一个允许用户输入单行文本的控件。文本框的大小通常由其列数来决定,用户可以通过构造函数来设置列数,例如: 1. JTextField() 创建一个默认字符长度为1的...

    浅谈Java利用表格模型创建表格 <font color=red>原创</font>

    2. public int getColumnCount():获取表格中的列数。 3. public Object getValueAt(int rowIndex, int columnIndex):获取指定行和列的单元格值。 通过继承 AbstractTableModel 类并实现上述三种抽象方法,我们...

    浅谈标签和JLabel类构造方法 <font color=red>原创</font>

    2. `public JLabel(Icon image)`:此构造方法用于创建一个带有指定图标的标签。`Icon`参数可以是一个实现了`Icon`接口的对象,如`ImageIcon`,用于显示图像资源。 3. `public JLabel(String text)`:此构造方法创建...

    Python核心编程第二版

     11.7.2 内建函数apply()、filter()、map()、reduce()   11.7.3 偏函数应用   11.8 变量作用域   11.8.1 全局变量与局部变量   11.8.2 globa语句   11.8.3 作用域的数字   11.8.4 闭包...

    JAVA自学之路

    纸上得来终觉浅,所以:别问那么多,别想那么多,动手写吧。 JAVA自学之路 四:要事为先 对待人生的任何事情都要:抓大放小,要事为先 对于一个以前从来没有接触过java的人,java无疑是庞大的,似乎每个...

Global site tag (gtag.js) - Google Analytics