Получение содержимого файла с использованием JFrame и BufferedReader
Код ниже это часть моего кода.
Проблема в кнопке "Generate Keys.." ничего не дает в текстовой области!
Я думаю, что буферизованный читатель не может получить путь к файлу.. я не знаю почему?!
public class Finding_Candidate_Keys {
static String L[];
static int size;
static JFrame frame;
static JTextArea textArea;
static String TextAreaContent = "";
static File selectedFile;
static String filePath;
static JFileChooser fileChooser = new JFileChooser();
static File file;
static void displayJFrame()
{
frame = new JFrame("Advanced DB Project- Key Definition");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
textArea = new JTextArea("");
textArea.setSize(250,250);
textArea.setEditable(false);
textArea.setVisible(true);
JScrollPane scroll = new JScrollPane(textArea);
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
scroll.setPreferredSize(new Dimension(350, 350));
frame.add(scroll);
frame.setVisible(true);
JButton button = new JButton("Select File");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
textArea.setText("");
FileNameExtensionFilter filter = new FileNameExtensionFilter("Text Files (*.txt)", "txt");
fileChooser.setFileFilter(filter);
int returnValue = fileChooser.showOpenDialog(frame);
if (returnValue == JFileChooser.APPROVE_OPTION)
{
if (fileChooser.getSelectedFile() != null) {
selectedFile = fileChooser.getSelectedFile();
filePath = selectedFile.getAbsolutePath();
file = new File (filePath);
textArea.append("Opening: " + selectedFile.getName() + "\n");
}
}
else {
textArea.setText("");
textArea.append("Open command cancelled by user." + "\n");
}
}
});
frame.setVisible(true);
//********************
JButton showDialogButton = new JButton("Generate Keys..");
showDialogButton.addActionListener(
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
textArea.setText("");
textArea.append(TextAreaContent);
}
});
frame.add(showDialogButton);
frame.setVisible(true);
//*********************
frame.getContentPane().setLayout(new FlowLayout());
frame.getContentPane().add(button);
frame.setPreferredSize(new Dimension(500, 500));
frame.setSize(400,460);
frame.setLocationRelativeTo(null);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) throws IOException{
SwingUtilities.invokeLater(
new Runnable()
{
public void run()
{
displayJFrame();
}
});
BufferedReader br = new BufferedReader(new FileReader(filePath));
.
.
.
Обратите внимание: это работает правильно, если я использую имя файла, например:
BufferedReader br = new BufferedReader(new FileReader("input.txt"));
поставленный
BufferedReader br = new BufferedReader(new FileReader(filePath));
может кто-нибудь сказал мне, где ошибка?
также это появляется во время пробега:
Exception in thread "main" java.lang.NullPointerException
at java.io.FileInputStream.<init>(FileInputStream.java:124)
at java.io.FileInputStream.<init>(FileInputStream.java:87)
at java.io.FileReader.<init>(FileReader.java:58)
at Finding_Candidate_Keys.main(Finding_Candidate_Keys.java:110)
2 ответа
Вы никогда не инициализируете свой filePath
переменная-член. Из-за этого он будет инициализирован в null
, который является значением по умолчанию для объектов-членов. Поскольку он будет установлен на null
конструктор FileReader
бросит NullPointerException
, Вы можете решить это, инициализируя вашу переменную:
String filePath = "input.txt";
РЕДАКТИРОВАТЬ:
Как отмечено в комментариях, вы, кажется, инициализируете это в условном выражении в вашем displayJFrame
метод. Этот метод вызывается исполняемым файлом, переданным SwingUtilities.invokeLater
, Как следует из названия, этот метод не будет запускать Runnable
передается напрямую, но позже будет выполняться в другом потоке. Таким образом, ваше значение не будет инициализировано, так как ваш вызов метода, скорее всего, будет выполняться после того, как вы используете значение в вашем main
метод. Вам придется подождать, пока метод не будет завершен, возможное решение заключается в использовании функции SwingUtilities.invokeAndWait
вместо SwingUtilities.invokeLater
, Этот метод будет ожидать завершения вызова.
Вы не получаете текст, потому что вы установили его, чтобы не показывать текст. Вот как, в вашем действии слушатель для Generate Keys..
кнопка:
textArea.setText("");
textArea.append(TextAreaContent);
И ваш TextAreaContent
в инициализируется с пустой строкой, в разделе инициализации вашего класса:
...
static String TextAreaContent = "";
...
Задавать TextAreaContent
иметь то, что вы хотите увидеть. Например, вы можете сделать что-то вроде этого:
if (returnValue == JFileChooser.APPROVE_OPTION) {
if (fileChooser.getSelectedFile() != null) {
selectedFile = fileChooser.getSelectedFile();
filePath = selectedFile.getAbsolutePath();
file = new File(filePath);
textArea.append("Opening: " + selectedFile.getName() + "\n");
TextAreaContent = "You have selected some file: " + selectedFile.getName();
}
} else {
textArea.setText("");
textArea.append("Open command cancelled by user." + "\n");
TextAreaContent = "You chose no file";
}
Что касается ошибки, из-за invokeLater
метод, displayJFrame
Метод выполняется асинхронно в другом потоке, а следующая строка выполняется в основном потоке. Во время выполнения последней строки filePath
все еще не может быть инициализирован, вызывая ошибку. Чтобы удалить ошибку, вы можете сделать эту проверку:
if (filePath != null) {
BufferedReader br = new BufferedReader(new FileReader(filePath));
}