JButton sam się deaktywuje(?).

0

Witam

Czy jest możliwe aby zablokować dany przycisk, kiedy jego rola się skończy i odwrotnie.
Chodzi mi o coś takiego:

  private class NextPyt implements ActionListener {
      
      public void actionPerformed(ActionEvent e) {
   
         int length = pytania.length;
         //System.out.println(length);
         if(!(nr_pyt == length-1)) {
             nr_pyt++;
         }
          
          jlPytanie.setText(pytania[nr_pyt].pytanie);
      
          if(++nr_pyt == length) {
           
           jbNext.setEnabled(false);  //Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

       }
      }
  }

Gdy za pomocą przycisku zostanie wyświetlone ostatnie pytanie, chciałbym żeby przycisk został zablokowany, próbowałem jak powyżej ale pluje błędem.

Pomoże ktoś?

Pozdrawiam

0

Popraw inny fragment programu, jbNext jest równe null.

0

Dlaczego jbNext = null?


        NextPyt next = new NextPyt();
        addButton(jpDolny, jbNext, ">>>>>", null, next);
        
          .....

    private void addButton(JPanel panel, JButton button, String label, 
GridBagConstraints c, ActionListener listener) {
        
        button = new JButton(label);
        panel.add(button, c);
        button.addActionListener(listener);
    }

Przycisk jest zainicjalowany, więc dlaczego jest null?

0

W którym miejscu jest zainicjowany ?

0

button = new JButton(label); ??

tak mnie w szkole uczyli;)
Teraz to już nie wiem kiedy będzie i jak go zainicjować:/

0

To

button = new JButton(label);

inicjuje przycisk o nazwie button, a nie jbNext..
Kod masz pokręcony, spróbuj tak

  private class NextPyt implements ActionListener {
     
      public void actionPerformed(ActionEvent e) {
   
         int length = pytania.length;
         //System.out.println(length);
         if(!(nr_pyt == length-1)) {
             nr_pyt++;
         }
         
          jlPytanie.setText(pytania[nr_pyt].pytanie);
          JButton src=(JButton)(e.getSource()); 
     
          if(++nr_pyt == length) {
           
           src.setEnabled(false);  //Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

       }
      }
  }
0

działa, wielkie dzięki.
A kiedy przycisk byłby naprawdę zainicjowany w przypadku gdy chciałbym użyć funkcji addButton??

Pozdrawiam

0

Twój kod tej metody jest trochę pokręcony i niejasno napisany. Pomijam już, że prawdopodobnie jest w nim błąd niezamierzonej podwójnej inkrementacji, która może się objawiać przeskakiwaniem co drugiego pytania.
Lepiej byłoby napisać coś takiego:

	@Override public void actionPerformed(ActionEvent e)
	{
		jlPytanie.setText(pytania[nr_pyt++].pytanie);
		if((nr_pyt >= pytania.length))
			((JButton)e.getSource()).setEnabled(false);
	}

Takie trzy linijki robią to samo, a są o wiele łatwiejsze do ogarnięcia. W warunku można by też postawić równość, zamiast ">=", ale lepiej się zabezpieczać przed błędami wynikającymi z modyfikacji kodu - np. w poprzedniej linijce, gdzie zamiast nr_pyt++ mógłbyś użyć np. nr_pyt += 2

0

Dzięki za pomoc, stary poprawiony kod działał w sumie dobrze, ale proste, że zastosowałem Twój.
Nie wiem w dalszym ciągu jak zainicjować przycisk utworzony przy użyciu funkcji addButton z kodów z powyższych kodów.
Przy pojawieniu się pierwszego pytania, przycisk jbPrev, jest zdeaktywowany. Odblokowuje go naciśnięciem jbNext i odwrotnie przy ostatnim pytaniu.

private class NextPyt implements ActionListener {
     
    @Override public void actionPerformed(ActionEvent e)
        {
                jlPytanie.setText(pytania[nr_pyt++].pytanie);
                jbPrev.setEnabled(true);
                if((nr_pyt >= pytania.length))
                        ((JButton)e.getSource()).setEnabled(false);
        }
  }
  private class PrevPyt implements ActionListener {
      
      public void actionPerformed(ActionEvent e) {
          
  
         jlPytanie.setText(pytania[--nr_pyt].pytanie);
         jbNext.setEnabled(true);
         if((nr_pyt <= 0))
             ((JButton)e.getSource()).setEnabled(false);
      }
  }

Powyższy kodzik zadziała gdy przyciski są na "sztywno" zaincjowane:

PrevPyt prev = new PrevPyt(); 
        jbPrev = new JButton("<<<<<");
        jbPrev.addActionListener(prev);
        jpDolny.add(jbPrev);
        //addButton(jpDolny, jbPrev, "<<<<<", null, prev); <--- w tym przypadku użycie przycisku zwraca null
        NextPyt next = new NextPyt();
        jbNext = new JButton(">>>>>");
        jbNext.addActionListener(next);
        jpDolny.add(jbNext);
        //addButton(jpDolny, jbNext, ">>>>>", null, next); <--- w tym przypadku użycie przycisku zwraca null

Co zmienić w takiej funkcji aby przycisk przekazywany do funkcji stał się "realnie" zainicjalowany.

    private void addButton(JPanel panel, JButton button, String label, GridBagConstraints c, ActionListener listener) {
        
        button = new JButton(label);
        panel.add(button, c);
        button.addActionListener(listener);
    }

Pozdrawiam

0

Bo masz błędnie napisaną funkcję addButton:

private void addButton(JPanel panel, JButton button, String label,
GridBagConstraints c, ActionListener listener)
{
//tutaj jest błąd: niepotrzebnie tworzy zupełnie nowy przycisk gubiąc istniejący obiekt na button
        button = new JButton(label);

        panel.add(button, c);
        button.addActionListener(listener);
}

I jeszcze na koniec - być może tego nie wiesz, ale new JButton() nie tworzy przycisku widocznego na ekranie. Nie robi tego nawet panel.add() bo to polecenie tworzy tylko łącznik między obiektem JButton, a panelem. Tworzy to dopiero kod wywoływany po uruchomieniu metody setVisible() dla okienka najwyższego poziomu (JFrame itp.) w zupełnie innym miejscu. Dla uproszczenia można jednak przyjąć, że przyciskiem stanie się to co dodasz za pomocą panel.add().
Dlatego nie działają Ci polecenia: jbPrev.setEnabled(true) oraz jbNext.setEnabled(true). One obecnie włączają obiekty, dla których nie zostały utworzone komponenty ekranowe bo w ich miejsce zostały dodane inne: button = new JButton(label).

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