From f94d68550afaa48e181f312237e70c54aea6e5d2 Mon Sep 17 00:00:00 2001 From: Sergey Malenkov Date: Wed, 19 Jun 2013 14:28:44 +0400 Subject: [PATCH] 8013442: No file filter selected in file type combo box when using JFileChooser Reviewed-by: alexsch --- .../classes/javax/swing/JFileChooser.java | 20 ++- .../JFileChooser/8013442/Test8013442.java | 122 ++++++++++++++++++ 2 files changed, 140 insertions(+), 2 deletions(-) create mode 100644 jdk/test/javax/swing/JFileChooser/8013442/Test8013442.java diff --git a/jdk/src/share/classes/javax/swing/JFileChooser.java b/jdk/src/share/classes/javax/swing/JFileChooser.java index 2e1655d6d70..d30c69675ae 100644 --- a/jdk/src/share/classes/javax/swing/JFileChooser.java +++ b/jdk/src/share/classes/javax/swing/JFileChooser.java @@ -1146,9 +1146,25 @@ public class JFileChooser extends JComponent implements Accessible { * @see #resetChoosableFileFilters */ public boolean removeChoosableFileFilter(FileFilter f) { - if(filters.contains(f)) { + int index = filters.indexOf(f); + if (index >= 0) { if(getFileFilter() == f) { - setFileFilter(null); + if (isAcceptAllFileFilterUsed()) { + // choose default filter if it is used + setFileFilter(getAcceptAllFileFilter()); + } + else if (index > 0) { + // choose the first filter, because it is not removed + setFileFilter(filters.get(0)); + } + else if (filters.size() > 1) { + // choose the second filter, because the first one is removed + setFileFilter(filters.get(1)); + } + else { + // no more filters + setFileFilter(null); + } } FileFilter[] oldValue = getChoosableFileFilters(); filters.removeElement(f); diff --git a/jdk/test/javax/swing/JFileChooser/8013442/Test8013442.java b/jdk/test/javax/swing/JFileChooser/8013442/Test8013442.java new file mode 100644 index 00000000000..e7b892ddaed --- /dev/null +++ b/jdk/test/javax/swing/JFileChooser/8013442/Test8013442.java @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8013442 + * @summary Tests that at least one file filter is selected + * @author Sergey Malenkov + */ + +import java.io.File; +import java.util.concurrent.CountDownLatch; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.UIManager.LookAndFeelInfo; +import javax.swing.filechooser.FileFilter; + +public class Test8013442 extends FileFilter implements Runnable, Thread.UncaughtExceptionHandler { + private static final CountDownLatch LATCH = new CountDownLatch(1); + + public static void main(String[] args) throws InterruptedException { + SwingUtilities.invokeLater(new Test8013442()); + LATCH.await(); // workaround for jtreg + } + + private int index; + private LookAndFeelInfo[] infos; + private JFileChooser chooser; + + @Override + public boolean accept(File file) { + return !file.isFile() || file.getName().toLowerCase().endsWith(".txt"); + } + + @Override + public String getDescription() { + return "Text files"; + } + + @Override + public void run() { + if (this.infos == null) { + this.infos = UIManager.getInstalledLookAndFeels(); + Thread.currentThread().setUncaughtExceptionHandler(this); + } + if (this.infos.length == this.index) { + LATCH.countDown(); // release main thread + } else if (this.chooser == null) { + // change LaF before creation of Swing components + LookAndFeelInfo info = this.infos[this.index]; + System.out.println(info.getName()); + try { + UIManager.setLookAndFeel(info.getClassName()); + } + catch (Exception exception) { + throw new Error("could not change look and feel", exception); + } + // create and show new file chooser + JFrame frame = new JFrame(getClass().getSimpleName()); + frame.add(this.chooser = new JFileChooser()); + frame.setSize(800, 600); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + SwingUtilities.invokeLater(this); + } + else { + int count = this.chooser.getChoosableFileFilters().length; + System.out.println("count = " + count + "; " + this.chooser.isAcceptAllFileFilterUsed()); + if (count == 0) { + if (null != this.chooser.getFileFilter()) { + throw new Error("file filter is selected"); + } + // close window and stop testing file chooser for current LaF + SwingUtilities.getWindowAncestor(this.chooser).dispose(); + this.chooser = null; + this.index++; + } else { + if (null == this.chooser.getFileFilter()) { + throw new Error("file filter is not selected"); + } + if (count == 2) { + // remove default file filter + this.chooser.setAcceptAllFileFilterUsed(false); + } else if (this.chooser.isAcceptAllFileFilterUsed()) { + // remove add file filter + this.chooser.addChoosableFileFilter(this); + } else { + // remove custom file filter + this.chooser.removeChoosableFileFilter(this); + } + } + SwingUtilities.invokeLater(this); + } + } + + public void uncaughtException(Thread thread, Throwable throwable) { + throwable.printStackTrace(); + System.exit(1); + } +}