Просто попробуйте использовать foreignObject в качестве контейнера, используя add. И сначала создайте элемент SPAN. Теперь это работает.
var fobj = draw.foreignObject(100,100)
var span = document.createElement('span')
span.innerText = 'Hello'
fobj.add(span)
Похоже, что можно слушать JFileChooser
для разнообразия на FILE_FILTER_CHANGED_PROPERTY
свойство, затем измените расширение выбранного файла соответственно с помощью setSelectedFile()
.
Править: Вы правы, это решение не работает. Оказывается, что, когда фильтр файла изменяется, выбранный файл удален, если его тип файла не соответствует новому фильтру. Вот почему Вы добираетесь null
когда Вы пытаетесь getSelectedFile()
.
Вы рассмотрели добавление расширения позже? Когда я пишу a JFileChooser
, Я обычно добавляю расширение после того, как пользователь выбрал файл для использования и нажал "Save":
if (result == JFileChooser.APPROVE_OPTION)
{
File file = fileChooser.getSelectedFile();
String path = file.getAbsolutePath();
String extension = getExtensionForFilter(fileChooser.getFileFilter());
if(!path.endsWith(extension))
{
file = new File(path + extension);
}
}
fileChooser.addPropertyChangeListener(JFileChooser.FILE_FILTER_CHANGED_PROPERTY, new PropertyChangeListener()
{
public void propertyChange(PropertyChangeEvent evt)
{
FileFilter filter = (FileFilter)evt.getNewValue();
String extension = getExtensionForFilter(filter); //write this method or some equivalent
File selectedFile = fileChooser.getSelectedFile();
String path = selectedFile.getAbsolutePath();
path.substring(0, path.lastIndexOf("."));
fileChooser.setSelectedFile(new File(path + extension));
}
});
Использование getAbsolutePath () в предыдущем изменении текущий каталог. Я был удивлен, когда диалоговое окно JFileChooser отображающееся изменение каталога "My documents" в каталоге проекта Netbeans, когда я выбрал другой FileFilter, таким образом, я изменил его для использования getName (). Я также использовал JDK 6 FileNameExtensionFilter.
Вот код:
final JFileChooser fc = new JFileChooser();
final File sFile = new File("test.xls");
fc.setSelectedFile(sFile);
// Store this filter in a variable to be able to select this after adding all FileFilter
// because addChoosableFileFilter add FileFilter in order in the combo box
final FileNameExtensionFilter excelFilter = new FileNameExtensionFilter("Excel document (*.xls)", "xls");
fc.addChoosableFileFilter(excelFilter);
fc.addChoosableFileFilter(new FileNameExtensionFilter("CSV document (*.csv)", "csv"));
// Force the excel filter
fc.setFileFilter(excelFilter);
// Disable All Files
fc.setAcceptAllFileFilterUsed(false);
// debug
fc.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
System.out.println("Property name=" + evt.getPropertyName() + ", oldValue=" + evt.getOldValue() + ", newValue=" + evt.getNewValue());
System.out.println("getSelectedFile()=" + fc.getSelectedFile());
}
});
fc.addPropertyChangeListener(JFileChooser.FILE_FILTER_CHANGED_PROPERTY, new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
Object o = evt.getNewValue();
if (o instanceof FileNameExtensionFilter) {
FileNameExtensionFilter filter = (FileNameExtensionFilter) o;
String ex = filter.getExtensions()[0];
File selectedFile = fc.getSelectedFile();
if (selectedFile == null) {
selectedFile = sFile;
}
String path = selectedFile.getName();
path = path.substring(0, path.lastIndexOf("."));
fc.setSelectedFile(new File(path + "." + ex));
}
}
});
Вот моя попытка. Он использует функцию accept (), чтобы проверить, проходит ли файл фильтр. Если имя файла не указано, расширение добавляется в конец.
JFileChooser jfc = new JFileChooser(getFile()) {
public void approveSelection() {
if (getDialogType() == SAVE_DIALOG) {
File selectedFile = getSelectedFile();
FileFilter ff = getFileFilter();
// Checks against the current selected filter
if (!ff.accept(selectedFile)) {
selectedFile = new File(selectedFile.getPath() + ".txt");
}
super.setSelectedFile(selectedFile);
if ((selectedFile != null) && selectedFile.exists()) {
int response = JOptionPane.showConfirmDialog(
this,
"The file " + selectedFile.getName() + " already exists.\n" +
"Do you want to replace it?",
"Ovewrite file",
JOptionPane.YES_NO_OPTION,
JOptionPane.WARNING_MESSAGE
);
if (response == JOptionPane.NO_OPTION)
return;
}
}
super.approveSelection();
}
};
Вы также можете использовать PropertyChangeListener для SELECTED_FILE_CHANGED_PROPERTY перед добавлением суффикса. Когда выбранный файл проверяется на соответствие новому фильтру (и впоследствии устанавливается значение null), событие SELECTED_FILE_CHANGED_PROPERTY фактически запускается перед событием FILE_FILTER_CHANGED_PROPERTY.
Если evt.getOldValue ()! = Null и evt.getNewValue () == null, вы знаете, что JFileChooser взорвал ваш файл. Затем вы можете получить имя старого файла (используя ((File) evt.getOldValue ()). GetName (), как описано выше), извлечь расширение, используя стандартные функции синтаксического анализа строк, и спрятать его в именованную переменную-член в вашем классе .
Таким образом, когда запускается событие FILE_FILTER_CHANGED (сразу после этого, насколько я могу определить), вы можете извлечь это скрытое корневое имя из именованной переменной-члена, применить расширение для нового типа фильтра файлов и установить Выбранный файл JFileChooser соответственно.