Swing i problem z odwolaniem do JTextField

Odpowiedz Nowy wątek
2006-12-09 16:04
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


Novitius

"If You come with nothing, You leave with nothing..."

Pozostało 580 znaków

2006-12-09 16:43
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.


Pozostało 580 znaków

2006-12-09 16:51
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?


Novitius

"If You come with nothing, You leave with nothing..."

Pozostało 580 znaków

2006-12-09 18:58
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

Pozostało 580 znaków

2006-12-10 11:40
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().


Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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