2017-02-21 42 views
1

В моем ноутбуке есть дисплей 4k. Мой внешний монитор - 1920. Когда я перетаскиваю окно приложения Java Swing из дисплея 4k на внешний монитор, он становится полностью черным, за исключением оконного фрейма. Не имеет значения, могу ли я увеличить его на внешнем мониторе или нет.Приложение становится черным при перетаскивании с монитора 4k на монитор FullHD

Вот пример HelloWorldSwing, который я получил от Oracle.com. Он показывает то же самое поведение.

import javax.swing.*;   

public class HelloWorldSwing { 
    /** 
    * Create the GUI and show it. For thread safety, 
    * this method should be invoked from the 
    * event-dispatching thread. 
    */ 
    private static void createAndShowGUI() { 
     //Create and set up the window. 
     JFrame frame = new JFrame("HelloWorldSwing"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //Add the ubiquitous "Hello World" label. 
     JLabel label = new JLabel("Hello World"); 
     frame.getContentPane().add(label); 

     //Display the window. 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     //Schedule a job for the event-dispatching thread: 
     //creating and showing this application's GUI. 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 

Это похоже на ошибку в Swing. Во всяком случае, я должен найти решение/работу. Есть идеи?

Я бегу JDK/JRE 1.8.0 121.

+1

1) * «Это похоже на ошибку в Swing». * Вы обыскали [База данных ошибок Java] (http://bugs.java.com/)? Если вы это сделаете и ничего не найдете, пожалуйста, поднимите его. 2) Используется ли видеокарта с последним драйвером? –

+0

@AndrewThompson Это решает проблему для меня и для будущих версий Java. Я согласен, это важно, и я сделаю свою часть. Однако я не могу сказать это клиенту. – haferblues

+0

Прохладный, дайте нам знать номер отчета об ошибке, и я более подробно рассмотрю эту проблему. –

ответ

0

Я нашел решение. В основном я добавил слушателя компонента к основному фрейму и слушаю события перемещения. Всякий раз, когда кадр перемещается, я проверяю, на каком дисплее он находится. Как только кадр был перемещен на другой дисплей, я установил его невидимым, а затем установил новые границы, расположенные на «новом» дисплее, установил расширенное состояние в максимизацию и, наконец, снова сделал рамку видимой.

За последние минуты я дико вытащил окна с одного дисплея на другой, все время прыгая от радости.Если вы также хотите, чтобы в вашей жизни было очень весело, вот этот код:

mainFrame.addComponentListener(new ComponentListener() 
    { 
     @Override 
     public void componentMoved(ComponentEvent evt) 
     { 
      GraphicsConfiguration conf = mainFrame.getGraphicsConfiguration(); 
      GraphicsDevice curDisplay = conf.getDevice(); 
      GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); 

      GraphicsDevice[] allDisplays = env.getScreenDevices(); 
      for (int i = 0; i < allDisplays.length; i++) 
      { 
       if (allDisplays[i].equals(curDisplay)) 
       { 
        //the window has been dragged to another display 
        if (i != _currentDisplayIndex) 
        { 
         final Rectangle sb = conf.getBounds(); 

         mainFrame.setVisible(false); 
         //it is important to set the bounds somewhere on the new display before setting the extended state to maximized 
         mainFrame.setBounds(sb.x, sb.y, 1000, 800); 
         mainFrame.setExtendedState(Frame.MAXIMIZED_BOTH); 
         mainFrame.setVisible(true); 

         _currentDisplayIndex = i; 
        } 
       } 
      } 

     } 

     @Override 
     public void componentShown(ComponentEvent evt) 
     { 
     } 

     @Override 
     public void componentResized(ComponentEvent evt) 
     { 
     } 

     @Override 
     public void componentHidden(ComponentEvent evt) 
     { 
     } 
    }); 

Yippie!

Замечание: Я попытался сделать снимок экрана из черного окна раньше. Тем не менее, скриншот не черный, но обычно показывает все компоненты свинг. Это заставляет меня поверить, что это не только проблема с качанием, но и какая-то проблема с драйверами windows/display. Нажатие «printscreen» не вызывает ничего в java (я думаю), но только обновляет дисплей.

1

Хотя я не сталкивался с такой проблемой еще на любых условиях полиэкранном я пытался до сих пор с свинг - я мог бы помочь ее отладки ,

Попробуйте запустить этот пример кода:

public class HelloWorldSwing 
{ 
    private static void createAndShowGUI (final GraphicsDevice device) 
    { 
     final GraphicsConfiguration conf = device.getDefaultConfiguration(); 

     final JFrame frame = new JFrame ("HelloWorldSwing", conf); 
     frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 

     final JLabel label = new JLabel ("Hello World", SwingConstants.CENTER); 
     frame.getContentPane().add (label); 

     final Rectangle sb = conf.getBounds(); 
     frame.setBounds (sb.x + sb.width/2 - 100, sb.y + sb.height/2 - 100, 200, 200); 

     frame.setVisible (true); 
    } 

    public static void main (final String[] args) 
    { 
     SwingUtilities.invokeLater (new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       final GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
       final GraphicsDevice[] devices = env.getScreenDevices(); 
       for (final GraphicsDevice device : devices) 
       { 
        if (device.getType() == GraphicsDevice.TYPE_RASTER_SCREEN) 
        { 
         createAndShowGUI (device); 
        } 
       } 
      } 
     }); 
    } 
} 

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

Проверьте, есть ли у вас такие же проблемы, как перетаскивание рамки на экран вашего ноутбука или нет, и есть ли какие-либо другие проблемы.

Редактировать 1: Также может быть очень важно знать, какую JDK/JRE вы используете для запуска вашего примера кода, поскольку произошли некоторые связанные внутренние изменения. Если вы используете какой-то старый JDK, это может быть не лучшая идея для новых версий Mac OS X.

Edit2: Я хотел бы попробовать сделать несколько вещей, чтобы узнать больше:

  1. Настройки Nimbus Look and Feel перед отображением кадров и попытаться перетащить их с этой пользовательской L & F установлен.

  2. система установки (родной) выглядеть и чувствовать себя, как shown in the tutorial here - это может иметь некоторое влияние на Mac OS X.

  3. Попробуйте запустить Java FX example и перетащить его между дисплеями и посмотреть, если вы получите ту же проблему там или а не - вы уже используете JDK 8, поэтому это должно быть легко выполнимо. Java FX - это новый интерфейс пользовательского интерфейса, который был представлен некоторое время назад.

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

+0

Я добавил мою версию jre к вопросу выше. Я также запускаю HelloWolrdSwing. Результат: – haferblues

+0

На каждом дисплее есть одно окно поворота. Оба отображаются правильно. Размер текста физически того же размера, что делает его маленьким, но читаемым на экране 4k, но невозможно читать на внешнем дисплее. Сначала мне нужно изменить размер обоих окон, потому что в противном случае я не могу их перетащить. 1) Я беру окно с дисплея 4k и перемещаю его на внешний дисплей: Окно становится черным. 2) Я беру то же окно и перетаскиваю его обратно на экран 4k: все хорошо снова. – haferblues

+0

3) Теперь я беру другое окно и перетаскиваю его с внешнего экрана на дисплей 4k: все хорошо. Текст теперь также доступен для чтения, но физически тот же размер 4) Я беру то же окно и верну его обратно на внешний дисплей: Окно становится черным. Так что независимо от того, как только я перетащил один из этих окон с 4k на внешний дисплей, он станет черным. – haferblues