2013-07-03 3 views
2

Как some other people, которые задавали подобные вопросы, я схожу с ума, пытаясь «исправить» мой диалог JFileChooser генерации кода окно, пока я не заметил, что является генерируется, но он появляется под другими окнами и не имеют связанный значок панели задач (так что не было никакой подсказки во всем, что она существовала!).Как создать автономное диалоговое окно JFileChooser поверх других окон?

Я знаю, эти подобные вопросы:

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

Я также осведомлен о совете here о не смешивании консоли и интерфейсах Swing, но я хочу, чтобы вещи были максимально простыми.


Я хотел бы знать, как создать диалоговое окно JFileChooser (showOpenDialog), которая выше других окон без прибегая к созданию других элементов GUI (JPanel и т.д.).

Примечание 1: This site, по-видимому, обсуждает решение, но его трудно соблюдать.
Примечание 2: Если то, что я прошу, невозможно, информация о том, как по крайней мере дать диалоговому окну значок панели задач (опять же без необходимости иметь родителя), будет отличным.

Мой код, который сейчас создает диалоговое окно похоронена, находится здесь:

import javax.swing.JFileChooser; 
import javax.swing.filechooser.FileNameExtensionFilter; 

class Client { 
    String currentDirectoryFolderPath = "H:\\myFolder"; 
    javax.swing.JFileChooser jFileChooser = 
      new JFileChooser(currentDirectoryFolderPath); 
    jFileChooser.setVisible(true); //defaults to invisible?!? 
    javax.swing.filechooser.FileNameExtensionFilter fileExtensionFilter 
      = new FileNameExtensionFilter(
       comma-separated values and text files", 
       "csv", "txt"); 
    jFileChooser.setFileFilter(fileExtensionFilter); 

    //int returnVal = jFileChooser.showOpenDialog(jFileChooser); 
    //jFileChooser.showDialog(null, "testing 1--2--3"); 
    //jFileChooser.requestFocusInWindow(); 
    //jFileChooser.requestFocus(); 
    //jFileChooser.showOpenDialog(null); 
    //jFileChooser.requestFocus(); 
    int returnVal = jFileChooser.showOpenDialog(null); 

    if(returnVal == JFileChooser.APPROVE_OPTION) { 
     System.out.println("You chose to open this file: " + 
          jFileChooser.getSelectedFile().getName()); 
    } 

    System.out.println(JFileChooser.APPROVE_OPTION); 
    System.out.println(jFileChooser); 
} 

Закомментированный код все вещи, которые я попробовал, не работали, в том числе

  • разные типы запросов для фокуса до и после, вызывающего диалоговое окно, и
  • , поставляющий сам объект диалогового окна, вместо того, чтобы пропустить нуль (я думал, что это стоит того.).
+0

Почему «нет родителя»? –

+0

В основном я просто хочу, чтобы все было просто. ... но также: если вы можете * создать * выбор файла без родительского (null), то вы должны иметь возможность создавать * полезный * выбор файла без родителя. (В противном случае, в чем смысл создания его без родителя?) –

+1

Создайте свой собственный диалог, установите его всегда сверху и добавьте 'JFileChooser' к нему – MadProgrammer

ответ

2

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

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 
import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class FileChooser { 

    public static void main(String[] args) { 
     new FileChooser(); 
    } 
    private int state = JFileChooser.ERROR_OPTION; 

    public FileChooser() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFileChooser chooser = new JFileChooser(); 
       chooser.addPropertyChangeListener(new PropertyChangeListener() { 
        @Override 
        public void propertyChange(PropertyChangeEvent evt) { 
         System.out.println(evt.getPropertyName()); 
        } 
       }); 
       chooser.addActionListener(new ActionListener() { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         if (JFileChooser.CANCEL_SELECTION.equals(e.getActionCommand())) { 
          state = JFileChooser.CANCEL_OPTION; 
          SwingUtilities.windowForComponent((JFileChooser) e.getSource()).dispose(); 
         } else if (JFileChooser.APPROVE_SELECTION.equals(e.getActionCommand())) { 
          state = JFileChooser.APPROVE_OPTION; 
          SwingUtilities.windowForComponent((JFileChooser) e.getSource()).dispose(); 
         } 
        } 
       }); 
       JDialog dialog = new JDialog(); 
       dialog.setAlwaysOnTop(true); 
       dialog.setTitle("Open it sucker"); 
       dialog.setModal(true); 
       dialog.add(chooser); 
       dialog.pack(); 
       dialog.setLocationRelativeTo(null); 
       dialog.setVisible(true); 
       switch (state) { 

        case JFileChooser.APPROVE_OPTION: 
         System.out.println("approved"); 
         break; 
        case JFileChooser.CANCEL_OPTION: 
         System.out.println("cancled"); 
         break; 
        default: 
         System.out.println("Broken"); 
         break; 

       } 
      } 
     }); 
    } 
} 

Во-вторых. Если вы хотите получить значок задачи, я думаю, вам нужно создать JFrame вместо JDialog.Это означает, что кадр не будет блокироваться, когда он станет видимым, и вам нужно будет положиться на ActionListener, чтобы предоставить обратную связь вызывающему абоненту

+0

Выглядит хорошо на Mac OS. – trashgod

+0

Звучит неплохо (если это намного сложнее, чем я надеялся, чтобы просто заставить окно нормально себя вести). Является ли SetAlwaysOnTop существенным здесь? Разве нет способа заставить его вести себя как 99% других новых окон, которые появляются, то есть сверху, но не всегда остаются на вершине? (Предположим, что установка setAlwaysOnTop в true, а затем сразу на false снова может сделать это, но это похоже на kluge.) –

3

Еще одна опция для настройки диалога: подкласс JFileChooser и переопределение его createDialog с пользовательскими настройками :

public static void main(String[] args) throws AWTException { 
    Action action = new AbstractAction("open in tray") { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("Please select the file"); 
      JFileChooser fc = new JFileChooser() { 

       @Override 
       protected JDialog createDialog(Component parent) 
         throws HeadlessException { 
        JDialog dialog = super.createDialog(parent); 
        // config here as needed - just to see a difference 
        dialog.setLocationByPlatform(true); 
        // might help - can't know because I can't reproduce the problem 
        dialog.setAlwaysOnTop(true); 
        return dialog; 
       } 

      }; 
      int retValue = fc.showOpenDialog(null); 
      if(retValue == JFileChooser.APPROVE_OPTION){ 
       System.out.println(fc.getSelectedFile()); 
      }else { 
       System.out.println("Next time select a file."); 
      } 
     } 
    }; 
    TrayIcon trayIcon = new TrayIcon(XTestUtils.loadDefaultImage(), "open in tray"); 
    trayIcon.addActionListener(action); 
    SystemTray.getSystemTray().add(trayIcon); 
} 

не могу сказать, если это может помочь, потому что я не могу воспроизвести проблему (Windows Vista, jdk7) - что бы я ни старался, поверх всего появляется диалоговое окно, вероятно, сильно зависимые от ОС.

+0

Это тоже хорошо (хотя опять же, это позор, если эта сложность необходима только для того, чтобы остановить окно от * я не могу поверить, что кто-нибудь захочет этого *). Я предполагаю, что setAlwaysOnTop требуется в вашем коде, но я скоро попробую (в том числе и без него). –

+0

@ A.M. - как я уже сказал: для меня это всегда так, как и ожидалось (и я старался сделать это под фреймом;), поэтому может быть что-то в вашем контексте/OS, позволяющее ему ошибочно вести себя, что может быть или не быть достойным выслеживание – kleopatra

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