gpt4 book ai didi

java - 具有内部字段或预格式化格式的 JTextField,类似于 Windows 中的 ip 字段

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:03:49 25 4
gpt4 key购买 nike

我想创建一个用于日期的文本字段,格式为 dd.mm.YYYY。现在我希望用户只键入数字,而不是点。所以这个领域就像:

_ _. _ _ . _ _ _ _

所以当用户想要输入日期时:例如 15.05.2010,他只会输入 15052010 序列中的数字。

我还想,当他按下向左或向右箭头时,光标从一个字段(不是 JTextField,而是 JTextField 中的字段)转到下一个字段。假设我有 JTextField,其中包含以下文本:15.05.2010 如果用户在开头并按下向右箭头,则光标应转到 .05 字段。

我希望你能理解我,因为现在我不知道如何制作这个,或者至少不知道如何在谷歌上寻找它。

最佳答案

好吧,这里有 4 个类可以解决您的问题。在我的例子中,它的版本控制但 IP 地址具有相同的结构并且很容易修改。

package com.demo.textfield.version;

import javax.swing.text.Document;



/**
* create documents for text fields
*/
public class DocumentsFactory {


private DocumentsFactory() {}



public static Document createIntDocument() {
return createIntDocument(Integer.MAX_VALUE, Integer.MAX_VALUE);
}


public static Document createIntDocument(int maxValue) {
return createIntDocument(maxValue, Integer.MAX_VALUE);
}


public static Document createIntDocument(int maxValue, int maxLength) {
IntDocument intDocument = new IntDocument();
intDocument.setMaxVal(maxValue);
intDocument.setMaxLength(maxLength);
return intDocument;
}
}

在接下来的类中我们定义 View :

package com.demo.textfield.version;

import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JPanel;

public class GridbagPanel extends JPanel {

private static final long serialVersionUID = 1L;


public static final Insets NO_INSETS = new Insets(0, 0, 0, 0);

public GridBagConstraints constraints;
private GridBagLayout layout;


public GridbagPanel() {
layout = new GridBagLayout();
constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.NONE;
constraints.anchor = GridBagConstraints.WEST;
constraints.insets = NO_INSETS;
setLayout(layout);
}

public void setHorizontalFill() {
constraints.fill = GridBagConstraints.HORIZONTAL;
}

public void setNoneFill() {
constraints.fill = GridBagConstraints.NONE;
}





public void add(Component component, int x, int y, int width, int
height, int weightX, int weightY) {
GridBagLayout gbl = (GridBagLayout) getLayout();

gbl.setConstraints(component, constraints);

add(component);
}


public void add(Component component, int x, int y, int width, int height) {
add(component, x, y, width, height, 0, 0);
}

public void setBothFill() {
constraints.fill = GridBagConstraints.BOTH;
}

public void setInsets(Insets insets) {
constraints.insets = insets;

}
}

我们使用包含我们主要逻辑的普通文档(您的更改应该在这里):

package com.demo.textfield.version;

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;


/**
* a class for positive integers
*/
public class IntDocument extends PlainDocument {
/**
*
*/
private static final long serialVersionUID = 1L;

public static final String NUMERIC = "0123456789";

private int maxVal = -1;
private int maxLength = -1;


public IntDocument() {
this.maxVal = -1;
maxVal = Integer.MAX_VALUE;
maxLength = Integer.MAX_VALUE;
}

public void setMaxLength(int maxLength) {
if (maxLength < 0)
throw new IllegalArgumentException("maxLength<0");
this.maxLength = maxLength;
}

public void setMaxVal(int maxVal) {
this.maxVal = maxVal;
}

public void insertString
(int offset, String str, AttributeSet attr)
throws BadLocationException {
if (str == null)
return;

if (str.startsWith(" ") && offset == 0) {
beep();
str = "";
}

if (!isValidForAcceptedCharsPolicy(str))
return;

if (validateLength(offset, str) == false)
return;

if (!isValidForMaxVal(offset, str))
return;


super.insertString(offset, str, attr);
}

public boolean isValidForAcceptedCharsPolicy(String str) {
if (str.equals("")) {
beep();
return false;
}

for (int i = 0; i < str.length(); i++) {
if (NUMERIC.indexOf(String.valueOf(str.charAt(i))) == -1) {
beep();
return false;
}
}


return true;
}


public boolean isValidForMaxVal(int offset, String toAdd) {
String str_temp;
//String str_text = "";
String str1 = "";
String str2 = "";
try {
str1 = getText(0, offset);
str2 = getText(offset, getLength() - offset);
} catch (Exception e) {
e.printStackTrace();
}

int i_value;

str_temp = str1 + toAdd + str2;
//str_temp = str_temp.trim();

i_value = Integer.parseInt(str_temp);

if (i_value > maxVal) {
beep();
return false;
} else
return true;
}

private boolean validateLength(int offset, String toAdd) {
String str_temp;
//String str_text = "";
String str1 = "";
String str2 = "";
try {
str1 = getText(0, offset);
str2 = getText(offset, getLength() - offset);
} catch (Exception e) {
e.printStackTrace();
}


str_temp = str1 + toAdd + str2;
if (maxLength < str_temp.length()) {
beep();
return false;
} else
return true;

}


private void beep() {
//java.awt.Toolkit.getDefaultToolkit().beep();
}


}

