2016-01-06 4 views
0

Как предел this post Я столкнулся с бесконечным циклом, который заставляет компьютер сбой. Или, что ж, не совсем: кажется, что окно Java (JFrame) продолжает получать фокус/получать выделение и нормализовать бесконечно. Как таковые не пытайтесь запустить код как есть. Программа не позволит вам отключить ее, и вы не можете сделать это через диспетчер задач.Бесконечный цикл исчезновения-повтора в JFrame java

Я привел полный пример кода, который вы можете запустить - как часто советуют. Поскольку это урезанная версия реальной программы, некоторый код может казаться излишним (особенно методы в середине). Важными являются методы: самый верхний (конструктор) и два последних. Я предполагаю, что что-то не так с конструктором и/или с методом refresh.

Как указал Томас here, я поместил весь код в конструктор в блок Runnable, но, я думаю, я сделал там что-то не так.

Важным является то, что в реальной программе, этот класс не имеет основной метод, но я называю класса из другого класса, например, так:

if(getInstance() == null) { 
    initOverview(0); 
} 

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

Я искал the documentation, но не могу понять, где моя ошибка. Я использую пример Runnable неправильно? Или это из-за Window Listener и setExtendedState (чтобы обеспечить «открытие» окна), которые запускают друг друга? Если да, то как я могу это решить?

ДРУГОЙ ВНИМАНИЕ: НЕ ВЫПОЛНИТЬ ЭТОТ КОД, это сделает ваш КОМПЬЮТЕР откидывающейся

import javax.swing.*; 
import java.awt.Color; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.lang.reflect.InvocationTargetException; 
import java.awt.BorderLayout; 
import java.awt.GridLayout; 

