JTextFields are a very useful part of your Swing Toolkit. Simply put, the TextField lets the user enter text into your program without using a command line prompt. This tutorial will start by quickly showing how to display a JTextfield. Then, we shall look at more specialised forms of TextFields...JPasswordFields and a personalised form of JTextField that lets you restrict the number of characters in the box. We shall have to use a new example, our scoreboard example is not very useful for showing a JTextField. This time we will have a go at a basic login screen. The login screen is made of various labels, two JTextFields and a JButton. The username for this login is "ravi" and the password is "12345". TextField.java
Outputpackage java9r.blogspot.com;
import javax.swing.*;
import java.awt.Color;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class TextField implements ActionListener{
JPanel textPanel, panelForTextFields, completionPanel;
JLabel titleLabel, usernameLabel, passwordLabel, userLabel, passLabel;
JTextField usernameField, loginField;
JButton loginButton;
public JPanel createContentPane (){
// We create a bottom JPanel to place everything on.
JPanel totalGUI = new JPanel();
totalGUI.setLayout(null);
titleLabel = new JLabel("Login Screen");
titleLabel.setLocation(0,0);
titleLabel.setSize(290, 30);
titleLabel.setHorizontalAlignment(0);
totalGUI.add(titleLabel);
// Creation of a Panel to contain the JLabels
textPanel = new JPanel();
textPanel.setLayout(null);
textPanel.setLocation(10, 35);
textPanel.setSize(70, 80);
totalGUI.add(textPanel);
// Username Label
usernameLabel = new JLabel("Username");
usernameLabel.setLocation(0, 0);
usernameLabel.setSize(70, 40);
usernameLabel.setHorizontalAlignment(4);
textPanel.add(usernameLabel);
// Login Label
passwordLabel = new JLabel("Password");
passwordLabel.setLocation(0, 40);
passwordLabel.setSize(70, 40);
passwordLabel.setHorizontalAlignment(4);
textPanel.add(passwordLabel);
// TextFields Panel Container
panelForTextFields = new JPanel();
panelForTextFields.setLayout(null);
panelForTextFields.setLocation(110, 40);
panelForTextFields.setSize(100, 70);
totalGUI.add(panelForTextFields);
// Username Textfield
usernameField = new JTextField(8);
usernameField.setLocation(0, 0);
usernameField.setSize(100, 30);
panelForTextFields.add(usernameField);
// Login Textfield
loginField = new JTextField(8);
loginField.setLocation(0, 40);
loginField.setSize(100, 30);
panelForTextFields.add(loginField);
// Creation of a Panel to contain the completion JLabels
completionPanel = new JPanel();
completionPanel.setLayout(null);
completionPanel.setLocation(240, 35);
completionPanel.setSize(70, 80);
totalGUI.add(completionPanel);
// Username Label
userLabel = new JLabel("Wrong");
userLabel.setForeground(Color.red);
userLabel.setLocation(0, 0);
userLabel.setSize(70, 40);
completionPanel.add(userLabel);
// Login Label
passLabel = new JLabel("Wrong");
passLabel.setForeground(Color.red);
passLabel.setLocation(0, 40);
passLabel.setSize(70, 40);
completionPanel.add(passLabel);
// Button for Logging in
loginButton = new JButton("Login");
loginButton.setLocation(130, 120);
loginButton.setSize(80, 30);
loginButton.addActionListener(this);
totalGUI.add(loginButton);
totalGUI.setOpaque(true);
return totalGUI;
}
// With this action performed, we simply check to see if the username and
// password match "ravi" as the username and "12345" as the password.
// If they do, we set the labels ajacent to them to "Correct!" and color
// them green.
// At the end, we check if both labels are green. If they are, we set the
// screen to be 'Logging In'.
public void actionPerformed(ActionEvent e) {
if(e.getSource() == loginButton)
{
if(usernameField.getText().trim().compareTo("ravi") == 0)
{
userLabel.setForeground(Color.green);
userLabel.setText("Correct!");
}
else
{
userLabel.setForeground(Color.red);
userLabel.setText("Wrong!");
}
if(loginField.getText().trim().compareTo("12345") == 0)
{
passLabel.setForeground(Color.green);
passLabel.setText("Correct!");
}
else
{
passLabel.setForeground(Color.red);
passLabel.setText("Wrong!");
}
if((userLabel.getForeground() == Color.green)
&& (passLabel.getForeground() == Color.green))
{
titleLabel.setText("Logging in....");
loginButton.setEnabled(false);
}
}
}
private static void createAndShowGUI() {
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("--------JTextField of Dreams --------");
TextField demo = new TextField();
frame.setContentPane(demo.createContentPane());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 400);
frame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
TextField_Extended This is quite an advanced lesson, but contains a very useful technique that really lets you control exactly what goes into a JTextField. Sadly, we first have to look at a bit of theory to understand where this code comes from. A widget in Swing is based on an Model-View-Controller (MVC) design pattern. The Model is the bit that represents the low-level behaviour and state of the widget. The View is what is represented on the screen. The Controller is the bit that handles user interaction with the model. This is a very simplistic description, but it will do for now. TextField_Extended.java
package java9r.blogspot.com;Output
import java.awt.*;
import java.awt.event.*;
import java.util.Arrays;
import javax.swing.*;
import javax.swing.text.*;
public class TextField_Extended implements ActionListener{
JPanel textPanel, panelForTextFields, completionPanel;
JLabel titleLabel, usernameLabel, passwordLabel, userLabel, passLabel;
KTextField usernameField;
JPasswordField loginField;
JButton loginButton;
public JPanel createContentPane (){
// We create a bottom JPanel to place everything on.
JPanel totalGUI = new JPanel();
totalGUI.setLayout(null);
titleLabel = new JLabel("Login Screen");
titleLabel.setLocation(0,0);
titleLabel.setSize(290, 30);
titleLabel.setHorizontalAlignment(0);
totalGUI.add(titleLabel);
// Creation of a Panel to contain the JLabels
textPanel = new JPanel();
textPanel.setLayout(null);
textPanel.setLocation(10, 35);
textPanel.setSize(70, 80);
totalGUI.add(textPanel);
// Username Label
usernameLabel = new JLabel("Username");
usernameLabel.setLocation(0, 0);
usernameLabel.setSize(70, 40);
usernameLabel.setHorizontalAlignment(4);
textPanel.add(usernameLabel);
// Login Label
passwordLabel = new JLabel("Password");
passwordLabel.setLocation(0, 40);
passwordLabel.setSize(70, 40);
passwordLabel.setHorizontalAlignment(4);
textPanel.add(passwordLabel);
// TextFields Panel Container
panelForTextFields = new JPanel();
panelForTextFields.setLayout(null);
panelForTextFields.setLocation(110, 40);
panelForTextFields.setSize(100, 70);
totalGUI.add(panelForTextFields);
// Username Textfield
usernameField = new KTextField(8);
usernameField.setLocation(0, 0);
usernameField.setSize(100, 30);
panelForTextFields.add(usernameField);
// Login Textfield
loginField = new JPasswordField(8);
loginField.setEchoChar('&');
loginField.setLocation(0, 40);
loginField.setSize(100, 30);
panelForTextFields.add(loginField);
// Creation of a Panel to contain the completion JLabels
completionPanel = new JPanel();
completionPanel.setLayout(null);
completionPanel.setLocation(240, 35);
completionPanel.setSize(70, 80);
totalGUI.add(completionPanel);
// Username Label
userLabel = new JLabel("Wrong");
userLabel.setForeground(Color.red);
userLabel.setLocation(0, 0);
userLabel.setSize(70, 40);
completionPanel.add(userLabel);
// Login Label
passLabel = new JLabel("Wrong");
passLabel.setForeground(Color.red);
passLabel.setLocation(0, 40);
passLabel.setSize(70, 40);
completionPanel.add(passLabel);
// Button for Logging in
loginButton = new JButton("Login");
loginButton.setLocation(130, 120);
loginButton.setSize(80, 30);
loginButton.addActionListener(this);
totalGUI.add(loginButton);
totalGUI.setOpaque(true);
return totalGUI;
}
// With this action performed, we simply check to see if the username and
// password match "ravi" as the username and "12345" as the password.
// If they do, we set the labels ajacent to them to "Correct!" and color
// them green.
// At the end, we check if both labels are green. If they are, we set the
// screen to be 'Logging In'.
public void actionPerformed(ActionEvent e) {
if(e.getSource() == loginButton)
{
if(usernameField.getText().trim().compareTo("ravi") == 0)
{
userLabel.setForeground(Color.green);
userLabel.setText("Correct!");
}
else
{
userLabel.setForeground(Color.red);
userLabel.setText("Wrong!");
}
// Here, because we use a password field, we use the getPassword
// command. This is more secure.
// Once we are finished with the char array with the correct answer
// we change it back to blank.
// You may ask why we do this when the char array we compare it to
// is in clear text one line above.
// Obviously we'd store this in an encrypted database. (or something
// along those lines!)
char[] answer = {'1', '2', '3', '4', '5'};
char[] input = loginField.getPassword();
if(Arrays.equals(input, answer))
{
passLabel.setForeground(Color.green);
passLabel.setText("Correct!");
for(int i = 0; i < input.length; i++)
{
input[i] = ' ';
}
}
else
{
passLabel.setForeground(Color.red);
passLabel.setText("Wrong!");
}
if((userLabel.getForeground() == Color.green)
&& (passLabel.getForeground() == Color.green))
{
titleLabel.setText("Logging in....");
loginButton.setEnabled(false);
}
}
}
private static void createAndShowGUI() {
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("------- KTextField of MVC--------");
TextField_Extended demo = new TextField_Extended();
frame.setContentPane(demo.createContentPane());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 400);
frame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
class KTextField extends JTextField {
private int length = 0;
// Creates a TextField with a fixed length of string input.
public KTextField(int length) {
super(new FixedLengthPlainDocument(length), "", length);
}
}
class FixedLengthPlainDocument extends PlainDocument {
private int maxlength;
// This creates a Plain Document with a maximum length
// called maxlength.
FixedLengthPlainDocument(int maxlength) {
this.maxlength = maxlength;
}
// This is the method used to insert a string to a Plain Document.
public void insertString(int offset, String str, AttributeSet a) throws
BadLocationException {
// If the current length of the string
// + the length of the string about to be entered
// (through typing or copy and paste)
// is less than the maximum length passed as an argument..
// We call the Plain Document method insertString.
// If it isn't, the string is not entered.
if (!((getLength() + str.length()) > maxlength)) {
super.insertString(offset, str, a);
}
}
}
}
0 comments:
Post a Comment