文本域、标签、密码域、文本区、滚动窗格——文本输入

文本域

将文本域添加到窗口的常用办法就是将它添加到面板或者其他的容器中:

JPanel panel = new JPanel();
JTextField textField = new JTextField("Default input", 20);
panel.add(textField);

上面的代码添加一个文本域,同时传递“Default input”,进行初始化。构造器的第二个参数设置了文本域的宽度。这里的宽度就是当前使用字体的下一个字符的宽度。如果希望文本域最多能输入 n 个字符,就应该把宽度设置为 n 列。实际上,应该将最大输入长度再多设 1 ~ 2 字符。
如果布局管理器需要缩放这个文本域,它会调节文本域的大小。在 JTextField 的构造器中设定的宽度并不是用户能输入的字符的个数的上限。用户可以输入更长的字符串,但是当文本长度超过文本域长度时输入就会滚动。用户通常不会喜欢滚动文本域,所以应该尽量把文本域设置的宽一些。如果需要在运行时重新设置列数,可以使用setColumns 方法。

使用setColumns 方法改变了一个文本域的大小之后,需要调动包含这个文本框的容器的 revalidate 方法。
textField.setColumns(10);
panel.revalidate();
revalidate 会重新计算容器内所有组件的大小,并且对他们进行布局。它并不是立即改变组件的大小,而是先给组件加上要修改的标记。这样避免了修改组件大小带来的重复计算。

  • JTextField(int cols)
    构造一个给定列数的空JTextField对象。

  • JTextField(String text, int cols)
    构造一个给定列数,给定初始字符串的JTextField对象

  • int getColumns()

  • void setColumns(int cols)
    获取或设置文本域使用的列数

  • void revalidate()
    重现计算组件的位置和大小

  • void setFont(Font f)
    设置组件的字体

  • void validate()
    重现计算组件的位置和大小。如果组件是容器,容器中包含的所有组件的位置和大小也被重现计算

  • Font getFont()
    获取组件的字体


标签和标签组件

  • JLabel(String text)
  • JLabel(Icon icon)
  • JLabel(String text, int align)`
  • JLabel(String text, Icon icon, int align)`
    text :标签中的文本
    icon:标签中的图标
    align:常量,LEFT(默认),CENTER,RIGHT
  • String getText()
  • void setText(String text)
    获取或设置标签的文本
  • Icon getIcon()
  • void setIcon(Icon icon)
    获取或设置标签的图标

密码域

密码域是一种特殊的文本域。用户输入的字符不显示出来。Swing 提供了JPassworldField类来实现这样的文本域。

  • JPasswordField(String text, int columns)
    构造一个新的密码域对象
  • void setEchoChar(char echo)
    为密码域设置回显字符。注意:独特的观感可以选择自己的回显字符。 0 表示重新设置为默认的回显字符。
  • char[] getPassword()
    返回密码域中的文本。为了安全起见,在使用之后应该覆盖返回的数组内容。

文本区

当用户输入的文本超过一行时,可以输入多行文本,并以“Enter”键换行。每行以“\n”结尾就需要使用JTextArea组件来接收这样输入。在构造器中可以指定文本的行数和列数:
textArea = new JTextArea(8, 40); // 8行1040列
处于稳妥考虑,列数可以设置大一些。此外,用户并不受限于指定的行数和列数,当输入过长时,文本会滚动。还可以用 setColumns 方法改变列数,用 setRows 改变行数。这些数值只是首选大小——布局管理器会对文本区进行缩放。
如果文本区的文本超出显示的范围,那么剩下的文本就会被剪裁掉。可以通过开启换行特性来避免剪裁过长的行。
text.setLineWrap(true); // 长的行被剪裁掉
换行只是视觉效果,文档中的文本并没有改变,在文本中并没有 \n 字符。


滚动窗格

在Swing 中,文本区没有滚动条。如果需要滚动条,可以将文本插入到滚动窗格中:
textArea = new JTextArea(8, 40);
JScrollPane scrollPane = new JScrollPane(textArea)

