我JTextFields
在Java应用程序中有成百上千的应用程序,我想添加FocusListener
所有这些来 设置 文本的“
水平对齐” ,并在每个这些文本字段上 添加FocusListener
。因此,我做了这种方法,效果很好。但是我只是想知道这种正确的方法还是其中存在错误,或者我违反某种OOP规则?
这是代码
public void CreateFocusListenerForFields(JTextField txt)
{
txt.setHorizontalAlignment(JTextField.RIGHT);
txt.addFocusListener(new FocusListener()
{
@Override
public void focusGained(FocusEvent e) {
}
@Override
public void focusLost(FocusEvent e) {
if(!NumberUtils.isNumber(txt.getText()))
{
txt.setBackground(new Color(254,157,157));
txt.requestFocus();
}
else
{
txt.setBackground(Color.white);
}
}
});
}
并将此方法应用于我的文本字段
CreateFocusListenerForFields(MyTextField);
现在,当我运行代码时,它非常有用,只是想知道这是否正确,如果不正确,那么当您必须在数百个字段上设置对齐方式和焦点侦听器时,还有另一种方法吗?多谢您的建议。
再次,我的偏见是使用InputVerifier而不是FocusListener,仅是因为InputVerifier是较高级别的构造,并且在适用的情况下,使用它们代替较低级别(更接近金属)的构造对我来说总是更安全。
两者的一个示例:
import java.awt.Color;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import javax.swing.*;
import javax.swing.text.JTextComponent;
public class TestFieldVerification {
public static final Color ERROR_COLOR = new Color(254,157,157);
private static final int COLS = 8;
private JPanel mainPanel = new JPanel();
private JTextField verifiedField = new JTextField(COLS);
private JTextField focusCheckedField = new JTextField(COLS);
private Color defaultBackground = null;
public TestFieldVerification() {
verifiedField.setInputVerifier(new MyVerfier(this));
focusCheckedField.addFocusListener(new MyFocusCheck(this));
mainPanel.add(new JLabel("With InputVerfier:"));
mainPanel.add(verifiedField);
mainPanel.add(new JLabel("With FocusListener:"));
mainPanel.add(focusCheckedField);
}
public boolean verifyText(String text) {
try {
Integer.parseInt(text);
return true;
} catch (NumberFormatException nfe) {
return false;
}
}
public void setFieldBackground(JComponent component, boolean verified) {
if (defaultBackground == null) {
defaultBackground = component.getBackground();
}
Color bg = verified ? defaultBackground : ERROR_COLOR;
component.setBackground(bg);
}
public JComponent getMainPanel() {
return mainPanel;
}
private static void createAndShowGui() {
JFrame frame = new JFrame("MyVerifier");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new TestFieldVerification().getMainPanel());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
class MyVerfier extends InputVerifier {
private TestFieldVerification gui;
public MyVerfier(TestFieldVerification gui) {
this.gui = gui;
}
@Override
public boolean shouldYieldFocus(JComponent input) {
gui.setFieldBackground(input, super.shouldYieldFocus(input));
return super.shouldYieldFocus(input);
}
@Override
public boolean verify(JComponent input) {
String text = ((JTextComponent) input).getText();
return gui.verifyText(text);
}
}
class MyFocusCheck extends FocusAdapter {
private TestFieldVerification gui;
public MyFocusCheck(TestFieldVerification gui) {
this.gui = gui;
}
@Override
public void focusLost(FocusEvent e) {
JTextComponent textComp = (JTextComponent) e.getSource();
String text = textComp.getText();
boolean verified = gui.verifyText(text);
gui.setFieldBackground(textComp, verified);
if (!verified) {
textComp.requestFocusInWindow();
}
}
}
我有一个现有的spring boot项目和一个数据库。现在,我想添加liquibase来处理进一步的数据库迁移。做这件事的正确步骤是什么? 我已经跟随本文添加liquibase并生成Changelog。我发现的大多数文章都在讨论从零开始在项目中使用liquibase,或者对实现并不太详细。到目前为止,我已经完成了以下工作: 在src/main/resources下添加了 更新了src/main/r
问题内容: 在IntelliJ IDEA中创建新的Java项目时,将创建以下目录和文件: 我想配置IntelliJ IDEA,以将我的依赖项JAR包含到项目中。在IntelliJ IDEA中实现此目标的正确方法是什么? 问题答案: 在IntelliJ IDEA中添加外部jar的步骤: Click File from the toolbar Project Structure (CTRL + SHI
问题内容: 我能够使用三个链接来组合一个简化的完整History.js示例,以从整个页面加载内容片段,而无需更新页面和更新浏览器历史记录。 这是相关的代码段- 完整的工作示例在此处http://jsfiddle.net/PT7qx/show 我想知道这是否正确。以前的版本可以使用#url绑定到事件。我没有看到使用此最新版本将事件绑定到url的任何示例,因此我使用了.on()click事件来调用Hi
问题内容: 我以旧的方式使用Docker和卷容器: 但是现在我通过创建命名卷更改为新方法: 我将此新卷绑定到新的Jenkins容器。我只剩下一个文件夹,其中有我以前的jenkins容器的文件夹。(通过使用)现在,我要用该文件夹的内容填充新的命名卷。 我可以复制该文件夹的内容到吗? 问题答案: 您 可以 数据无疑直接复制到,但这样做你: 依靠对Docker主机的物理访问。如果您正在与远程docker
我正试图在Android Studio项目中添加库,但我得到了一个错误: 错误:找不到名称为“default”的配置。 我所做的只是遵循堆栈溢出的教程和指南 null 图书馆链接
我正在尝试将“{”文本“:”添加到字符串的开头,将“}”添加到字符串的结尾。 我一直在环顾四周,玩下面不同版本的游戏 甚至可以附加到扩展属性吗? 给我试图实现的目标添加更多信息 空的传递给