문제

따라서이 코드를 실행하여 배경을 변경하려고 시도하면 GUI가 충돌하고 이벤트 리스너를 무시하는 루프에 무한대에 갇히게됩니다. 코드는 다음과 같습니다.

private Panel getPanel1() {
        if (panel1 == null) {
            panel1 = new Panel();
            panel1.setLayout(new GridBagLayout());
            while(frame.isVisible()){
                panel1.addMouseListener(new java.awt.event.MouseAdapter() {
                    public void mouseClicked(java.awt.event.MouseEvent e) {
                        frame.setVisible(false);
                    }
                });
                int r = (int) (Math.random()*255);
                int g = (int) (Math.random()*255);
                int b = (int) (Math.random()*255);
                Color c = new Color(r, g, b);
                panel1.setBackground(c);
                try {
                    Thread.sleep(4000);
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
                panel1.addMouseListener(new java.awt.event.MouseAdapter() {
                    public void mouseClicked(java.awt.event.MouseEvent e) {
                        /*panel1.setVisible(false);
                        frame.setVisible(false);*/
                        System.exit(0);
                    }
                });
            }
        }
        return panel1;
}

프로그램을 종료하거나 이벤트를 종료하는 루프를 종료하는 대신 배경을 변경하면 패널을 표시하고 다른 일을하지 않아야합니다. 어떻게해야합니까?

도움이 되었습니까?

해결책

호출하여 UI 스레드를 효과적으로 차단하고 있습니다 sleep 루프에서. 그 루프에서 당신은 또한 모든 반복에 두 명의 청취자를 추가합니다. 이는 매우 기괴합니다.

UI 스레드를 차단하지 마십시오. GUI 프레임 워크가 이벤트 전달을 처리하도록하십시오. 기본적으로 현재 접근 방식이 아닌 UI에 대한 이벤트 기반 접근 방식을 취해야합니다. ~이다 이벤트는 결코 이벤트가 파견 될 수 없습니다 (발신자에게 통제를 반환하지 않기 때문에).

타이머를 통해 4 초 동안 경과를 기다리는 UI 스레드를 차단하지 않도록합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top