Swing i problem z odwolaniem do JTextField

0

Witam,

wczesniej pisywalem w dziale Delphi, to jest moj pierwszy post w temacie Java, dlatego prosze o wyrozumialosc.

Pisze z wykorzystaniem SWING. Jedna funkcja tworze sobie okno. Kolejna tworzy wszystko na ContentPane, trzecia z kolei ma za zadanie stworzenie menu. W skrocie jest to mniej wiecej tak:

public class gra extends JFrame

    private static void tworz_okno() {      
          //Create and set up the content pane.
          gra demo = new gra();
          okno.setJMenuBar(gra.createMenuBar());
          okno.setContentPane(gra.tworz_zawartosc_okna());
          okno.setVisible(true);
        }

    /*Uruchomienie*/
    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
               tworz_okno();
            }
        });
    }

    public static JMenuBar createMenuBar() {

        JMenuBar listwamenu = new JMenuBar();
        JMenu plikMenu = new JMenu("Plik");
        listwamenu.add(plikMenu);

        //Plik / Nowa gra
        final JMenuItem nowa = new JMenuItem("Nowa gra", new ImageIcon("images/menu/nowa.jpg"));
        nowa.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, ActionEvent.ALT_MASK));
        plikMenu.add(nowa);

        //----Akcja do nowej gry
        nowa.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {

               <b>lb_licznik.setText("22");</b>

        }});     
        gra.tworz_zawartosc_okna.lb_licznik.setText("2");   
        });   

        return listwamenu;
    } 

    public static Container tworz_zawartosc_okna() {
        JPanel zawartosc_okna = new JPanel(new BorderLayout());
        canvas = new JPanel ();  //dowiedz sie co to jest..
        zawartosc_okna.add (canvas, BorderLayout.CENTER);        

        JPanel panel_gorny = new JPanel ();
        panel_gorny.setBackground(Color.lightGray);
        panel_gorny.setLayout(new FlowLayout(FlowLayout.CENTER));

       <b> JTextField lb_licznik = new JTextField("1");</b>
        panel_gorny.add(lb_licznik);

        zawartosc_okna.add (panel_gorny, BorderLayout.NORTH);

           return zawartosc_okna;
     }  

    private static JPanel canvas;
}

Nie potrafie dobrac sie do lb_licznik i zmienic tam wartosci. Gdzies robie zapewne podstawowy blad.
Prosze, pomozcie.

Z gory dziekuje za pomoc
Pozdrawiam,
Rafal

0

Aby móc odwoływać się do obiektów w innych metodach musisz zadeklarować te obiekty w ciele klasy, a nie w ciele metody. Tak jak zrobiłeś z obiektem canvas, chociaż nie do końca, bo nie potrzebnie użwasz metod statycznych. Jedyną metodą statyczną powinna być main.

0

Dobrze rozumiem, ze wystarczy zatem:

public class gra extends JFrame
   public JTextField lb_licznik = new JTextField("1");

i powinno zadzialac?

Piszesz, ze tylko main powinna byc static. Tez tak chcialem ale jak tylko usune static z metody np. tworz_okno to przy kompilacji dostaje error:
non-static method tworz_okno() cannot be referenced from a static context

Gdzie jest zatem blad?

0

Wszystkie metody ustawiles jako static, a z nich mozna sie odwolywac do rzeczy tylko statcycznych.
Do ustawienia textu TextFilda zdefinuj metode np. setTextFildlWithText(String txt), oczywiscie tak jak doradzał luuki niech tobedzie zmienna klasowa, wywoluj tą metodę na rzecz klasy w ktorej jest stworzona.
Sądząc po tytule klasy, kod może sie troszke rozrosnąć i proponował bym zapoznanie sie z architektorą MVC.

Pozdrawiam BookaYashee

0
Novitius napisał(a)

Piszesz, ze tylko main powinna byc static. Tez tak chcialem ale jak tylko usune static z metody np. tworz_okno to przy kompilacji dostaje error:
non-static method tworz_okno() cannot be referenced from a static context

Tak jest, gdyż odwołujesz się do metody niestatycznej w metodzie statycznej. Jedyne poprawne rozwiązanie to deklaracja obiektu klasy gra, utworzenie przez konstruktor i wywołanie jego metody tworz_okno().

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