Проблема с графическим интерфейсом Java - PullRequest
0 голосов
/ 05 июля 2011

При настройке внешнего вида возникает довольно странная ошибка. Для настройки внешнего вида я использую следующее:


... String scheme = "net.sourceforge.atunes.gui.substance.SubstanceATunesSunLookAndFeel";
try {
            UIManager.setLookAndFeel(scheme);
            UIManager.put(LafWidget.ANIMATION_KIND, LafConstants.AnimationKind.NONE);
            UIManager.put(SubstanceLookAndFeel.TABBED_PANE_CONTENT_BORDER_KIND, SubstanceConstants.TabContentPaneBorderKind.SINGLE_FULL);

            JFrame.setDefaultLookAndFeelDecorated(true);
            JDialog.setDefaultLookAndFeelDecorated(true);
        } catch (ClassNotFoundException e) {
            ExceptionHandler.handleSilently(e);
        } catch (InstantiationException e) {
            ExceptionHandler.handleSilently(e);
        } catch (IllegalAccessException e) {
            ExceptionHandler.handleSilently(e);
        } catch (UnsupportedLookAndFeelException e) {
            ExceptionHandler.handleSilently(e);
        }

который помещается в основную функцию в:


SwingUtilities.invokeAndWait(new Runnable(){
                public void run(){
                    ...
                }

Прямо перед настройкой внешнего вида нет элементов графического интерфейса, поэтому нет необходимости выполнять SwingUtilities.updateComponentTreeUI (...). Итак, все в порядке, но некоторые пользователи сообщили об очень странной сумке, которая содержит необработанные окна, такие как: image When starting program User sees the following screen (the buttons appear only when he moves with the mouse over this area; before doing that the window does not show these buttons.


So, could anybody help me to find the right solution (I don't ask a solution, I just ask the right way to fix it). Firstly, I thought that it happens because of Out of memory error, but the configuration of user's computer is:

Machine configuration:
HP d530 CMT(DF373A)
Windows 7 Ultimate, 32Bit,SP1
2GB Ram
NVIDIA GeForce FX 5700 (1680x1050, 32Bit Col depth)
Java 1.6.0_26

So, I guess Out Of Memory is not the case. Any suggestions, pls.


UPD: so, every GUI creating statements were moved to one SwingUtilities.invokeLater() statement in main function! But, the problem is still reproduced by some users. Also, it's now known, that only view is so weird, but every buttons on it behave as expected! (I mean after pressing Ok button, next MVC is showed and looks well). This bug happens only with very first window which is created right after setting look-and-feel. So, I guess it's not the case of incorrect EDT usig, because of well buttons Listener's execution. Besides, our log (log4j) looks great as nothing weird happens!
Could anyone suggest possible cause?

SOLUTION see http://java.sun.com/products/java-media/2D/perf_graphics.html В качестве параметра командной строки, где был добавлен:


-Dsun.java2d.noddraw=true

1 Ответ

1 голос
/ 05 июля 2011

согласовано с @Joey

если у вас есть исходный код от Java.net от Кирилла, то есть множество примеров, которые покажут вам

1) установить пользовательский интерфейс до

UIManager.installLookAndFeel("Substance " + sInfo.getDisplayName(), sInfo.getClassName());

SwingUtilities.invokeLater(new Runnable() {

   @Override
      public void run() {
           someMainclass.setVisible(true);
      }
}); 

2) ваша проблема с необходимыми SwingUtilities.updateComponentTreeUI(someWindow) упакованными в попытку - поймать

for (Window w : Window.getWindows()) {
  SwingUtilities.updateComponentTreeUI(w);
}

3) или самый безопасный способ, обязательно с контейнерами верхнего уровня для пункта 2dn

SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            try {
                UIManager.setLookAndFeel(new SubstanceOfficeSilver2007LookAndFeel());
                SwingUtilities.updateComponentTreeUI(frame);
            } catch (UnsupportedLookAndFeelException e) {
                throw new RuntimeException(e);
            }
        }
    });
    SwingUtilities.invokeLater(new Runnable() { 

4) вы можете переключать темы, L & F, смешивая темы, но должны быть обернуты внутри InvokeLater()

5)

РЕДАКТИРОВАТЬ:

@ rauch, как я уже говорил, Substance очень чувствителен к EDT, действительно забыл заменить задачу Model from BackGround без глубоких знаний об EDT и ее правилах единой потоков,

хммм, я пытался сделать это с помощью непосредственного замещения модели, чтобы исключить некоторые из arrayIndexException плюс некоторые исключения из Substance (я забыл, что это месяц назад), * ​​1024 *

Вы никогда не обманываете это с помощью javax.swing.Timer или SwingWorker, иногда (я думаю, что HightLighter ??? или что-то из Trident.jar отказывается работать правильно ??? и перезапускать очередь EDT) никогда не решали это для деталей,

просто я все обернул (вывод из задания Backgroung в GUI) в AbstractAction

РЕДАКТИРОВАТЬ 2. когда я читаю комментарий @kleopatra (по ошибке я игнорирую ее совет)

would be my first guess as well - were it not Substance: usually it throws 
on not being on the EDT. Plus: s/he states that the first snippet is placed 
inside the invokeAndWait to let it run on the EDT

следует ее совету, Sustance имеет L&f для SwingX, а для меня SwingX == kleopatra, я не могу дать вам обходной путь, потому что я действительно ненавижу invokeAndWait и я избегаю использования этого метода

...