سؤال

لدي JDIALOG مع زر / TextField للمستخدم لتحديد ملف. إليك الرمز:

FileDialog chooser = new FileDialog(this, "Save As", FileDialog.SAVE );
String startDir = saveAsField.getText().substring( 0, saveAsField.getText().lastIndexOf('\\') );
chooser.setDirectory(startDir);
chooser.setVisible(true);
String fileName = chooser.getFile();

مشكلتي هي أنه بدلا من رؤية فلتر جميع الملفات، أريد توفير عامل تصفية مخصص، على سبيل المثال بالنسبة لمستندات Word أو أي شيء. أقوم بإعداد Filenamefilter مخصص باستخدام SetFilenamefilter ()، لكنه لا يبدو يعمل. لقد لاحظت أنه يقول في المستندات أن المرشح المخصص لا يعمل في Windows (يعمل هذا في نظام التشغيل Windows XP / Vista / 7). هنا كان تنفيذي للمرشح:

chooser.setFilenameFilter( new geFilter() );
public class geFilter implements FilenameFilter {
    public boolean accept(File dir, String name) {
        return name.endsWith( ".doc" ) || name.endsWith( ".docx" );
    }
}

أفعل شيئا خطأ هنا؟ أيضا، أريد وصفا أن تظهر في المربع، مثل "Microsoft Word (* .doc * .docx)" لكنني لست متأكدا من كيفية القيام بذلك.

أي وجميع المساعدة موضع تقدير.

هل كانت مفيدة؟

المحلول

AWT ليست حقا الطريقة المفضلة لكتابة تطبيقات Java Gui هذه الأيام. يبدو أن الشمس قد تخلت عنها في الغالب. الخيارات الأكثر شعبية هي الأرجوحة ساخر. وبعد لذلك أعتقد أنهم لم يطورون حقا واجهات برمجة التطبيقات على نطاق واسع للغاية لإضافة ميزات حديثة. (خطأ، للإجابة على سؤالك: لا يبدو أنك قادر على القيام بذلك مع AWT)

Swing لديه ميزة أنه يكتب حقا مرة واحدة في أي مكان ويمكن أن تبدو بالضبط في كل مكان. هناك نظرة وشعور بأنها تحاول أن تصنع الأرجوحة مظهرا مواطنا، وبعضها أفضل من غيرها (ماك ليس فظيعا، ويندوز على ما يرام، GTK ليس). ومع ذلك، إذا كنت تريد تطبيقا ينظر حقا ويخصص نفسه بالضبط في كل مكان، فسوف يتيح لك التأرجح القيام بذلك. بالإضافة إلى أنها تنفد من المربع دون أي مكتبات إضافية. الأداء ليس رائعا.

سوينغ jfilechooser. سوف تتيح لك أن تفعل ما تريد. إنشاء فرعية من filefilter. و اتصل setFileFilter على ال JFileChooser.

SWT يأخذ الكتابة مرة واحدة في أي مكان إلى أقصى الحدود. لا يزال لديك رمز كود واحد تكتبه، لكنه يستخدم بالفعل الحاجيات الأصلية على كل منصة لذلك يبدو عموما مثل التطبيق الأصلي (وليس مثاليا في كل مكان، ولكن لا يزال مثيرا للإعجاب). انها سريعة وموثوقة جدا في تجربتي. يستخدم Eclipse (وغيرها من البرامج الرئيسية الأخرى) SWT لذلك فهي في استخدام ثقيل للغاية. لكنها تتطلب الجرار و DLLs الخاصة بالمنصة.

نصائح أخرى

نظرا لأنك تستخدم Jdialog، فهذا فئة أرجوحة لماذا لا تستخدم jfilechooser.?

 JFileChooser fc = new JFileChooser("C:\\");
 fc.setFileFilter(new FileNameExtensionFilter("Microsoft Word (*.doc, *.docx)", "doc", "docx"));

filenameextensionfilter. هي فئة Java 6 لطيفة التي تفعل بالضبط ما تريد.

أنا أيضا أحاول القيام بذلك. أريد استخدام filedialog بدلا من jfilechooser.

لقد وجدت الإجابة هنا: http://www.rgagnon.com/javadetails/java-0247.html.

يقول أن "في منصة الفوز، لا تعمل طريقة SetFilenamefilterter. يجب أن نستخدم طريقة SetFile بدلا من ذلك لتعيين عامل تصفية."

يوجد رمز مصدر على الرابط المحدد.

لقد اختبرت وتعمل:

FileDialog fd = new FileDialog((Frame) null, "Save File", FileDialog.SAVE);
fd.setFile("*.txt");
fd.setVisible(true);

String file = fd.getFile();
System.out.println(file);
System.exit(0);

يمكنك استدعاء Windows Filedialog الأصلي (CFIDEIALOG) مع JNI. يمكن تعيين المرشحات ل CFIDEIALOG بسهولة.

كتبت فئة مجمع بسيطة ل cfiledialog منذ عدة أشهر، إذا كنت مهتما، يمكنك الحصول على المصدر والثنائي من

مشروع XfileDialog على رمز Google

إذا كنت تستخدم من أي وقت مضى Javafx 2., ، ال filechooser. سوف تفعل الفصل بالضبط ما تحتاجه دون أي من مشاكل JFilechooser / Filedialog. يمكنك أيضا تضمين مكونات Javafx 2 داخل تطبيقات التأرجح، لكنك تحتاج جافافكس وقت التشغيل.

مثال:

    FileChooser fc = new FileChooser();
    FileChooser.ExtensionFilter filter;
    filter = new FileChooser.ExtensionFilter("Text files (*.txt)", "*.txt");
    fc.getExtensionFilters().add(filter);
    File f = fc.showOpenDialog(primaryStage);
    System.out.println(f);

مجرد استخدام setFilenameFilter طريقة FileDialog نموذج fd:

            fd.setFilenameFilter(new FilenameFilter()
                            {
                                @Override
                                public boolean accept(File file, String s)
                                {
                                    // enter code to return TRUE or FALSE here
                                    return s.contains(".txt");
                                }
                            });
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top