#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. Проблема в вашем коде