我在这里遇到麻烦,我正在尝试创建一个创建JFormattedTextFields的类,并且它可以工作,但是我需要获取它的值,那就是当我得到NullPointerExeption时,这里是我的代码:
JDialog:
package br.edu.faculdadedosguararapes;
import java.awt.EventQueue;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;
import javax.swing.border.EtchedBorder;
import javax.swing.JFormattedTextField;
import javax.swing.SwingConstants;
import java.awt.Dialog.ModalityType;
import java.awt.FlowLayout;
import java.awt.Color;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class Det4x4 extends JDialog {
private JFormattedTextField aL1C1;
private JFormattedTextField aL1C2;
private JFormattedTextField aL1C3;
private JFormattedTextField aL1C4;
private JFormattedTextField aL2C1;
private JFormattedTextField aL2C2;
private JFormattedTextField aL2C3;
private JFormattedTextField aL2C4;
private JFormattedTextField aL3C1;
private JFormattedTextField aL3C2;
private JFormattedTextField aL3C3;
private JFormattedTextField aL3C4;
private JFormattedTextField aL4C1;
private JFormattedTextField aL4C2;
private JFormattedTextField aL4C3;
private JFormattedTextField aL4C4;
private JTextField tfDeterminante;
private GeraObjeto textField;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Det4x4 dialog = new Det4x4();
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public Det4x4() {
setTitle("Matriz 4x4");
setModalityType(ModalityType.APPLICATION_MODAL);
setResizable(false);
setBounds(100, 100, 487, 362);
getContentPane().setLayout(null);
JPanel panel = new JPanel();
panel.setBorder(new TitledBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null), "Matriz", TitledBorder.CENTER, TitledBorder.TOP, null, null));
panel.setBounds(12, 12, 143, 130);
getContentPane().add(panel);
panel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
textField = new GeraObjeto();
textField.novoFtf(aL1C1, panel);
textField.novoFtf(aL1C2, panel);
textField.novoFtf(aL1C3, panel);
textField.novoFtf(aL1C4, panel);
textField.novoFtf(aL2C1, panel);
textField.novoFtf(aL2C2, panel);
textField.novoFtf(aL2C3, panel);
textField.novoFtf(aL2C4, panel);
textField.novoFtf(aL3C1, panel);
textField.novoFtf(aL3C2, panel);
textField.novoFtf(aL3C3, panel);
textField.novoFtf(aL3C4, panel);
textField.novoFtf(aL4C1, panel);
textField.novoFtf(aL4C2, panel);
textField.novoFtf(aL4C3, panel);
textField.novoFtf(aL4C4, panel);
JPanel panelDet = new JPanel();
panelDet.setBorder(new TitledBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null), "Determinante", TitledBorder.CENTER, TitledBorder.TOP, null, new Color(0, 0, 0)));
panelDet.setBounds(12, 169, 125, 52);
getContentPane().add(panelDet);
tfDeterminante = new JTextField();
tfDeterminante.setHorizontalAlignment(SwingConstants.CENTER);
tfDeterminante.setEditable(false);
tfDeterminante.setColumns(5);
panelDet.add(tfDeterminante);
JButton btnCalcular = new JButton("Calcular");
btnCalcular.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
int a[][] = new int[4][4];
//CalculaDet determinante = new CalculaDet();
a[0][0] = Integer.parseInt(textField.getFtfContent(aL1C1));
/*a[0][1] = Integer.parseInt(textField.getFtfContent(aL1C2));
a[0][2] = Integer.parseInt(textField.getFtfContent(aL1C3));
a[0][3] = Integer.parseInt(textField.getFtfContent(aL1C4));
a[1][0] = Integer.parseInt(textField.getFtfContent(aL2C1));
a[1][1] = Integer.parseInt(textField.getFtfContent(aL2C2));
a[1][2] = Integer.parseInt(textField.getFtfContent(aL2C3));
a[1][3] = Integer.parseInt(textField.getFtfContent(aL2C4));
a[2][0] = Integer.parseInt(textField.getFtfContent(aL3C1));
a[2][1] = Integer.parseInt(textField.getFtfContent(aL3C2));
a[2][2] = Integer.parseInt(textField.getFtfContent(aL3C3));
a[2][3] = Integer.parseInt(textField.getFtfContent(aL3C4));
a[3][0] = Integer.parseInt(textField.getFtfContent(aL4C1));
a[3][1] = Integer.parseInt(textField.getFtfContent(aL4C2));
a[3][2] = Integer.parseInt(textField.getFtfContent(aL4C3));
a[3][3] = Integer.parseInt(textField.getFtfContent(aL4C4));*/
tfDeterminante.setText(String.valueOf(a[0][0]));
//determinante.Determinante(a[0][0], a[0][1], a[0][2], a[1][0], a[1][1], a[1][2], a[2][0], a[2][1], a[2][2],
// tfDiagonalPrincipal, tfDiagonalSecundaria, tfDeterminante);
}
});
btnCalcular.setBounds(187, 154, 99, 23);
getContentPane().add(btnCalcular);
JButton btnLimpar = new JButton("Limpar");
btnLimpar.setBounds(187, 189, 99, 23);
getContentPane().add(btnLimpar);
}
}
类:
package br.edu.faculdadedosguararapes;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFormattedTextField;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
public class GeraObjeto {
public JFormattedTextField novoFtf(JFormattedTextField nome, JPanel panel, int bound1, int bound2){
nome = new JFormattedTextField();
nome.setBounds(bound1, bound2, 22, 20);
nome.setHorizontalAlignment(SwingConstants.CENTER);
nome.setColumns(2);
nome.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent arg0) {
char c = arg0.getKeyChar();
if (!(Character.isDigit(c) || (c==KeyEvent.VK_BACK_SPACE) || c==KeyEvent.VK_DELETE || Character.toString(c).equals("-"))){
arg0.consume();
}
}
});
panel.add(nome);
return nome;
}
public JFormattedTextField novoFtf(JFormattedTextField nome, JPanel panel){
nome = new JFormattedTextField();
nome.setHorizontalAlignment(SwingConstants.CENTER);
nome.setColumns(2);
nome.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent arg0) {
char c = arg0.getKeyChar();
if (!(Character.isDigit(c) || (c==KeyEvent.VK_BACK_SPACE) || c==KeyEvent.VK_DELETE || Character.toString(c).equals("-"))){
arg0.consume();
}
}
});
panel.add(nome);
return nome;
}
public String getFtfContent(JFormattedTextField nome){
return nome.getText();
}
}
仅出于测试目的,我已经注释了几行,并试图获取文本字段之一的值,但是我得到了:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at br.edu.faculdadedosguararapes.GeraObjeto.getFtfContent(GeraObjeto.java:50)
at br.edu.faculdadedosguararapes.Det4x4$2.actionPerformed(Det4x4.java:110)
我确定我需要创建一个方法来设置JFT的值,但是我现在不知道如何。
最佳答案
您正在创建一个新的JFormattedTextField,但没有将新对象分配给您的类所拥有的变量,因此所有变量均为null。实际上,您是在将对象分配给novoFtf方法的参数,该方法不会自动将其分配给该类持有的JFormattedTextField变量。我想你可以做:
aL1C1 = textField.novoFtf(aL1C1, panel);
其他问题:
您的代码似乎不必要地复杂,使得调试变得很困难。我会重构和简化。
如果您需要一个字段网格,请使用一个数组或ArrayList,这将有助于我上面的建议,并且得到简化。
您正在使用setBounds和null布局。我要建议您不要这样做,因为这会导致非常不灵活的GUI,尽管它们在一个平台上看起来可能不错,但在大多数其他平台或屏幕分辨率上看起来却很糟糕,并且很难更新和维护。相反,您将需要学习和学习布局管理器,然后嵌套JPanels,每个JPanels都使用其自己的布局管理器来创建令人愉悦且复杂的GUI,在所有OS上都看起来不错。
例如,您的矩阵字段应由使用4 x 4 GridLayout的JPanel保留,并且可以将此JPanel放在使用GridBagLayout的主JPanel中。
避免将KeyListener与JTextComponent(例如JTextField或JFormattedTextField)一起使用,因为这会引起严重且难以调试的问题。也有更好的方法来做这种事情,包括使用DocumentListener,DocumentFilter,InputVerifier ...
关于java - 生成带有类的JFormattedTextField,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26455126/