这是最后一个使用 main 方法的方法,它实现了上面发布的所有代码,你可以看到非常好的 View 。在我的例子中,我使用了由点分隔的 4 个文本字段的列表。您可以使用箭头、制表符或点从一个“窗口”跳到另一个“窗口”,或者如果您的数字长度达到 4。它将与 FocusAdapter 类的实现一起工作:

package com.demo.textfield.version;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.FocusManager;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;




/**
* diplays an version text field
*/
![enter image description here][1]public class VersionTextField extends GridbagPanel {


private static final long serialVersionUID = 1L;

/**
* a text field for each byte
*/
private JTextField[] textFields;

/**
* dots between text fields
*/
private JLabel[] dotsLabels;


/**
* used to calculate enable/disable color; never shown
*/
private static JTextField sampleTextField = new JTextField();

/**
* listen to changes in the byte fields
*/
private MyDocumentListener documentListener;

/**
* list of key listeners
*/
private List<KeyListener> keyListenersList;

/**
* List of Focus Adapter that select all data in JTextFiled during action
* */
private List<FocusAdapter> focusAdapterList;

/**
* list of key listeners
*/
private List<FocusListener> focusListenersList;

private int maxHeight = 0;

public VersionTextField() {
this(4);
}

/**
* @param byteCount
* number of bytes to display
*/
private VersionTextField(int byteCount) {

textFields = new JTextField[byteCount];
for (int i = 0; i < textFields.length; i++) {
textFields[i] = new JTextField(4);

}

//layout
//constraints.insets = new Insets(0, 0, 0, 0);

List<JLabel> dotsLabelsList = new ArrayList<JLabel>();

for (int i = 0; i < textFields.length; i++) {
JTextField textField = textFields[i];
textField.setHorizontalAlignment(JTextField.CENTER);
Document document = DocumentsFactory.createIntDocument(9999);
textField.setDocument(document);

if (i < textFields.length-1) {
add(textField, i * 2, 0, 1, 1);
if (textField.getPreferredSize().height > maxHeight)
maxHeight = textField.getPreferredSize().height;
JLabel label = new JLabel(".");



add(label, (i * 2) + 1, 0, 1, 1);
if (label.getPreferredSize().height > maxHeight)
maxHeight = label.getPreferredSize().height;
dotsLabelsList.add(label);
} else
add(textField, i * 2, 0, 1, 1);

}

//dotsLabels = new JLabel[dotsLabelsList.size()];
dotsLabels = new JLabel[dotsLabelsList.size()];


dotsLabels = dotsLabelsList.toArray(dotsLabels);

for (int i = 0; i < textFields.length; i++) {
JTextField textField = textFields[i];
textField.setBorder(BorderFactory.createEmptyBorder());
}

//init
Color backgroundColor = UIManager.getColor("TextField.background");
setBackground(backgroundColor);
Border border = UIManager.getBorder("TextField.border");
setBorder(border);

//register listeners
for (int i = 1; i < textFields.length; i++) {
JTextField field = textFields[i];
field.addKeyListener(new BackKeyAdapter());
}

documentListener = new MyDocumentListener();
for (int i = 0; i < textFields.length - 1; i++) {
JTextField field = textFields[i];
field.getDocument().addDocumentListener(documentListener);
field.addKeyListener(new ForwardKeyAdapter());
}

for (int i = 0; i < textFields.length; i++) {
JTextField textField = textFields[i];
textField.addKeyListener(new MyKeyListener());
}

for (int i = 0; i < textFields.length; i++) {
JTextField textField = textFields[i];
textField.addFocusListener(new MyFocusAdapter());
}

for (int i = 0; i < textFields.length; i++) {
JTextField textField = textFields[i];
textField.addFocusListener(new MyFocusAdapter());
}

keyListenersList = new ArrayList<KeyListener>();
focusListenersList = new ArrayList<FocusListener>();
focusAdapterList = new ArrayList<FocusAdapter>();
}

public synchronized void addKeyListener(KeyListener l) {
super.addKeyListener(l);
keyListenersList.add(l);
}

public synchronized void addFocusListener(FocusListener l) {
super.addFocusListener(l);
if (focusListenersList != null)
focusListenersList.add(l);
}

public synchronized void removeKeyListener(KeyListener l) {
super.removeKeyListener(l);
if (focusListenersList != null)
keyListenersList.remove(l);
}

public synchronized void removeFocusListener(FocusListener l) {
super.removeFocusListener(l);
keyListenersList.remove(l);
}

public void setEnabled(boolean b) {
super.setEnabled(b);
sampleTextField.setEnabled(b);
for (int i = 0; i < textFields.length; i++) {
JTextField textField = textFields[i];
textField.setEnabled(b);
}

for (int i = 0; i < dotsLabels.length; i++) {
JLabel dotsLabel = dotsLabels[i];
dotsLabel.setEnabled(b);
}

setBackground(sampleTextField.getBackground());
setForeground(sampleTextField.getForeground());
setBorder(sampleTextField.getBorder());

}

public void requestFocus() {
super.requestFocus();
textFields[0].requestFocus();
}

public void setEditable(boolean b) {
sampleTextField.setEditable(b);
setBackground(sampleTextField.getBackground());
setForeground(sampleTextField.getForeground());
setBorder(sampleTextField.getBorder());
for (int i = 0; i < textFields.length; i++) {
JTextField textField = textFields[i];
textField.setEditable(b);
}

for (int i = 0; i < dotsLabels.length; i++) {
JLabel dotsLabel = dotsLabels[i];


dotsLabel.setForeground(sampleTextField.getForeground());
}
}

public boolean isFieldEmpty() {
for (int i = 0; i < textFields.length; i++) {
JTextField textField = textFields[i];
String sCell = textField.getText().trim();
if (!(sCell.equals("")))
return false;
}
return true;
}




public Dimension getPreferredSize() {
if (super.getPreferredSize().height > maxHeight)
maxHeight = super.getPreferredSize().height;
return new Dimension(super.getPreferredSize().width, maxHeight);
}





/**
* clears current text in text fiekd
*/
private void reset() {
for (int i = 0; i < textFields.length; i++) {
JTextField textField = textFields[i];
textField.getDocument().removeDocumentListener(documentListener);
textField.setText("");
textField.getDocument().addDocumentListener(documentListener);
}
}



public static void main(String[] args) {

JFrame frame = new JFrame("test");
VersionTextField ipTextField = new VersionTextField();
ipTextField.setText("9.1.23.1479");
frame.getContentPane().setLayout(new FlowLayout());
frame.getContentPane().add(ipTextField);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}


public void setText(String version) {
if (version == null || "".equals(version) || "null".equals(version))
reset();
else {
setVer(version.split("[.]"));
}
}


private void setVer(String[] ver) {
if (ver == null) {
reset();
return;
}

Enumeration<String> enumeration = Collections.enumeration(Arrays.asList(ver));
for (int i = 0; i < textFields.length; i++) {
JTextField textField = textFields[i];
String s = (String) enumeration.nextElement();
textField.getDocument().removeDocumentListener(documentListener);
textField.setText(s);
textField.getDocument().addDocumentListener(documentListener);
}
}

public void setToolTipText(String toolTipText) {
for (int i = 0; i < textFields.length; i++) {
JTextField textField = textFields[i];
textField.setToolTipText(toolTipText);
}
}



private class MyDocumentListener implements DocumentListener {


@Override
public void insertUpdate(DocumentEvent e) {
Document document = e.getDocument();
try {
JTextField textField = (JTextField) FocusManager.getCurrentManager().getFocusOwner();

String s = document.getText(0, document.getLength());

if (s.length() == 4){ // && textField.getCaretPosition() == 2) {
textField.transferFocus();


}

} catch (BadLocationException e1) {
e1.printStackTrace();
return;
}

}

public void removeUpdate(DocumentEvent e) {
}

@Override
public void changedUpdate(DocumentEvent e) {
// Document document = e.getDocument();
// try {
// Component component = FocusManager.getCurrentManager().getFocusOwner();
// String s = document.getText(0, document.getLength());
//
// // get selected integer
// int valueInt = Integer.parseInt(s);
//
// if (valueInt > 25) {
// component.transferFocus();
// }
//
// } catch (BadLocationException e1) {
// e1.printStackTrace();
// return;
// }
}
}

private class BackKeyAdapter extends KeyAdapter {

public void keyPressed(KeyEvent e) {
JTextField textField = (JTextField) e.getComponent();
if (textField.getCaretPosition() == 0
&& KeyEvent.VK_LEFT == e.getKeyCode()
&& e.getModifiers() == 0)
textField.transferFocusBackward();
if (textField.getCaretPosition() == 0
&& KeyEvent.VK_BACK_SPACE == e.getKeyCode()
&& e.getModifiers() == 0) {
textField.transferFocusBackward();
}
}
}

private class ForwardKeyAdapter extends KeyAdapter {
public void keyPressed(KeyEvent e) {
JTextField textField = (JTextField) e.getComponent();

if (KeyEvent.VK_RIGHT == e.getKeyCode() && e.getModifiers() == 0) {
int length = textField.getText().length();
int caretPosition = textField.getCaretPosition();

if (caretPosition == length) {
textField.transferFocus();
e.consume();
}
}
if (e.getKeyChar() == '.' &&
textField.getText().trim().length() != 0) {
textField.setText(textField.getText().trim());
textField.transferFocus();
e.consume();
}
}
}

/**
* @return current text in ip text field
*/
public String getText() {
StringBuffer buffer = new StringBuffer();
String ipResult;
for (int i = 0; i < textFields.length; i++) {
JTextField textField = textFields[i];

if(textField.getText().trim().equals("")){
return "";
}

buffer.append(Integer.parseInt(textField.getText()));
if (i < textFields.length - 1){
buffer.append('.');
}
}
ipResult = buffer.toString();

return ipResult;
}

/**
* general purpose key listener
*/
private class MyKeyListener implements KeyListener {
public void keyPressed(KeyEvent e) {
for (int i = 0; i < keyListenersList.size(); i++) {
KeyListener keyListener = keyListenersList.get(i);
keyListener.keyPressed(new KeyEvent(VersionTextField.this,
e.getID(), e.getWhen(), e.getModifiers(), e
.getKeyCode(), e.getKeyChar(), e
.getKeyLocation()));
}
}

public void keyReleased(KeyEvent e) {
for (int i = 0; i < keyListenersList.size(); i++) {
KeyListener keyListener = keyListenersList.get(i);
keyListener.keyReleased(new KeyEvent(VersionTextField.this, e
.getID(), e.getWhen(), e.getModifiers(),
e.getKeyCode(), e.getKeyChar(), e.getKeyLocation()));
}
}

public void keyTyped(KeyEvent e) {
for (int i = 0; i < keyListenersList.size(); i++) {
KeyListener keyListener = keyListenersList.get(i);
keyListener.keyTyped(new KeyEvent(VersionTextField.this, e.getID(),
e.getWhen(), e.getModifiers(), e.getKeyCode(), e
.getKeyChar(), e.getKeyLocation()));
}
}
}

private class MyFocusAdapter extends FocusAdapter {

public void focusGained(FocusEvent e) {
for (int i = 0; i < focusListenersList.size(); i++) {
FocusListener focusListener = focusListenersList.get(i);
focusListener.focusGained(new FocusEvent(
VersionTextField.this,
e.getID(),
e.isTemporary(),
e.getOppositeComponent()
));
}

if(e.getComponent() instanceof javax.swing.JTextField){
highlightText((JTextField)e.getSource());
}


}

public void focusLost(FocusEvent e) {
for (int i = 0; i < focusListenersList.size(); i++) {
FocusListener focusListener = focusListenersList.get(i);
focusListener.focusLost(new FocusEvent(
VersionTextField.this,
e.getID(),
e.isTemporary(),
e.getOppositeComponent()
));
}
}

public void highlightText(javax.swing.JTextField ctr){
//ctr.setSelectionColor(Color.BLUE);
//ctr.setSelectedTextColor(Color.WHITE);
ctr.setSelectionStart(0);
ctr.setSelectionEnd(ctr.getText().length());
System.out.println(ctr.getText());

}
}


}

这里是我们得到的 View :

enter image description here

关于java - 具有内部字段或预格式化格式的 JTextField,类似于 Windows 中的 ip 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2985574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com