public class OverviewTest extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private static OverviewTest instance = null; 

    private static JLabel labelTextOverview; 
    private static JTabbedPane tabbedPane; 
    private static JPanel mapPane; 

    private OverviewTest() { 
     try { 
      SwingUtilities.invokeAndWait(new Runnable() { 
       public void run() { 
        setTitle("Game - Overview"); 
        setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
        setResizable(true); 
        setBounds(100, 100, 960, 720); 

        JPanel contentPane = new JPanel(); 
        setContentPane(contentPane); 
        contentPane.setLayout(new BorderLayout(0, 0)); 

        tabbedPane = new JTabbedPane(JTabbedPane.TOP); 

        contentPane.add(tabbedPane); 

        /* TAB 1: Entity Overview */ 
        labelTextOverview = new JLabel(); 
        labelTextOverview.setText(entityOverviewHTML()); 

        JScrollPane scrollPaneEntityOverview = new JScrollPane(labelTextOverview); 

        tabbedPane.addTab("Entity overview", null, scrollPaneEntityOverview, null); 

        /* TAB 2: Map */ 
        mapPane = new JPanel(); 
        mapPane.setLayout(new GridLayout(6, 6, 2, 2)); 
        fillMap(); 

        tabbedPane.addTab("Map", null, mapPane, null); 

        /* TAB 3: Rules */ 
        JLabel labelRules = new JLabel(); 
        labelRules.setText(rulesHTML()); 

        JScrollPane scrollPaneRules = new JScrollPane(labelRules); 

        tabbedPane.addTab("Rules", null, scrollPaneRules, null); 

        // Immediately show window on creation 
        setVisible(true); 
        setExtendedState(JFrame.ICONIFIED); 
        setExtendedState(JFrame.NORMAL); 

        // Add window listener so that contents get refreshed on window active/focus 
        addWindowListener(new WindowAdapter() { 
         @Override 
         public void windowClosing(WindowEvent e) { 
          setVisible(false); 
         } 
         @Override 
         public void windowActivated(WindowEvent e){ 
          refresh(tabbedPane.getSelectedIndex()); 
         } 
         @Override 
         public void windowDeiconified(WindowEvent e){ 
          refresh(tabbedPane.getSelectedIndex()); 
         } 
        }); 
       } 
      }); 
     } catch (InvocationTargetException | InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
    public static void main(String[] args) { 
     if(getInstance() == null) { 
      initOverview(0); 
     } 
    } 
    private String rulesHTML() { 
     StringBuilder sbRules = new StringBuilder(); 

     sbRules.append("<html><body style='padding: 12px;'>"); 

     sbRules.append("<h2>Some text for Rules</h2>"); 
     sbRules.append("<h3>Lorem ipsum</h3>"); 

     sbRules.append("</body></html>"); 

     return sbRules.toString(); 
    } 

    private static void fillMap() { 
     mapPane.removeAll(); 
     for (int i = 0; i < 36; i++) { 
      JLabel textTile = new JLabel(fillTile(i)); 
      JScrollPane tile = new JScrollPane(textTile); 

      tile.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
      mapPane.add(tile); 
     } 
    } 
    private static String fillTile(int i) { 
     StringBuilder sbTile = new StringBuilder(); 

     sbTile.append("<html>"); 
     sbTile.append("some text"); 
     sbTile.append("</html>"); 

     return sbTile.toString(); 
    } 

    /** 
    * Reset UI components to system default 
    */ 
    public static void initOverview(int index) { 
     try { 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } 
     catch (UnsupportedLookAndFeelException | ClassNotFoundException | InstantiationException | IllegalAccessException e) { 
      System.err.println(e); 
     } 
     instance = new OverviewTest(); 
     tabbedPane.setSelectedIndex(index); 
    } 

    public static OverviewTest getInstance() { 
     return instance; 
    } 

    private static String entityOverviewHTML() { 
     StringBuilder sb = new StringBuilder(); 

     sb.append("<html><body style='padding: 12px;'>"); 

     sb.append("<h2>Some text for Rules</h2>"); 
     sb.append("<h3>Lorem ipsum</h3>"); 

     // Normally a loop that runs over getEntityInfo(); 
     sb.append(getEntityInfo()); 
     sb.append("</body></html>"); 

     return sb.toString(); 
    } 

    private static StringBuilder getEntityInfo() { 
     StringBuilder sbInfo = new StringBuilder(); 

     sbInfo.append("this is not a drill, but a test");   

     return sbInfo; 
    } 

    private static void bringToFront() { 
     getInstance().setVisible(true); 
     getInstance().setExtendedState(JFrame.ICONIFIED); 
     getInstance().setExtendedState(JFrame.NORMAL); 
    } 

    public static void refresh(int index) { 
     labelTextOverview.setText(entityOverviewHTML()); 
     fillMap(); 
     tabbedPane.setSelectedIndex(index); 
     getInstance().repaint(); 
     bringToFront(); 
    } 
} 

ответ

2

Я не совсем уверен, почему вы ссылаетесь как

getInstance().setExtendedState(JFrame.ICONIFIED); 
    getInstance().setExtendedState(JFrame.NORMAL); 

, но если вы удалите первый, то есть просто:

getInstance().setExtendedState(JFrame.NORMAL); 

затем оно просто открывает окно один раз, без бесконечного цикла, который вы описываете.

Причины ваш код вызывает бесконечный цикл в том, что она сводит к минимуму, а затем unminimizes кадр, что приводит к windowActivated метода запущенный: это вызывает refresh метод, который вызывает метод bringToFront, который сводит к минимуму и unminimizes рамы и т.д. .


чтобы действительно принести окно на передний план, следующие работы для меня, основываясь на this question:

private static void bringToFront() {                
    getInstance().setVisible(true);                
    getInstance().setExtendedState(JFrame.NORMAL);            
    getInstance().toFront();                  
    getInstance().repaint();                  
} 
+0

Хм, я думал, что я видел это на SO где-то, но я не могу найти, где. Вы знаете, почему это происходит? –

+0

Отредактировано для объяснения причин возникновения бесконечного цикла. –

+0

Теперь я понимаю, почему. При первом значении, а затем при нормализации вы убедитесь, что окно открыто и активно, спереди. Теперь, с вашими настройками, окна активны (они «мерцают» на панели задач), но не спереди. Было бы неплохо, если бы эта функциональность оставалась на месте. –

 Смежные вопросы

  • Нет связанных вопросов^_^