Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从内部类引用_Java_Arrays_Swing_Keylistener_Miglayout - Fatal编程技术网

Java 从内部类引用

Java 从内部类引用,java,arrays,swing,keylistener,miglayout,Java,Arrays,Swing,Keylistener,Miglayout,我有以下代码 import javax.swing.*; import java.awt.*; import net.miginfocom.swing.MigLayout; import Sorts.*; import javax.swing.event.*; import java.awt.event.*; import java.awt.Color; public class SortsGui { JFrame myMainWindow = new JFrame("Sorts");

我有以下代码

import javax.swing.*;
import java.awt.*;
import net.miginfocom.swing.MigLayout;
import Sorts.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.awt.Color;

public class SortsGui
{
    JFrame myMainWindow = new JFrame("Sorts");

    JPanel sortPanel = new JPanel();

    //first panel components
    public int nextTextBox = 20;
    JTextField[] allField = new JTextField [25];
    //end first panel

    public void runGUI()
    {
        myMainWindow.setBounds(10, 10, 800, 800);
        myMainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        myMainWindow.setLayout(new GridLayout(1,1));

        createSortTestPanel();

        myMainWindow.getContentPane().add(sortPanel);

        myMainWindow.setVisible(true);
    }

    public void createSortTestPanel()
    {
        MigLayout layout = new MigLayout("" , "[grow]");
        sortPanel.setLayout(layout);

        refreshScreen();
    }

    public void refreshScreen()
    {
        sortPanel.removeAll();

        for(int i = 0; i<nextTextBox;i++)
        {
            int fix = i+1;
            allField[i] = new JTextField("");
            sortPanel.add(allField[i],"growx");
            allField[i].addKeyListener(new KeyListener ()
            {
                public void keyPressed(KeyEvent e)
                {

                }

                public void keyReleased(KeyEvent e)
                {

                }

                public void keyTyped(KeyEvent e)
                {
                    char c = e.getKeyChar();
                    if(Character.isDigit(c))
                    {

                    }

                    else 
                    {
                        e.consume();
                    }

                    try
                    {
                        int parseTest = Integer.parseInt(allField[i].getText());
                    }

                    catch(Exception exc)
                    {
                        allField[i].setBackground(Color.RED);
                    }
                }
            });
        }
    }

    public static void main(String[] args)
    {
        SortsGui sG = new SortsGui();
        sG.runGUI();
    }
}
import javax.swing.*;
导入java.awt.*;
导入net.miginfocom.swing.MigLayout;
进口货物.*;
导入javax.swing.event.*;
导入java.awt.event.*;
导入java.awt.Color;
公共类SortsGui
{
JFrame myMainWindow=新JFrame(“排序”);
JPanel sortPanel=新的JPanel();
//第一面板组件
公共int nextTextBox=20;
JTextField[]allField=新的JTextField[25];
//端头面板
公营机构
{
myMainWindow.setBounds(10,10800800);
myMainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(新的GridLayout(1,1));
createSortSetPanel();
myMainWindow.getContentPane().add(sortPanel);
myMainWindow.setVisible(true);
}
public void createSortSetPanel()
{
MigLayout=新的MigLayout(“,“[grow]”);
sortPanel.setLayout(布局);
刷新屏幕();
}
公共屏幕()
{
sortPanel.removeAll();

对于(int i=0;i您有一个范围问题,这就是为什么会出现此错误:

for(int i = 0; i<nextTextBox;i++) //you are declaring i here
然后在任何地方使用它

 for(i = 0; i<nextTextBox;i++)

for(i=0;i您有一个范围问题,这就是为什么会出现此错误:

for(int i = 0; i<nextTextBox;i++) //you are declaring i here
然后在任何地方使用它

 for(i = 0; i<nextTextBox;i++)
(i=0;i)的

我的目标是创建一个JTextFields数组,其中有一个keylistener

因此,简短的回答是,不要使用
keylister
,它不会捕获用户将文本粘贴到字段中或以编程方式更新字段的用例

例如,您希望使用
文档过滤器

public class IntFilter extends DocumentFilter {

    @Override
    public void insertString(DocumentFilter.FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException {

        StringBuilder buffer = new StringBuilder(text.length());
        for (int index = 0; index < text.length(); index++) {
            if (Character.isDigit(text.charAt(index))) {
                buffer.append(text.charAt(index));
            }
        }
        super.insertString(fb, offset, buffer.toString(), attr);
        ValidationListener listener = getValidationListener();
    }

    @Override
    public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String string, AttributeSet attr) throws BadLocationException {
        if (length > 0) {
            fb.remove(offset, length);
        }
        insertString(fb, offset, string, attr);
    }
}
然后我们需要更新过滤器,以根据其规则发出这些通知

public class IntFilter extends DocumentFilter {

    private ValidationListener validationListener;

    public void setValidationListener(ValidationListener validationListener) {
        this.validationListener = validationListener;
    }

    public ValidationListener getValidationListener() {
        return validationListener;
    }

    @Override
    public void insertString(DocumentFilter.FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException {

        boolean validationFailed = false;
        StringBuilder buffer = new StringBuilder(text.length());
        for (int index = 0; index < text.length(); index++) {
            if (Character.isDigit(text.charAt(index))) {
                buffer.append(text.charAt(index));
            } else {
                validationFailed = true;
            }
        }
        super.insertString(fb, offset, buffer.toString(), attr);
        ValidationListener listener = getValidationListener();
        if (listener != null) {
            if (validationFailed) {
                listener.validationFailed();
            } else {
                listener.validationPassed();
            }
        }
    }

    @Override
    public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String string, AttributeSet attr) throws BadLocationException {
        if (length > 0) {
            fb.remove(offset, length);
        }
        insertString(fb, offset, string, attr);
    }
}
在这里,侦听器维护对我们想要控制的字段的引用

然后我们把它绑在一起

JTextField field = new JTextField(10);
DefaultValidationHandler handler = new DefaultValidationHandler(field);
IntFilter filter = new IntFilter();
filter.setValidationListener(handler);
((AbstractDocument)field.getDocument()).setDocumentFilter(filter);

这一切都有点粗糙,但它让人明白了基本的想法

一些改进可能包括通过
ValidationListener
的方法将
DocumentFilter
的引用传回,然后您可以使用它来查找触发事件的字段并对其进行更新,例如,减少可能需要创建的处理程序的数量

比如说

public class IntFilter extends DocumentFilter {

    @Override
    public void insertString(DocumentFilter.FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException {

        StringBuilder buffer = new StringBuilder(text.length());
        for (int index = 0; index < text.length(); index++) {
            if (Character.isDigit(text.charAt(index))) {
                buffer.append(text.charAt(index));
            }
        }
        super.insertString(fb, offset, buffer.toString(), attr);
        ValidationListener listener = getValidationListener();
    }

    @Override
    public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String string, AttributeSet attr) throws BadLocationException {
        if (length > 0) {
            fb.remove(offset, length);
        }
        insertString(fb, offset, string, attr);
    }
}
更新的ValidationListener 更新的IntFilter
public类IntFilter扩展了DocumentFilter{
私有ValidationListener ValidationListener;
公共void setValidationListener(ValidationListener ValidationListener){
this.validationListener=validationListener;
}
公共ValidationListener getValidationListener(){
返回validationListener;
}
@凌驾
public void insertString(DocumentFilter.FilterBypass fb,int offset,String text,AttributeSet attr)引发BadLocationException{
布尔验证失败=错误;
StringBuilder缓冲区=新的StringBuilder(text.length());
对于(int index=0;index0){
fb.移除(偏移、长度);
}
插入字符串(fb、偏移量、字符串、属性);
}
}
示例实现。。。
公共类测试窗格扩展了JPanel{
私有地图字段;
公共测试窗格(){
字段=新的HashMap(25);
ValidationListener=新建ValidationListener(){
@凌驾
公共无效验证失败(DocumentFilter筛选器){
JTextField=fields.get(过滤器);
如果(字段!=null){
退根地(颜色:红色);
}
}
@凌驾
已通过公共无效验证(DocumentFilter筛选器){
JTextField=fields.get(过滤器);
如果(字段!=null){
setBackground(UIManager.getColor(“TextField.background”);
}
}
};
setLayout(新的GridBagLayout());
GridBagConstraints gbc=新的GridBagConstraints();
gbc.gridwidth=GridBagConstraints.rements;
对于(int-index=0;index<10;index++){
JTextField=新的JTextField(10);
IntFilter=新的IntFilter();
setValidationListener(监听器);
((AbstractDocument)field.getDocument()).setDocumentFilter(filter);
fields.put(过滤器,字段);
添加(字段,gbc);
}
}
}
我的目标是创建一个JTextFields数组,其中有一个keylistener

因此,简短的回答是,不要使用
keylister
,它不会捕获用户将文本粘贴到字段中或以编程方式更新字段的用例

例如,您希望使用
文档过滤器

public class IntFilter extends DocumentFilter {

    @Override
    public void insertString(DocumentFilter.FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException {

        StringBuilder buffer = new StringBuilder(text.length());
        for (int index = 0; index < text.length(); index++) {
            if (Character.isDigit(text.charAt(index))) {
                buffer.append(text.charAt(index));
            }
        }
        super.insertString(fb, offset, buffer.toString(), attr);
        ValidationListener listener = getValidationListener();
    }

    @Override
    public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String string, AttributeSet attr) throws BadLocationException {
        if (length > 0) {
            fb.remove(offset, length);
        }
        insertString(fb, offset, string, attr);
    }
}
然后我们需要更新过滤器,以根据其规则发出这些通知

public class IntFilter extends DocumentFilter {

    private ValidationListener validationListener;

    public void setValidationListener(ValidationListener validationListener) {
        this.validationListener = validationListener;
    }

    public ValidationListener getValidationListener() {
        return validationListener;
    }

    @Override
    public void insertString(DocumentFilter.FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException {

        boolean validationFailed = false;
        StringBuilder buffer = new StringBuilder(text.length());
        for (int index = 0; index < text.length(); index++) {
            if (Character.isDigit(text.charAt(index))) {
                buffer.append(text.charAt(index));
            } else {
                validationFailed = true;
            }
        }
        super.insertString(fb, offset, buffer.toString(), attr);
        ValidationListener listener = getValidationListener();
        if (listener != null) {
            if (validationFailed) {
                listener.validationFailed();
            } else {
                listener.validationPassed();
            }
        }
    }

    @Override
    public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String string, AttributeSet attr) throws BadLocationException {
        if (length > 0) {
            fb.remove(offset, length);
        }
        insertString(fb, offset, string, attr);
    }
}
在这里,侦听器维护对我们想要控制的字段的引用

然后我们把它绑在一起

JTextField field = new JTextField(10);
DefaultValidationHandler handler = new DefaultValidationHandler(field);
IntFilter filter = new IntFilter();
filter.setValidationListener(handler);
((AbstractDocument)field.getDocument()).setDocumentFilter(filter);

这一切都有点粗糙,但它让人明白了基本的想法

一些改进可能包括pass