2016-03-31 4 views
2

Я хочу переопределить метод toString() для объекта FileFilter. У меня есть этот кусок кодаПереопределить toString() для классов swing

JFileChooser saveFile = new JFileChooser(); 
saveFile.setAcceptAllFileFilterUsed(false); 
saveFile.setMultiSelectionEnabled(false); 
saveFile.setFileFilter(new FileNameExtensionFilter("PNG", ".png")); 
String type = saveFile.getFileFilter().toString(); 
System.out.println(type); 

, которая печатает что-то вдоль линий [email protected][description=PNG extensions=[.png]]. Моя цель - создать переопределенный метод toString, поэтому я бы получил только часть .png.
Я ЗНАЮ, что есть более эффективные способы выполнения этой точной задачи, и я знаю основные строковые функции, чтобы получить нужную мне часть, но моя цель - сделать это с помощью переопределенного метода.

+4

Создать класс, расширяющий JFileChooser и переопределить ToString() – Tokazio

+0

Вы пробовали использовать FileFilter.getDescription()? Если вы не хотите делать актеры, вам нужно подклассифицировать FileNameExtensionFilter и переопределить toString там. – ControlAltDel

+0

«Я знаю основные строковые функции, чтобы получить нужную мне часть» - почему вы не используете это? Почему вы хотите переопределить метод (что невозможно, поскольку класс является окончательным). –

ответ

3

моя цель состоит в том, чтобы сделать это с помощью перегруженного метода.

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

Вы можете переопределить метод только в классах, которые у вас есть. Так как вы не являетесь владельцем FileNameExtensionFilter, то реализация FileFilter вернулась на JFileChooser, и вам не удастся переопределить ее метод toString.

Кроме того, FileNameExtensionFilter is a final class, поэтому вы не можете переопределить любые его методы.

Единственный доступный в этой ситуации подход - создать свой собственный FileFilter обертывание FileNameExtensionFilter и передать ему фильтр, который вы получаете от JFileChooser. Вы бы иметь этот класс, чтобы вы могли перегрузить его toString по мере необходимости:

class FileFilterWrapper { 

    private final FileFilter innerFilter; 

    public FileFilterWrapper(FileFilter innerFilter) { 
     this.innerFilter = innerFilter; 
    } 

    @Override 
    public String toString(){ 
     // Use innerFilter properties to produce the desired String 
     return ... 
    } 
} 
+0

Примечание. В качестве окончательного класса вы также не можете расширять FileNameExtensionFIlter. Таким образом, утверждение «только способ сделать это через композицию» – DwB

+0

@ DwB Правильно, вот что говорит абзац «Более того ...». – dasblinkenlight

+0

@dasblinkenlight Не могли бы вы рассказать о своем последнем абзаце? Я понимаю ваше объяснение в целом, но я не обращаю внимания на то, как создать класс «wrapping» FileNameExtensionFilter » – Rywi

2

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

JFileChooser saveFile = new JFileChooser() { 
    @Override 
    public String toString() { 
     return ".png"; 
    } 
} 

Я не могу рекомендовать этот подход, хотя, было бы лучше, чтобы реализовать свой собственный подкласс JFileChooser и определите новый метод String getFileExtension() внутри этого.

2

Для этого вам необходимо использовать подкласс JFileChooser. Если это единственный метод, который вы хотите переопределить, это довольно просто.

public class MyFileChooser extends JFileChooser{ 
    public MyFileChooser(){ 
     super(); 
    } 

    @Override 
    public String toString(){ 
     //your string conversion code here 
    } 
} 
Смежные вопросы