Java - 更新/更改 JFrame 的内容 - (删除旧内容)并插入新内容(面板 itd。)

发布于 2024-12-24 01:36:13 字数 8076 浏览 1 评论 0原文

目标: 当用户提供有效的登录名和密码时 -> (JFrame - 销毁登录内容) 并将自己的内容更改为游戏内容..(功能GRA)

问题:

当我尝试使用:

main.contentpane.removeAll()时: main.removeAll():
doLayout

和其他(命令)

程序不加载新内容。

这是我的代码:

class GUI implements ActionListener {

    public static JPanel image_cont;

    // definicja klasy wątka
    runner pierwiast = new runner();

    public static JFrame main = new JFrame();

    public static JLabel ilosc_pkt = new JLabel("0");

    JTextField pole, login_p, haslo_p;

    dostep_z_o logowanie = new dostep_z_o("baza_danych.txt");

    public GUI() {







        // wymiary okna x, y (zasada oznakowania, wykresy matematyczne)
        main.setSize(900, 400);

        // porządkowanie pozycji elementów
        //setLayout(new FlowLayout());

        // tytuł okna
        main.setTitle("Gra ułamki - logowanie do gry");






        main.setResizable(false);
        main.setVisible(true);


        main.setLayout(null);


        JLabel login = new JLabel("Login : ");
        JLabel haslo = new JLabel("Hasło : ");
        login_p = new JTextField("",10);
        haslo_p = new JTextField("",10);
        JButton przycisk = new JButton("Zaloguj!");

        // nadanie akcji
        przycisk.setActionCommand("Login");

        // dodanie do Action listenera
        przycisk.addActionListener(this);

        // marginery - zakres, pozycji dla obiektu
        Insets insets = main.getInsets();

        main.add(login);
        main.add(login_p);
        main.add(haslo);
        main.add(haslo_p);
        main.add(przycisk);

        // preferowany rozmiar przez jave dla elementu
        Dimension size = przycisk.getPreferredSize();
        System.out.println(size);

        login.setBounds(296 + insets.left, 4 + insets.top, 41, 16);
        login_p.setBounds(342 + insets.left, 2 + insets.top, 114, 20);
        haslo.setBounds(296 + insets.left, 32 + insets.top, 41, 16);
        haslo_p.setBounds(342 + insets.left, 30 + insets.top, 114, 20);
        przycisk.setBounds(467 + insets.left, 2 + insets.top, 117, 48);
        // (900 / 2) - ((41 + 5 + 114 + 11 + 117) / 2 )
        // 450 -               144 = 296



        main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    public void gra()
    {

        main.removeAll();
        main.getContentPane().removeAll();

        main.setTitle("Gra ułamki - złap pierwiastki chemiczne. Quickly! -- Aktualna ilość punktów : " + runner.punkty);

        JPanel content = new JPanel();
        content.setBackground(Color.green);
        //content.setLayout(new BorderLayout(200, 200));
        content.setPreferredSize(new Dimension(900, 75));
        content.setLayout(null);
        //content.setSize(0, 0);

        // pole tekstowe
        pole = new JTextField("",2);
        // definiowanie przycisku
        JButton przycisk = new JButton("Zatwierdź wprowadzenie!");
        // nadanie komendy wysyłanej do action listenera
        przycisk.setActionCommand("Spr");
        // dodanie do Action listenera
        przycisk.addActionListener(this);

        //opis punktów
        JLabel opis_p = new JLabel("Ilość punktów : ");

        JLabel n_pierw = new JLabel("Nazwa pierwiastka : ");
        //ilosc_pkt

        // marginery - zakres, pozycji dla obiektu
        Insets insets = content.getInsets();

        content.add(n_pierw);
        content.add(pole);
        content.add(przycisk);
        content.add(opis_p);
        content.add(ilosc_pkt);




        // setBounds - ustawia pozycje, Od lewej krawedzi, od gornej krawedzi, dlugosc_obiektu, _ jego wysokosc
        // przy ustalaniu pozyucji trzeba wziasc pod uwage margines     
        n_pierw.setBounds(284 + insets.left, 12 + insets.top, 117, 16);
        pole.setBounds(284 + 115 + insets.left, 10 + insets.top, 30, 20);
        przycisk.setBounds(284 + 153 + insets.left, 7 + insets.top, 179, 26);

        // Do prawego boku
        opis_p.setBounds(750 + insets.left, 12 + insets.top, 88, 16);
        ilosc_pkt.setBounds(840 + insets.left, 9 + insets.top, 88, 22);

        // ustawienia Fonta
        Font font = new Font ("Calibri", Font.BOLD, 20);
        ilosc_pkt.setFont(font);





        main.getContentPane().setLayout(new FlowLayout());
        main.getContentPane().add(pierwiast);
        main.getContentPane().add(content);





        pierwiast.kontrola_gui(this);
        pierwiast.init();     




        main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getActionCommand().equals("Spr"))
        {
            // pobranie tekstu z TextFielda
            String w_pierw = pole.getText();

            // Sprawdza czy String nie jest pusty
            if(!("").equals(w_pierw) && pierwiast.x1 != -1)
            {

                // sprawdza wprowadzony pierwiastek czy jest taki sam jak wpisalismy
                if (!w_pierw.equals(pierwiast.tab_pierw[pierwiast.x1].p_ch_n))
                {

                    // Zmniejszenie ilości punktów
                    pierwiast.punkty -=1;
                    ilosc_pkt.setText(Integer.toString(pierwiast.punkty));

                    JOptionPane.showMessageDialog(null, "Źle! Módl się byś nie zostął/a potraktowany/a chlorem!");
                    main.setTitle("Gra ułamki - złap pierwiastki chemiczne. Quickly! - " + pierwiast.tab_pierw[runner.x1].p_ch_n + " - Źle (-1 punkt) -- Aktualna ilość punktów : " + pierwiast.punkty);
                }
                else
                {
                    JOptionPane.showMessageDialog(null, "Poprawnie! Pani z chemii się cieszy!");

                    // Zwiększenie ilości punktów
                    pierwiast.punkty +=1;
                    ilosc_pkt.setText(Integer.toString(pierwiast.punkty));

                    main.setTitle("Gra ułamki - złap pierwiastki chemiczne. Quickly! - " + pierwiast.tab_pierw[runner.x1].p_ch_n + " - Dobrze (+1 punkt) -- Aktualna ilość punktów : " + pierwiast.punkty);
                    // ustawienie statusu do znikniecia
                    pierwiast.tab_pierw[pierwiast.x1].status_p = 2;

                    // usuwanie poprzedniego wyboru pierwiastka (unikniecie ponownego odkrycia)
                    pierwiast.x1 = -1;

                    //czyszczenie pola - do wpisywania
                    pole.setText("");

                }
            }
            else
            {
                 JOptionPane.showMessageDialog(null, "Nie wpisano nazwy pierwiastka lub nie kliknięto");
            }

        }
        else if (e.getActionCommand().equals("Login"))
        {
            String login = login_p.getText();
            String haslo = haslo_p.getText();

            if(!"".equals(login) && !"".equals(haslo))
            {
                logowanie.logowanie(login, haslo);

                if (logowanie.login)
                {
                    this.gra();
                }
            }
            else
            {
                JOptionPane.showMessageDialog(null, "Nie wpisano loginu i hasła");
            }
        }
    }


}

