2014-10-19 2 views
0

У меня проблемы, я пытаюсь создать класс, который создает JFormattedTextFields, и он работает, но мне нужно получить его значение, вот когда я получил NullPointerExeption, theres - мой код:Создайте JFormattedTextField с классом

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, но я не понимаю, как это сделать.

+1

@HovercraftFullOfEels, вы хотите узнать, какая строка номер 50? Ну, упомянутый метод 'GeraObjeto.getFtfContent' содержит только одну строку, поэтому нетрудно догадаться. И я уверен, что ваш ответ был corrent, 'getFtfContent' вызывается с' aL1C1' в качестве аргумента и нет строки, там OP инициализирует эту переменную. – Tom

+0

@Tom: Да, я понял. Спасибо за ваш комментарий! –

ответ

1

Вы создаете новый JFormattedTextField, но вы не назначаете новые объекты переменным, принадлежащим вашему классу, и поэтому все переменные равны нулю. Фактически вы назначаете объект параметру вашего метода novoFtf, который автоматически не присваивает его переменной JFormattedTextField, удерживаемой классом. Я полагаю, вы могли бы сделать:

aL1C1 = textField.novoFtf(aL1C1, panel); 

Другие проблемы:

  • Ваш код, кажется излишне сложным делая отладку трудно. Я бы реорганизовал и упростил.
  • Если вам нужна сетка из полей, используйте массив или ArrayList, который поможет с моим предложением выше, с упрощением.
  • Вы используете setBounds и нулевой макет. Я предлагаю вам не делать этого, потому что это делает очень негибкий графический интерфейс, поскольку, хотя они могут хорошо выглядеть на одной платформе, выглядят ужасно на большинстве других платформ или разрешениях экрана, и их очень сложно обновить и поддерживать. Вместо этого вы захотите изучить и изучить менеджеров компоновки, а затем вложить JPanels, каждый из которых использует свой собственный менеджер компоновки для создания приятных и сложных графических интерфейсов, которые хорошо смотрятся на всех ОС.
  • Например, поля вашей матрицы должны храниться в JPanel, который использует 4 на 4 GridLayout, и этот JPanel можно поместить в основной JPanel, который использует GridBagLayout.
  • Избегайте использования KeyListener с компонентом JTextComponent, таким как JTextField или JFormattedTextField, поскольку это может привести к серьезным и сложным проблемам. Также есть лучшие способы делать такие вещи, включая использование DocumentListener, DocumentFilter, InputVerifier ...
+0

Спасибо, много. Больше, чем просто ответить на мой вопрос, вы дали мне полезные советы. Большое спасибо! –

Смежные вопросы