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