我哪里出错了? 怎么了?

--- [编辑] ---

解决(对于其他搜索者):

@Dave提示

//为每个组件添加重新验证(Gra函数)

        main.getContentPane().add(pierwiast);
        main.getContentPane().add(content);

        pierwiast.revalidate();
        content.revalidate();

和(在开始gra函数)

        //main.getContentPane().removeAll(); <- Delete this
        //main.getContentPane().validate(); <- Delete this

        main.setTitle("Gra ułamki - złap pierwiastki chemiczne. Quickly! -- Aktualna ilość punktów : " + runner.punkty);

和 加载之前(函数gra)(public void actionPerformed) 在

                if (logowanie.login)
                {
                    main.getContentPane().removeAll(); //add this
                    main.repaint(); //add this
                    main.validate(); //add this
                    this.gra();
                }

Target:
When user give valid login and password -> (JFrame - Destroy login content)
And Change own content to game content.. (function GRA)

Problem:

When i try use :

main.contentpane.removeAll():
main.removeAll():
doLayout

And others (Command)

Program doesn't load a new content.

Here is my code :

class GUI implements ActionListener {

    public static JPanel image_cont;

    // definicja klasy wątka
    runner pierwiast = new runner();

    public static JFrame main = new JFrame();

    public static JLabel ilosc_pkt = new JLabel("0");

