Поток Java работает на Windows, но медленно и с сбоями на mac

#java #macos #java-threads

#java #macos #java-потоки

Вопрос:

Мой код, прикрепленный ниже, отлично работает в системе Windows. Однако на моем Mac это просто не работает. Он запускается на экране входа в систему, и все это просто замедляется и глючит, я не могу выбрать кнопку или выйти из фрейма все функции, которые я могу выполнить в своей системе Windows, любое предлагаемое исправление? Я полагаю, что это потоковая передача, опять же, код отлично работает на части счетчика Windows, только на mac.

 import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

class Screen extends JFrame{​​​​

        Screen(String sc){​​​​
                setTitle(sc);
                setSize(1000,600);
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                setVisible(false);
        }​​​​
        public void isVisible(boolean val){​​​​
                setVisible(val);
        }​​​​

}​​​​

public class Index extends Thread{

        static class LoginScreen extends Screen implements ActionListener{
                public LoginScreen(String a){
                        super(a);
                        JButton b = new JButton("Switch");
                        b.addActionListener(this);
                        add(b);   
                }

                public void actionPerformed(ActionEvent e){
                        login = false;
                        home = true;
                }

        }

        static class HomeScreen extends Screen implements ActionListener{
                public HomeScreen(String a){
                        super(a);
                        JButton b = new JButton("Switch");
                        b.addActionListener(this);
                        add(b);    
                }       
                
                public void actionPerformed(ActionEvent e){
                        home = false;
                        login = true;
                }

        }
        static boolean login = true;
        static boolean home = false;

        static LoginScreen ls = new LoginScreen("LoginScreen");
        static HomeScreen hs = new HomeScreen("HomeScreen"); 

        public void screenSetState(HomeScreen hs, LoginScreen ls){
                for(;;){
                        if(login){
                                hs.isVisible(false);
                                ls.isVisible(true);
                        }else if(home){
                                ls.isVisible(false);
                                hs.isVisible(true);
                        }
                }
        }

        public static void main(String ar[]){
                Index mainProg = new Index();
                mainProg.start(); 
        }

        public void run(){
                screenSetState(hs,ls);
        }

}
 

Выше приведен прикрепленный код для моего файла.

Ответ №1:

Проблема в том, что вы делаете в потоке.

 for (ever)
 if(login){
    hs.isVisible(false);
    ls.isVisible(true);
 }else if(home){
    ls.isVisible(false);
    hs.isVisible(true);
 }
 

Это постоянно переключает ваш экран входа в систему и домашний экран.

Избавьтесь от цикла, он вам не нужен. Установите переключатели там, где вы хотите, чтобы произошло событие.

 public void actionPerformed(ActionEvent e){
    super.isVisible(false);
    ls.isVisible(true);
}
 

Комментарии:

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

2. на самом деле, подумав, где бы я ни находился, я мог бы просто сделать, как вы упомянули. Как всегда, у меня есть другой поток, в котором я буду вечно извлекать значения с сервера, и, похоже, это просто проблема с оборудованием, какие-либо предложения?

3. Это определенно не проблема с оборудованием. Windows обрабатывает потоки иначе, чем Mac, вы сможете запускать намного больше потоков в Windows. Проблема в вашем коде