Squiddie в комментариях рекомендует вам хорошее решение. Однако, если вы все еще хотите отключить текстовое поле, чтобы имя файла было видно пользователю (в случае JFileChooser.DIRECTORIES_ONLY это , а не ), вы можете использовать следующий код, чтобы «захватить» текстовое поле. от выбора и отключить его.
import java.awt.Component;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class TextFieldFromFileChooser {
public TextFieldFromFileChooser() {
JFileChooser chooser = new JFileChooser();
JTextField fileChooserTextField = getFileChooserTextField(chooser);
fileChooserTextField.setText("I name this file.txt");
fileChooserTextField.setEditable(false);
if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
// Selected file has the name of the fileChooserTextField' text
System.out.println(chooser.getSelectedFile().getAbsolutePath());
}
}
private static JTextField getFileChooserTextField(JFileChooser chooser) {
JTextField f = null;
for (Component c : getComponents(chooser)) {
if (c instanceof JTextField){
f = (JTextField) c;
break;
}
}
return f;
}
private static List<Component> getComponents(JComponent component) {
List<Component> list = new ArrayList<>();
for (Component c : component.getComponents()) {
if (c instanceof JPanel)
list.addAll(getComponents((JPanel) c));
else if (c instanceof JTextField)
list.add((JTextField) c);
}
return list;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new TextFieldFromFileChooser());
}
}
Обратите внимание, что это было протестировано с Windows LAF и Java LAF. Если у вашего выбора есть 2 текстовых поля (я понятия не имею, как обстоят дела с MAC / Linux), у вас могут возникнуть проблемы, потому что вы не знаете, какие из текстовых полей вы отключаете.
Если Вы идете путем ADOdb (http://adodb.sourceforge.net/), то можно создать идентификатор вставки перед рукой и явно конкретный идентификатор при вставке. Это может быть реализовано портативно (ADOdb поддерживает тонну различных баз данных...), и гарантирует, что Вы используете корректный идентификатор вставки.
Тип ПОСЛЕДОВАТЕЛЬНЫХ ДАННЫХ PostgreSQL подобен за исключением того, что это - per-table/per-sequence, Вы указываете таблицу, Вы хотите последний идентификатор вставки для того, когда Вы запрашиваете это.
По моему скромному мнению, это только считают "злым", потому что едва любая другая база данных SQL (если таковые имеются) имеет его.
Лично я нахожу его невероятно полезным, и жаль, что не должен был обращаться к другим более сложным методам в других системах.
Я предполагаю, что это не действительно состояние ни один, но я использую блокировки записи, чтобы удостовериться, что я действительно получаю последний вставленный идентификатор.
Одна альтернатива должна использовать последовательности вместо этого, таким образом, Вы генерируете идентификатор сами, прежде чем Вы сделаете вставку.
К сожалению, они не поддерживаются в MySQL, но библиотеки как Adodb могут эмулировать их использующий другую таблицу. Я думаю однако, что сама эмуляция будет использовать lastInsertId () или эквивалентный..., но по крайней мере у Вас, менее вероятно, будет триггер на таблице, которая просто используется для последовательности
Это не сложно, и не эффективно, но если данные, которые Вы вставили, включают уникальные поля, затем ВЫБОР может, очевидно, привести к тому, что Вы после.
Например:
INSERT INTO example (column1) VALUES ('test');
SELECT id FROM example WHERE column1 = 'test';