我有一个表单,它设置了一个输入验证器。
我想当一个用户为一个文本字段键入一个正确的值,并想要转到其他文本字段时,除了文本字段之外,还应该显示一个勾选图标。但现在在我的代码中,当用户在第一个文本字段上键入正确的值并转到其他时,两个图标一起显示!
public class UserDialog extends JDialog {
JButton cancelBtn, okBtn;
JTextField fNameTf, lNameTf;
JRadioButton maleRb, femaleRb;
ButtonGroup group;
JLabel fNameLbl, fNamePicLbl, lNameLbl, lNamePicLbl, genderLbl, tempBtn, temp3;
public UserDialog() {
add(createForm(), BorderLayout.CENTER);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setLocation(400, 100);
pack();
setVisible(true);
}
public JPanel createForm() {
JPanel panel = new JPanel();
ImageIcon image = new ImageIcon("Check.png");
okBtn = new JButton("Ok");
cancelBtn = new JButton("Cancel");
tempBtn = new JLabel();
fNameLbl = new JLabel("First Name");
fNamePicLbl = new JLabel(image);
fNamePicLbl.setVisible(false);
lNameLbl = new JLabel("Last Name");
lNamePicLbl = new JLabel(image);
lNamePicLbl.setVisible(false);
genderLbl = new JLabel("Gender");
maleRb = new JRadioButton("Male");
femaleRb = new JRadioButton("Female");
temp3 = new JLabel();
group = new ButtonGroup();
group.add(maleRb);
group.add(femaleRb);
fNameTf = new JTextField(10);
fNameTf.setName("FnTF");
fNameTf.setInputVerifier(new MyVerifier(new JComponent[]{maleRb, femaleRb, okBtn}));
lNameTf = new JTextField(10);
lNameTf.setName("LnTF");
lNameTf.setInputVerifier(new MyVerifier(new JComponent[]{maleRb, femaleRb, okBtn}));
panel.add(fNameLbl);
panel.add(fNameTf);
panel.add(fNamePicLbl);
panel.add(lNameLbl);
panel.add(lNameTf);
panel.add(lNamePicLbl);
panel.add(genderLbl);
JPanel radioPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
radioPanel.add(maleRb);
radioPanel.add(femaleRb);
panel.add(radioPanel);
panel.add(temp3);
panel.add(okBtn);
panel.add(cancelBtn);
panel.add(tempBtn);
panel.setLayout(new SpringLayout());
SpringUtilities.makeCompactGrid(panel, 4, 3, 50, 10, 80, 60);
return panel;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new UserDialog();
}
});
}
public class MyVerifier extends InputVerifier {
private JComponent[] component;
public MyVerifier(JComponent[] components) {
component = components;
}
@Override
public boolean verify(JComponent input) {
String name = input.getName();
if (name.equals("FnTF")) {
String text = ((JTextField) input).getText().trim();
if (text.matches(".*\\d.*") || text.length() == 0) {
//disable dependent components
for (JComponent r : component) {
r.setEnabled(false);
}
return false;
}
} else if (name.equals("LnTF")) {
String text = ((JTextField) input).getText();
if (text.matches(".*\\d.*") || text.length() == 0) {
//disable dependent components
for (JComponent r : component) {
r.setEnabled(false);
}
return false;
}
}
//enable dependent components
for (JComponent r : component) {
r.setEnabled(true);
}
fNamePicLbl.setVisible(true);
lNamePicLbl.setVisible(true);
return true;
}
}
}
}
已更新
public class MyVerifier extends InputVerifier {
private JComponent[] component;
public MyVerifier(JComponent[] components) {
component = components;
}
@Override
public boolean verify(JComponent input) {
String name = input.getName();
if (name.equals("FnTF")) {
String text = ((JTextField) input).getText().trim();
if (text.matches(".*\\d.*") || text.length() == 0) {
return false;
}
} else if (name.equals("LnTF")) {
String text = ((JTextField) input).getText();
if (text.matches(".*\\d.*") || text.length() == 0) {
return false;
}
}
return true;
}
@Override
public boolean shouldYieldFocus(JComponent input) {
boolean isValidDate = verify(input);
if (isValidDate) {
for (JComponent r : component) {
r.setEnabled(true);
}
} else {
for (JComponent r : component) {
r.setEnabled(false);
}
}
return isValidDate;
}
但现在在我的代码中,当用户在第一个文本字段上键入正确的值并转到其他时,两个图标一起显示!
因为你这样做了:(阅读评论)
public boolean verify(JComponent input) {
String name = input.getName();
if (name.equals("FnTF")) {
// your code
}
} else if (name.equals("LnTF")) {
// your code
}
//enable dependent components
for (JComponent r : component) {
r.setEnabled(true);
}
/* And Now we are here */
fNamePicLbl.setVisible(true);
lNamePicLbl.setVisible(true);
// making visible two of them at once as soon as verify is called
// on any one of the components, verifier is registered
return true;
}
setVisible
也应由if-else
条件控制。为了更好地理解,您需要做以下事情:
if (text.matches(".*\\d.*") || text.length() == 0) {
// your code
}
else
{
fNamePicLbl.setVisible(true);
}
fNameTf.setInputVerifier(new MyVerifier(new JComponent[]{maleRb, femaleRb, okBtn}));
lNameTf = new JTextField(10);
lNameTf.setName("LnTF");
lNameTf.setInputVerifier(new MyVerifier(new JComponent[]{maleRb, femaleRb, okBtn}));
verify函数只用于验证数据:在用户要求的条件下数据是否有效。它不应该再做什么了。InputVerifier
有另一个函数Boolean ShouldYieldFocus(Jcomponent)
:在将焦点转移到请求它的另一个Swing组件之前,调用输入验证器的ShouldYieldFocus
方法,该方法决定被验证的组件应该在哪里失去焦点。只有当此方法返回true
时,才会转移焦点。但是,您应该在此函数中编写所需的组件状态更改。
public boolean shouldYieldFocus(JComponent input) {
boolean isDataValid = verify(input);
if(isDataValid); //do stuff
return isDataValid; // if verify is true(valid) return true;
}
我尝试了一切,但图像不会显示,我试图缩小图像,但没有用,我试图改变路径,我试图更改图像的位置,但没有帮助,我试图在互联网上搜索,但什么都没有。 我看到的只是空白的图形用户界面,没有文本和图像。如果你能帮我,你会帮我一个大忙。 代码如下:
我正在通过一些RCP教程,这是相当困难的工作与RCP。我使用“RCP application with a View”作为模板创建了一个新的RCP项目,它生成了一个很好的视图类,但只有一个问题,当我试图运行任何RCP项目时都会发生这种情况,即当我将它作为eclipse应用程序运行时,它总是给出默认的eclipse视图。我在这里尝试了这个教程: Vogella RCP教程
飞行模式已开启。该模式会切断手表的所有无线通信。您仍可以使用手表,但无法与 Polar Flow 移动应用程序同步数据,或将其与任何无线配件一起使用。 勿打扰模式已开启。启用免打扰后,您收到通知或来电时,手表不会震动(显示屏左下方的红点仍会亮起)。背光灯激活手势也会被禁用。 启用免打扰后,您收到通知或来电时,手表不会振动(显示屏左下方的红点仍会亮起)。背光灯激活手势也会被禁用。 闹铃已设置。您可以
飞行模式已开启。飞行模式可终止来自手表的所有无线通信。您仍可以使用手表,但是,不能使用 Polar Flow 移动应用同步数据,或将手表与任何无线连接配件搭配使用。 免打扰模式已开启。启用免打扰后,您收到通知或来电时,手表不会振动(显示屏左下方的红点仍会亮起)。背光灯激活手势也会被禁用。 启用免打扰后,您收到通知或来电时,手表不会振动(显示屏下方的红点仍会亮起)。背光灯激活手势也会被禁用。 闹铃已
问题内容: 当您单击一个按钮时,我试图使JPanel进入全屏状态,而当您按Escape键时,则将其再次返回。 我设法使窗口全屏显示,但是由于添加组件的整个过程使它们从其他容器中删除,我最终得到了一个空白的JPanel。 我选择制作一个单独的JFrame来呈现全屏,其类如下(请注意,这是一个内部类,因此myPanel引用MyJFrame中已经存在的面板): 关于如何实现此目标还有其他聪明的主意吗?
我是ChartJS的新手,我有一个水平条形图: HTML JavaScript: 我试着加上 但结果还是一样。我做错了什么?我在这里发现了一些东西,但是每个条上显示的标签是Y轴的刻度。是否可以在每个栏上添加图例并保留工具提示? 提前感谢!