getText из JTextField в 1 классе и поместите его на метку в другом

У меня один класс Names и у него есть JTextField. Я пытаюсь разместить getText из этого текстового поля и сохраните его в переменной nameString1, Я тогда хочу другой класс Game звонить Names и поместите строку, собранную из `` JTextField, на метку. По какой-то причине это не отображается. Пожалуйста, дайте мне знать, если есть какие-либо ошибки новичка, мне всего 10 лет.

имена

package com.aqagame.harrykitchener;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Names 
{

    private JLabel player1Label;
    private JTextField player1Input;
    private JButton nextButton;
    public String nameString1;

    public Names()
    {
        final JFrame window = new JFrame("Player 1 username");
        JPanel firstPanel = new JPanel(new GridLayout(3,2));

        player1Label = new JLabel("Player 1");
        player1Input = new JTextField();
        nextButton = new JButton("Next");
        firstPanel.add(player1Label);
        firstPanel.add(player1Input);
        firstPanel.add(nextButton);

        nextButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                nameString1 = player1Input.getText();
                System.out.print(nameString1);
                Names2 names2Call = new Names2();
                window.dispose();
            }
        });

        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.getContentPane().add(firstPanel);
        window.setSize(250, 150);
        window.setLocationRelativeTo(null);
        window.setVisible(true);

    }

    public static void main(String args[])
    {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Names();
            }
        });
    }   

}

Игра

package com.aqagame.harrykitchener;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;


public class Game 
{

    private JLabel player1Str, player2Str;

    public Game()
    {

        JFrame window = new JFrame ("Main Game");
        JPanel drawPanel = new JPanel(new GridLayout(3, 1))
        {
            public void paintComponent(Graphics g)
            {
                Graphics2D g2d = (Graphics2D) g;

                int width = getWidth() / 4;
                int height = getHeight() / 11;

                for(int i = 0; i<4; i++)
                {
                    g.drawLine(i * width, 0, i * width, 700);
                }

                for(int i = 0; i<4; i++)
                {
                    g.drawLine(i * width, 0, i * width, 700);
                }
            }
        };

        Names namesCall2 = new Names();
        player1Str = new JLabel(namesCall2.nameString1);
        drawPanel.add(player1Str);




        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.getContentPane().add(drawPanel);
        window.setSize(700, 600);
        window.setLocationRelativeTo(null);
        window.setVisible(true);
        window.setResizable(false);

    }


    public static void main(String args[])
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new Game();
            }
        });

    }

}

2 ответа

Проблема в том, что вы устанавливаете метку без получения текста текстового поля. JLabel в вашей игре не изменится, когда вы нажмете кнопку.

Хорошо, я сделал некоторые изменения в ваших классах. Я сделал интерфейс, который будет вызываться при нажатии вашей кнопки.

Вот интерфейс:

 public interface Lawl {

    public void changename(String name);

}

Затем я реализовал этот интерфейс для игры:

public class Game implements Lawl
{

    private JLabel player1Str, player2Str;
    JPanel drawPanel;
    Names namesCall2;
    public Game()
    {

        JFrame window = new JFrame ("Main Game");
        drawPanel = new JPanel(new GridLayout(3, 1))
        {
            public void paintComponent(Graphics g)
            {
                Graphics2D g2d = (Graphics2D) g;

                int width = getWidth() / 4;
                int height = getHeight() / 11;

                for(int i = 0; i<4; i++)
                {
                    g.drawLine(i * width, 0, i * width, 700);
                }

                for(int i = 0; i<4; i++)
                {
                    g.drawLine(i * width, 0, i * width, 700);
                }
            }
        };
       // Names namesCall2 = new Names(this);
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                namesCall2 = new Names(Game.this);
            }
        });




        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.getContentPane().add(drawPanel);
        window.setSize(700, 600);
        window.setLocationRelativeTo(null);
        window.setVisible(true);
        window.setResizable(false);

    }


    public static void main(String args[])
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new Game();
            }
        });

    }


    @Override
    public void changename(String name) {
        System.out.println("I am clicked");
        player1Str = new JLabel(name);
        drawPanel.add(player1Str);  
        drawPanel.revalidate();
    }

}

В классе имен:

public class Names 
{

    private JLabel player1Label;
    private JTextField player1Input;
    private JButton nextButton;
    public String nameString1;

    public Names(){}
    public Names(final Lawl game)
    {
        final JFrame window = new JFrame("Player 1 username");
        JPanel firstPanel = new JPanel(new GridLayout(3,2));

        player1Label = new JLabel("Player 1");
        player1Input = new JTextField();
        nextButton = new JButton("Next");
        firstPanel.add(player1Label);
        firstPanel.add(player1Input);
        firstPanel.add(nextButton);

        nextButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                nameString1 = player1Input.getText();
                System.out.print(nameString1);
                game.changename(nameString1);
               // Names2 names2Call = new Names2();
                window.dispose();
            }
        });

        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.getContentPane().add(firstPanel);
        window.setSize(250, 150);
        window.setLocationRelativeTo(null);
        window.setVisible(true);

    }

}

Как это устроено??

Я создал интерфейс и реализовал его в классе игры, а затем передал ссылку интерфейса в класс Names, который будет вызываться при нажатии кнопки.

когда это называется game.changename(nameString1);по нажатию кнопки он будет вызван для класса игры, как вы могли видеть, что есть метод из реализованного интерфейса в классе игры, который будет вызываться при нажатии кнопки.

Если вы хотите объединить данные в цепочку, не создавайте новый поток Main, чтобы просто выполнить новое окно... просто используйте тот, который я сделал в коде...

Замещать

public final static JTextField player1Input;

вместо

private JTextField player1Input;
Другие вопросы по тегам