Java каждая вещь в JFrame не видна - PullRequest
0 голосов
/ 11 октября 2019

Я сделал программу обмена сообщениями, где у клиента есть графический интерфейс. Перед запуском клиента клиентской программе требуется информация о пользователе и сервере. Я ввел информацию через командную строку, используя массив args.

Но теперь, когда я запустил программу, я сделал графический интерфейс для ввода информации. Я сделал это в другом классе, который вызывает класс клиента и передает информацию классу клиента. Информационный графический интерфейс работает нормально, но когда я ввожу информацию и вызываю клиентский класс, появляется рамка, но ни один из компонентов не виден в рамке.

Когда я возвращаюсь к старому методу, графический интерфейс клиента работает нормально. Я не знаю, что еще я должен сделать.

Код, который вызывает класс клиента:

btn.addActionListener(new ActionListener() {
    ...
    username = Username.getText();
    hostName = sa.getText();
    portNr = Integer.parseInt(spnr.getText());
    f.dispose();
    System.out.println("frame disposed of");
    try {
        Client client = new Client();
        f.dispose();
        Client.llc(username, hostName, portNr);
    } catch (IOException e) {
        e.printStackTrace();
    }
    }
});

Код клиента:

public static void llc(String iun, String ihn, int ipnr) throws IOException {
        username = iun;
        hostName = ihn;
        portNr = ipnr;
        launchClient();
    }

    public static void launchClient() throws IOException {
        try (
            //socket setup
            Socket socket = new Socket(hostName, portNr);
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        ) {
            System.out.println("opened streams");

            //frame setup
            JFrame frame = new JFrame("frame");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            //text field
            JTextField MSGText = new JTextField(5);

            //text area
            JTextArea MSGD = new JTextArea(20, 30);
            MSGD.setEditable(false);
            JScrollPane scrollPane = new JScrollPane(MSGD);
            System.out.println("opened streams");

            //button
            JButton b = new JButton("Send message");
            b.setPreferredSize(new Dimension(60, 30));
            b.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent event) {
                    sendMSG = MSGText.getText();
                    MSGText.setText("");
                    out.println("<" + username + ">: " + sendMSG);
                }
            });

            //panel
            JPanel p = new JPanel();
            p.setLayout(new BoxLayout(p, BoxLayout.PAGE_AXIS));
            p.add(Box.createVerticalStrut(5));
            p.add(scrollPane);
            p.add(Box.createVerticalStrut(5));
            p.add(MSGText);
            p.add(Box.createVerticalStrut(5));
            p.add(b);
            p.add(Box.createVerticalStrut(5));

            JPanel pMain = new JPanel();
            pMain.setLayout(new BoxLayout(pMain, BoxLayout.LINE_AXIS));
            pMain.add(Box.createHorizontalStrut(5));
            pMain.add(p);
            pMain.add(Box.createHorizontalStrut(5));
            frame.getContentPane().add(pMain);

            //frame visiblity
            frame.pack();
            frame.setVisible(true);
            System.out.println("opened streams");

            while((getMSG = in.readLine()) != null) {
                MSGD.append(getMSG + "\n");
                System.out.println("opened streams");
            }
        }


    }

1 Ответ

0 голосов
/ 11 октября 2019

Если ваш клиентский код является классом Client, который расширяет JFrame, то возможно, что Frame инициализируется перед компонентами. Чтобы это исправить, вы можете просто установить свой член JFrame в публичную глобальную переменную в своем классе клиента и затем вызывать client.frame.repaint () после вызова llc.

public class Client extends JFrame {
    public JFrame frame;
    //everything else the same 
}

-----------------------------------

btn.addActionListener(new ActionListener() {
    ...
    username = Username.getText();
    hostName = sa.getText();
    portNr = Integer.parseInt(spnr.getText());
    f.dispose();
    System.out.println("frame disposed of");
    try {
        Client client = new Client();
        f.dispose();
        Client.llc(username, hostName, portNr);
        client.frame.repaint();
    } catch (IOException e) {
        e.printStackTrace();
    }
    }
});
...