    JTextField pole, login_p, haslo_p;

    dostep_z_o logowanie = new dostep_z_o("baza_danych.txt");

    public GUI() {







        // wymiary okna x, y (zasada oznakowania, wykresy matematyczne)
        main.setSize(900, 400);

        // porządkowanie pozycji elementów
        //setLayout(new FlowLayout());

        // tytuł okna
        main.setTitle("Gra ułamki - logowanie do gry");






        main.setResizable(false);
        main.setVisible(true);


        main.setLayout(null);


        JLabel login = new JLabel("Login : ");
        JLabel haslo = new JLabel("Hasło : ");
        login_p = new JTextField("",10);
        haslo_p = new JTextField("",10);
        JButton przycisk = new JButton("Zaloguj!");

        // nadanie akcji
        przycisk.setActionCommand("Login");

        // dodanie do Action listenera
        przycisk.addActionListener(this);

        // marginery - zakres, pozycji dla obiektu
        Insets insets = main.getInsets();

        main.add(login);
        main.add(login_p);
        main.add(haslo);
        main.add(haslo_p);
        main.add(przycisk);

        // preferowany rozmiar przez jave dla elementu
        Dimension size = przycisk.getPreferredSize();
        System.out.println(size);

        login.setBounds(296 + insets.left, 4 + insets.top, 41, 16);
        login_p.setBounds(342 + insets.left, 2 + insets.top, 114, 20);
        haslo.setBounds(296 + insets.left, 32 + insets.top, 41, 16);
        haslo_p.setBounds(342 + insets.left, 30 + insets.top, 114, 20);
        przycisk.setBounds(467 + insets.left, 2 + insets.top, 117, 48);
        // (900 / 2) - ((41 + 5 + 114 + 11 + 117) / 2 )
        // 450 -               144 = 296



        main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    public void gra()
    {

        main.removeAll();
        main.getContentPane().removeAll();

        main.setTitle("Gra ułamki - złap pierwiastki chemiczne. Quickly! -- Aktualna ilość punktów : " + runner.punkty);

        JPanel content = new JPanel();
        content.setBackground(Color.green);
        //content.setLayout(new BorderLayout(200, 200));
        content.setPreferredSize(new Dimension(900, 75));
        content.setLayout(null);
        //content.setSize(0, 0);

        // pole tekstowe
        pole = new JTextField("",2);
        // definiowanie przycisku
        JButton przycisk = new JButton("Zatwierdź wprowadzenie!");
        // nadanie komendy wysyłanej do action listenera
        przycisk.setActionCommand("Spr");
        // dodanie do Action listenera
        przycisk.addActionListener(this);

        //opis punktów
        JLabel opis_p = new JLabel("Ilość punktów : ");

        JLabel n_pierw = new JLabel("Nazwa pierwiastka : ");
        //ilosc_pkt

        // marginery - zakres, pozycji dla obiektu
        Insets insets = content.getInsets();

        content.add(n_pierw);
        content.add(pole);
        content.add(przycisk);
        content.add(opis_p);
        content.add(ilosc_pkt);




        // setBounds - ustawia pozycje, Od lewej krawedzi, od gornej krawedzi, dlugosc_obiektu, _ jego wysokosc
        // przy ustalaniu pozyucji trzeba wziasc pod uwage margines     
        n_pierw.setBounds(284 + insets.left, 12 + insets.top, 117, 16);
        pole.setBounds(284 + 115 + insets.left, 10 + insets.top, 30, 20);
        przycisk.setBounds(284 + 153 + insets.left, 7 + insets.top, 179, 26);

        // Do prawego boku
        opis_p.setBounds(750 + insets.left, 12 + insets.top, 88, 16);
        ilosc_pkt.setBounds(840 + insets.left, 9 + insets.top, 88, 22);

        // ustawienia Fonta
        Font font = new Font ("Calibri", Font.BOLD, 20);
        ilosc_pkt.setFont(font);





        main.getContentPane().setLayout(new FlowLayout());
        main.getContentPane().add(pierwiast);
        main.getContentPane().add(content);





        pierwiast.kontrola_gui(this);
        pierwiast.init();     




        main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getActionCommand().equals("Spr"))
        {
            // pobranie tekstu z TextFielda
            String w_pierw = pole.getText();

            // Sprawdza czy String nie jest pusty
            if(!("").equals(w_pierw) && pierwiast.x1 != -1)
            {

                // sprawdza wprowadzony pierwiastek czy jest taki sam jak wpisalismy
                if (!w_pierw.equals(pierwiast.tab_pierw[pierwiast.x1].p_ch_n))
                {

                    // Zmniejszenie ilości punktów
                    pierwiast.punkty -=1;
                    ilosc_pkt.setText(Integer.toString(pierwiast.punkty));

                    JOptionPane.showMessageDialog(null, "Źle! Módl się byś nie zostął/a potraktowany/a chlorem!");
                    main.setTitle("Gra ułamki - złap pierwiastki chemiczne. Quickly! - " + pierwiast.tab_pierw[runner.x1].p_ch_n + " - Źle (-1 punkt) -- Aktualna ilość punktów : " + pierwiast.punkty);
                }
                else
                {
                    JOptionPane.showMessageDialog(null, "Poprawnie! Pani z chemii się cieszy!");

                    // Zwiększenie ilości punktów
                    pierwiast.punkty +=1;
                    ilosc_pkt.setText(Integer.toString(pierwiast.punkty));

                    main.setTitle("Gra ułamki - złap pierwiastki chemiczne. Quickly! - " + pierwiast.tab_pierw[runner.x1].p_ch_n + " - Dobrze (+1 punkt) -- Aktualna ilość punktów : " + pierwiast.punkty);
                    // ustawienie statusu do znikniecia
                    pierwiast.tab_pierw[pierwiast.x1].status_p = 2;

                    // usuwanie poprzedniego wyboru pierwiastka (unikniecie ponownego odkrycia)
                    pierwiast.x1 = -1;

                    //czyszczenie pola - do wpisywania
                    pole.setText("");

                }
            }
            else
            {
                 JOptionPane.showMessageDialog(null, "Nie wpisano nazwy pierwiastka lub nie kliknięto");
            }

        }
        else if (e.getActionCommand().equals("Login"))
        {
            String login = login_p.getText();
            String haslo = haslo_p.getText();

            if(!"".equals(login) && !"".equals(haslo))
            {
                logowanie.logowanie(login, haslo);

                if (logowanie.login)
                {
                    this.gra();
                }
            }
            else
            {
                JOptionPane.showMessageDialog(null, "Nie wpisano loginu i hasła");
            }
        }
    }


}

Where I make fault?
What is wrong?

--- [edit] ---

Resolve (For other seekers):

@Dave tip

//add revalidate for each component (Gra function)

        main.getContentPane().add(pierwiast);
        main.getContentPane().add(content);

        pierwiast.revalidate();
        content.revalidate();

And (At the start gra function)

        //main.getContentPane().removeAll(); <- Delete this
        //main.getContentPane().validate(); <- Delete this

        main.setTitle("Gra ułamki - złap pierwiastki chemiczne. Quickly! -- Aktualna ilość punktów : " + runner.punkty);

And
Before load (function gra) (public void actionPerformed)
in

                if (logowanie.login)
                {
                    main.getContentPane().removeAll(); //add this
                    main.repaint(); //add this
                    main.validate(); //add this
                    this.gra();
                }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

撩起发的微风 2024-12-31 01:36:14

完成新内容的设置后,您需要在 main 上调用 revalidate()

You need to call revalidate() on main when you're done setting up the new content.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文