dynamiczne wstawianie komponentów JTextField

0

Witam, muszę zrobić program, który będzie rozwiązywał układ równań dowolnego stopnia.
Algorytm juz mam, męczę się natomiast z GUI.
Moja idea na ten program wygląda tak, że wpisuje w JTextField liczbe całkowitą, która reprezentuje liczbę niewiadomych, a później dynamicznie na formularzu tworzy się potrzebna ilość JextFieldów (w odpowiedznim ułożeniu) i tam można wpisać wspórzedne układu.
Problem w tym, że jak tworze zdarzenie w tym stylu

    public void actionPerformed(ActionEvent e) {
        
        if(e.getSource() == okButton) {
            int n = Integer.parseInt(sizeField.getText());
            textFields = new JTextField[4];
            for(int i=0; i<textFields.length; i++) {
                
                ratioPanel.add(textFields[i]);
            }
            ratioPanel.revalidate();

to wyrzuca wyjątki :-/

Bardzo proszę o rady, albo jakieś namiary na stronke gdzie jest dobrze omówione takie dynamiczne tworzenie komponentów.

0

jakie wyjątki lecą i w której linijce?

0
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at java.awt.Container.addImpl(Container.java:1027)
        at java.awt.Container.add(Container.java:352)
        at javaapplication4.Gui.actionPerformed(Gui.java:93)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6041)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
        at java.awt.Component.processEvent(Component.java:5806)
        at java.awt.Container.processEvent(Container.java:2058)
        at java.awt.Component.dispatchEventImpl(Component.java:4413)
        at java.awt.Container.dispatchEventImpl(Container.java:2116)
        at java.awt.Component.dispatchEvent(Component.java:4243)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
        at java.awt.Container.dispatchEventImpl(Container.java:2102)
        at java.awt.Window.dispatchEventImpl(Window.java:2440)
        at java.awt.Component.dispatchEvent(Component.java:4243)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

trzepia się linijki ratioPanel.add(textFields[i]);

Oczywiście nie dałem całego kodu tylko ten potrzebny fragment czyli odpowiedzialny za zdarzenie;
wyjątki wyskakują jak wcisne ten okButton

0

i wszystko jasne:). Nie zauważyłem tego wcześniej:

textFields = new JTextField[4];

Ten kod tworzy tylko tablice, obiektów w tej tablicy już nie. Musisz dopisać coś mniej więcej takiego:

            for(int i=0; i<textFields.length; i++) {               
                textFields[i]=new JTextField();
            }
0

Moim zdaniem są dwa błędy, winno być tak:

    public void actionPerformed(ActionEvent e) {
       
        if(e.getSource() == okButton) {
            int n = Integer.parseInt(sizeField.getText());
            textFields = new JTextField[n];  //(A)
            for(int i=0; i<textFields.length; i++) {
                textFields[i]=new JTextField(); //(B)
                ratioPanel.add(textFields[i]);
            }
            ratioPanel.revalidate();

W wierszu (A) tworzysz tablicę referencji do obiektów klasy JTextField, ale każda referencja jest nullem, dopiero wiersz (B) tworzy pole tekstowe.
Powtórzę za przedmówcą: podawaj opis wyjątku i numer wiersza.

0

masz rację :). Coś dziś mi głowa nie działa za dobrze ;)

0

Bardzo dziękuję;
Wasze podpowiedzi oczywiście podziałały i od razu mnie natchnęło i w miare szybko poszło
Już teraz tylko zostało dopicować program

PS to moja pierwsza aplikacja z GUI - stąd taka podnieta ;-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1