Witam.
Piszę sobie prosty edytor tekstu, i wszystko szło całkiem ok do czasu gdy utknąłem jak chciałem żeby program otwierał pliki tekstowe. Program się kompiluje bez błędów, ale już w trakcie działania wywala błędy.
Oto fragmenty kodu.
W konstruktorze tworzę menu kontekstowe dzięki któremu można otworzyć plik
menuOpen = new JMenuItem("Open");
menuOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK));
menuOpen.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
fileOpen();
}
});
contextMenuMain.add(menuOpen);
Poza konstruktorem jest metoda która sprawdza czy aktualnie używany plik był nadpisany, zapisany itp. żeby zdecydować czy wyświetlić okienko z pytaniem czy zapisać zmiany:
public void fileOpen()
{
if (!textMain.getText().equals("")) // textMain to nazwa kontrolki JTextPane
{
if (fileName == "") // filename to String który przechowuje nazwę otworzonego pliku
{
dialogOption = JOptionPane.showConfirmDialog(null, "Do you want to save the changes?");
if (dialogOption == 0)
{
// saveAs
open2();
}
if (dialogOption == 1)
{
open2();
}
}
else
{
dialogOption = JOptionPane.showConfirmDialog(null, "Do you want to save the changes?");
if (dialogOption == 0)
{
// save();
open2();
}
if (dialogOption == 1)
{
open2();
}
}
}
else
{
open2();
}
}
I jeszcze jedna metoda, ta właściwa do wczytywania tekstu:
public void open()
{
try
{
fstream = new FileInputStream(fileChooser.getSelectedFile().toString());
in = new DataInputStream(fstream);
br = new BufferedReader(new InputStreamReader(in));
while ((strLine = br.readLine()) != null)
{
stringBuilder.append(strLine);
}
in.close();
textMain.setText(stringBuilder.toString());
}
catch (IOException ioe)
{
JOptionPane.showMessageDialog(panelText, "IOException\n" + ioe.getMessage());
}
}
Jak już wcześniej wspominałem, program kompiluje się bez problemów. Ale gdy w czasie działania wybiorę i kliknę utworzone menu "Open" to NetBeans wywala mi coś takiego:
run:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at aplikacja.Aplikacja.open2(Aplikacja.java:582)
at aplikacja.Aplikacja.fileOpen(Aplikacja.java:537)
at aplikacja.Aplikacja$4.actionPerformed(Aplikacja.java:275)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:833)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:877)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2713)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
at java.awt.EventQueue.access$000(EventQueue.java:101)
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:680)
at java.awt.EventQueue$4.run(EventQueue.java:678)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
BUILD SUCCESSFUL (total time: 7 seconds)
at aplikacja.Aplikacja.open2(Aplikacja.java:582) - linijka fstream = new FileInputStream(fileChooser.getSelectedFile().toString());
at aplikacja.Aplikacja.fileOpen(Aplikacja.java:537) - open();
at aplikacja.Aplikacja$4.actionPerformed(Aplikacja.java:275) - fileOpen();
I nie mam pojęcia co się dzieje.
Gdybym w metodzie open() wstawił tylko
JOptionPane.showMessageDialog(panelText, "napis");
to okienko się pokaże, więc wszystkie wyższe metody działają ok, tylko tu coś się krzaczy.
Może im ktoś pomóc?