当滚动窗格管理文本区的视图时,如果文本超出了文本区可以显示的范围,滚动条就会自动的出现,并且,在删除部分文本后,当文本能显示在文本区范围内时,滚动条会自动的消失。滚动是有滚动窗格内部处理的,编程时无需无需处理滚动事件。所以,要想为组件添加滚动条,只需要将他们放入一个滚动个窗口中即可。


综合案例:

在下面的程序中

  • 首先,申请了文本域和密码域,为文本域和密码域申请一个面板,并把面板的布局设置为窗格布局。为文本域和密码域添加上用户名和密码的标签。最后,将该面板放置到框架的最上面。
  • 然后,创建一个文本区对象,用来存储显示输入的用户和密码,为文本区添加滚动窗口。这样,当行数很多时会出现窗口滚动,少的时候滚动消失,方便用户查看。最后,将该画板放到框架的中间区域。
  • 最后,创建一个按钮,目的是点击按钮,把写好的额用户名和密码传输到文本区内显示。为按钮进行动作监听和相应一系列操作。最后,把按钮添加到框架的最下面。

呈现的效果图在最后

package text;

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

public class TextComponentFrame extends JFrame{
    private static final long serialVersionUID = 1L;

    public static void main(String[] args) {
        TextComponentFrame textComponentFrame = new TextComponentFrame();
        textComponentFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        textComponentFrame.setVisible(true);
    }

    public static final int TEXTAREA_ROWS = 8;
    public static final int TEXTAREA_COLUMNS = 20;

    public TextComponentFrame(){
        final JTextField textField = new JTextField();      //申请文本域
        final JPasswordField passwordField = new JPasswordField();      //申请密码域

        JPanel northPanel = new JPanel();       //创建一个画板
        northPanel.setLayout(new GridLayout(2, 2));     //创建 2x2 窗格布局
        northPanel.add(new JLabel("User Name: ", SwingConstants.RIGHT));    //在画板右边添加用户名标签
        northPanel.add(textField);
        northPanel.add(new JLabel("Password: ", SwingConstants.RIGHT));     //在画板右边添加密码标签
        northPanel.add(passwordField);

        add(northPanel, BorderLayout.NORTH);        //将画板添加到框架上面

        final JTextArea textArea = new JTextArea(TEXTAREA_ROWS, TEXTAREA_COLUMNS); //创建文本区对象
        JScrollPane scrollPane = new JScrollPane(textArea);         //为文本区添加滚动条

        add(scrollPane, BorderLayout.CENTER);           //将滚动区域添加到画板中间

        JPanel southPanel = new JPanel();       //创建一个画板,放在框架下方

        JButton insertButton = new JButton("insert");       //创建一个插入按钮
        southPanel.add(insertButton);       //将按钮添加到画板上

        insertButton.addActionListener(new ActionListener(){    //为按钮添加动作监听
            public void actionPerformed(ActionEvent event){     //监听到按钮后所要回应的动作
                textArea.append("User name: " + textField.getText() + " Password: "
                + new String(passwordField.getPassword()) + "\n");
            }
        });     
        add(southPanel, BorderLayout.SOUTH);    //把插入按钮添加到框架的下面
        pack();
    }
    
    private static final int DEFAULT_WIDTH = 700;
    private static final int DEFAULT_HEIGHT = 500;
    public Dimension getPreferredSize() {return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);}
}

在这里插入图片描述

  • JTextArea(String text, int rows, int cols)
    构造一个新的文本区对象

  • void setColumns(int cols)
    设置文本区应该使用的首选列数

  • void setRows(int rows)
    设置文本区应该使用的首选行数

  • void append(String newText)
    将给定的文本追加到文本区中已有的文本的尾部

  • void setLineWrap(boolean wrap)
    打开或关闭换行

  • `void setWrapStyleWord(boolean world)**
    如果word 是true,超长的行会在字边框处换行。如果为false,超长的行被截断而不考虑字边框

  • void setTabSize(int c)
    将制表符设置为c列。注意:制表符不会被转化为空格

  • JScrollPane(Component c)
    创建一个滚动窗格,用来显示指定组件的内容。滚动条自动过得出现或消失

发布了176 篇原创文章 · 获赞 46 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43207025/article/details/104225763