如何验证 java swt text中输入的时间格式是不是正确
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何验证 java swt text中输入的时间格式是不是正确相关的知识,希望对你有一定的参考价值。
/*
* http://zhidao.baidu.com/question/231229478.html
*
* 如何验证 java swt text中输入的时间格式是否正确
*/
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
public class CheckInputTimeWithSWT
private Shell shell;
private Text inputTimeText;
private Text checkResutlText;
private Button checkButton;
//标准时间格式,如 :2011-01-01 13:01:59
//年接受输入4位,或只输入后两位,月,日,时,分,秒接受输入两位(不足两位高位补0),或者只输入一位
//当采用12小时制后面需要加上 am 或者 pm ,如 2011-01-01 1:01:59 pm,否则默认 24 小时制
static String STANDART_TIME_FORMAT = "YYYY-MM-DD HH:mm:ss";
//简单的筛选,还有进一步处理
static String STANDART_TIME_FORMAT_REGEX =
"(\\\\d4|\\\\d2)-" +
"(\\\\d|\\\\d2)-" +
"(\\\\d|\\\\d2)\\\\s" +
"(\\\\d|\\\\d2):" +
"(\\\\d|\\\\d2):" +
"(\\\\d|\\\\d2)" +
"(\\\\sam|\\\\spm|\\\\sAM\\\\sPM|)"
;
public void open()
final Display display = new Display();
shell = new Shell();
shell.setSize(380, 250);
shell.setText("Check Time");
final Group group = new Group(shell, SWT.NONE);
group.setText("");
group.setBounds(20, 20, 320, 160);
//时间输入便签及输入文本框
final Label inputTimeLabel = new Label(group, SWT.NONE);
inputTimeLabel.setBounds(20, 20, 100, 25);
inputTimeLabel.setText("Input Time:");
inputTimeText = new Text(group, SWT.BORDER | SWT.READ_ONLY);
inputTimeText.setBounds(150, 20, 150, 25);
inputTimeText.setEditable(true);
//检查结果便签及显示文本框
final Label checkResultLabel = new Label(group, SWT.NONE);
checkResultLabel.setBounds(20, 65, 100, 25);
checkResultLabel.setText("Check Result:");
checkResutlText = new Text(group, SWT.BORDER | SWT.READ_ONLY);
checkResutlText.setBounds(150, 65, 150, 25);
checkResutlText.setEditable(false);
//按钮
checkButton = new Button(group, SWT.NONE);
checkButton.addSelectionListener
(
new SelectionAdapter()
public void widgetSelected(SelectionEvent e)
checkTime();
);
checkButton.setBounds(20, 105, 75, 25);
checkButton.setText("CHECK");
shell.open();
while (!shell.isDisposed())
if (!display.readAndDispatch())
display.sleep();
//时间格式检查
private void checkTime()
String time = inputTimeText.getText().trim();
int year=0,month=0,day=0,hour=0,minute=0,second=0;
boolean isLeapYear;
boolean is12Pattern = true;
boolean isMorning = true;
boolean isLegalTime = false;
if(time.matches(STANDART_TIME_FORMAT_REGEX))
isLegalTime = true;
//年
year = Integer.parseInt(time.substring(0,time.indexOf('-')));
//月
time = time.substring(time.indexOf('-')+1);
month = Integer.parseInt(time.substring(0,time.indexOf('-')));
//日
time = time.substring(time.indexOf('-')+1);
day = Integer.parseInt(time.substring(0,time.indexOf(' ')));
//时
time = time.substring(time.indexOf(' ')+1);
hour = Integer.parseInt(time.substring(0,time.indexOf(':')));
//分
time = time.substring(time.indexOf(':')+1);
minute = Integer.parseInt(time.substring(0,time.indexOf(':')));
time = time.substring(time.indexOf(':')+1);
//秒
//24小时制
if(-1 == time.indexOf(' '))
is12Pattern = false;
second = Integer.parseInt(time);
//12小时制
else
is12Pattern = true;
second = Integer.parseInt(time.substring(0,time.indexOf(' ')));
time = time.substring(time.indexOf(' ')+1);
if(time.endsWith("am"))
isMorning = true;
else
isMorning = false;
//是否闰年
if( (year%400==0) ||(year%100!=0 && year%4==0))
isLeapYear = true;
else
isLeapYear = false;
//判断月份
if(month < 1 || month > 12)
isLegalTime = false;
else
if(
( month == 2 && isLeapYear && day >=1 && day <= 29) ||
( month == 2 && !isLeapYear && day >=1 && day <= 28) ||
( month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12 && day >=1 && day <= 31) ||
( month == 4 || month == 6 || month == 9 || month == 11 && day >=1 && day <= 30)
)
if( (is12Pattern && hour >= 0 && hour <= 12 ) || (!is12Pattern && hour >= 0 && hour <= 23 ))
if(minute >= 0 && minute <= 59 && second >= 0 && second <=59 )
isLegalTime = true;
else
isLegalTime = false;
else
isLegalTime = false;
else
isLegalTime = false;
if(isLegalTime)
//将合法的输入时间标准化
String standardTime ="";
//标准年
if(year <= 10)
standardTime += "200" + String.valueOf(year);
else if(year <= 100)
standardTime += "20" + String.valueOf(year);
else
standardTime += String.valueOf(year);
standardTime += "-";
//标准月
standardTime += ( (month<=9) ? "0" + String.valueOf(month) : String.valueOf(month)) + "-";
//标准日
standardTime += ( (day<=9) ? "0" + String.valueOf(day) : String.valueOf(day) ) + " ";
//标准时
standardTime += ( (hour<=9) ? "0" + String.valueOf(hour) : String.valueOf(hour) ) + ":";
//标准分
standardTime += ( (minute<=9) ? "0" + String.valueOf(minute) : String.valueOf(minute) ) + ":";
//标准秒
standardTime += ( (second<=9) ? "0" + String.valueOf(second) : String.valueOf(second) ) ;
//标准 12 小时后缀
if(is12Pattern)
if(isMorning)
standardTime += " AM";
else
standardTime += " PM";
checkResutlText.setText(standardTime);
else
//提示标准的时间格式
checkResutlText.setText(STANDART_TIME_FORMAT);
public static void main(String[] args)
CheckInputTimeWithSWT window = new CheckInputTimeWithSWT();
window.open();
/*
* legal:
* 11-3-2 1:8:9 am
* 11-3-2 1:8:9 pm
* 11-03-02 01:08:09 am
* 00-2-29 13:14:15
*
* illegal:
* 00-2-29 13:14:15 pm
* 00-2-30 13:14:15
* 00-4-31 13:14:15
* 00-4-30 11:59:60 am
*/
参考技术A 正则表达式呗String timeBefore = text1.getText();//取得用户输入的值
timeBefore.matches("^[0-9]8+$") //0-9, 8位 参考技术B 字符串正则校验
如何组合和验证 swt 对话框的两个文本字段?
【中文标题】如何组合和验证 swt 对话框的两个文本字段?【英文标题】:How to combine and validate two text fields for a swt dialog? 【发布时间】:2014-04-10 08:31:27 【问题描述】:我还有一个问题。我对一个文本字段使用 ModifyListener 来激活和停用 swt 对话框中的 OK 按钮。它工作得很好。
现在我想为另一个文本字段添加一个 ModifyListener。我希望只有在两个文本字段中都只有一个字符时才激活 OK 按钮。
这是两个字段的代码:
descriptionText.addModifyListener(new ModifyListener()
public void modifyText(ModifyEvent e)
Text text = (Text) e.widget;
if (text.getText().length() == 0)
getButton(IDialogConstants.OK_ID).setEnabled(false);
if (text.getText().length() >= 1)
getButton(IDialogConstants.OK_ID).setEnabled(true);
);
第二个字段:
ccidText.addModifyListener(new ModifyListener()
public void modifyText(ModifyEvent e)
Text text = (Text) e.widget;
if (text.getText().length() == 0)
getButton(IDialogConstants.OK_ID).setEnabled(false);
if (text.getText().length() >= 1)
getButton(IDialogConstants.OK_ID).setEnabled(true);
);
我知道它不起作用,因为两个按钮之间没有依赖关系。 我怎样才能结合它?
我想在两个 modifylistener 都检测到一个字符时将 ok 按钮设置为 false。 如果我删除一个测试字段中的所有字符,则必须再次停用该按钮。
谢谢你。
【问题讨论】:
【参考方案1】:您可以对两个Text
字段使用相同的Listener
,并将其添加到SWT.KeyUp
:
public static void main(String[] args)
final Display display = new Display();
Shell shell = new Shell(display);
shell.setText("***");
shell.setLayout(new FillLayout(SWT.VERTICAL));
final Text first = new Text(shell, SWT.BORDER);
final Text second = new Text(shell, SWT.BORDER);
final Button button = new Button(shell, SWT.PUSH);
button.setText("disabled");
button.setEnabled(false);
Listener listener = new Listener()
@Override
public void handleEvent(Event e)
String firstString = first.getText();
String secondString = second.getText();
button.setEnabled(!isEmpty(firstString) && !isEmpty(secondString));
button.setText(button.isEnabled() ? "enabled" : "disabled");
;
first.addListener(SWT.KeyUp, listener);
second.addListener(SWT.KeyUp, listener);
shell.pack();
shell.setSize(300, shell.getSize().y);
shell.open();
while (!shell.isDisposed())
if (!display.readAndDispatch())
display.sleep();
display.dispose();
private static boolean isEmpty(String input)
if(input == null)
return true;
else
return input.trim().isEmpty();
看起来像这样:
代码将基本上(在每个按键上)检查Text
s 是否都为空。如果是这样,请禁用Button
,否则启用它。
【讨论】:
谢谢@Baz,你让我开心:) @JonnyBeton 不客气。看来你的一天并不需要太多:D以上是关于如何验证 java swt text中输入的时间格式是不是正确的主要内容,如果未能解决你的问题,请参考以下文章