Until yesterday my JFrame was working perfectly, today i did a little edit to it but it doesn't work anymore. i tried to delete all the code that wasn't strictly bound with my JFrame but it still refuses to show anything, i'll paste my code here
This is my main file
public class ImageEditor extends JFrame{
JFrame mainFrame = new JFrame("ImageEditor");
JMenuBar menu = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JMenu editMenu = new JMenu("Edit");
JMenuItem openButton = new JMenuItem("Open...");
JMenuItem saveButton = new JMenuItem("Save");
JMenuItem saveAsButton = new JMenuItem("Save as...");
JMenuItem exitButton = new JMenuItem("Exit");
JMenuItem rotatePositive = new JMenuItem("Rotate 45°");
JMenuItem rotateNegative = new JMenuItem("Rotate -45°");
JMenuItem resizeButton = new JMenuItem("Resize");
JMenuItem adjustBrightnessButton = new JMenuItem("Adjust brightness");
JMenuItem insertLabel = new JMenuItem("Add text...");
JFileChooser fileChooser;
JFileChooser fileSaver;
JSlider brightnessSlider = new JSlider(0, 200, 100);
ImagePanel photoViewer = new ImagePanel();
public ImageEditor() {
editMenu.setEnabled(false);
mainFrame.setSize(1000,750);
mainFrame.setResizable(true);
photoViewer.setSize(1000,750);
openButton.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK));
openButton.addActionListener((java.awt.event.ActionEvent evt) -> {
fileChooser = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
fileChooser.setVisible(true);
int returnValue = fileChooser.showOpenDialog(null);
if (returnValue == JFileChooser.APPROVE_OPTION) {
editMenu.setEnabled(true);
fileChooser.setVisible(false);
File[] selectedImages = fileChooser.getSelectedFiles();
photoViewer.updateGraphics(selectedImages);
photoViewer.repaint();
}
});
exitButton.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, ActionEvent.CTRL_MASK));
exitButton.addActionListener((java.awt.event.ActionEvent evt) -> {
System.exit(0);
});
saveButton.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.CTRL_MASK));
saveButton.addActionListener((java.awt.event.ActionEvent evt) -> {
fileSaver = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
fileSaver.setVisible(true);
fileSaver.setMultiSelectionEnabled(false);
int returnValue = fileSaver.showOpenDialog(null);
if (returnValue == JFileChooser.APPROVE_OPTION){
String path = fileSaver.getSelectedFile().getAbsolutePath();
System.err.println(path);
}
});
rotatePositive.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, ActionEvent.CTRL_MASK));
rotatePositive.addActionListener((java.awt.event.ActionEvent evt) -> {
photoViewer.positiveRotation();
});
rotateNegative.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, ActionEvent.CTRL_MASK));
rotateNegative.addActionListener((java.awt.event.ActionEvent evt) -> {
photoViewer.negativeRotation();
});
insertLabel.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, ActionEvent.CTRL_MASK));
insertLabel.addActionListener((java.awt.event.ActionEvent evt) -> {
JFrame adder = new JFrame("Add text");
adder.setVisible(true);
adder.setAlwaysOnTop(true);
adder.setBounds(500, 250, 250, 125);
adder.setLayout(new GridLayout(2,2));
JLabel labelText = new JLabel("Text: ");
JTextField label = new JTextField();
JButton cancelButton = new JButton("Cancel");
JButton confirmButton = new JButton("OK");
adder.add(labelText);
adder.add(label);
adder.add(cancelButton);
adder.add(confirmButton);
confirmButton.addActionListener((java.awt.event.ActionEvent evt2) -> {
adder.setVisible(false);
mainFrame.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
photoViewer.label=label.getText();
photoViewer.lx=e.getX();
photoViewer.ly=e.getY();
photoViewer.repaint();
}
@Override
public void mousePressed(MouseEvent e) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void mouseReleased(MouseEvent e) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void mouseEntered(MouseEvent e) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void mouseExited(MouseEvent e) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
});
});
});
resizeButton.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, ActionEvent.CTRL_MASK));
resizeButton.addActionListener((java.awt.event.ActionEvent evt) -> {
JFrame resizer = new JFrame("Resize");
resizer.setVisible(true);
resizer.setAlwaysOnTop(true);
resizer.setBounds(500, 250, 250, 125);
resizer.setLayout(new GridLayout(3,2));
JLabel widthLabel = new JLabel("Width: ");
JLabel heightLabel = new JLabel("Height: ");
JFormattedTextField widthField = new JFormattedTextField();
JFormattedTextField heightField = new JFormattedTextField();
JButton cancelButton = new JButton("Cancel");
JButton confirmButton = new JButton("OK");
widthField.setFormatterFactory(new DefaultFormatterFactory(new NumberFormatter(java.text.NumberFormat.getIntegerInstance())));
heightField.setFormatterFactory(new DefaultFormatterFactory(new NumberFormatter(java.text.NumberFormat.getIntegerInstance())));
resizer.add(widthLabel);
resizer.add(widthField);
resizer.add(heightLabel);
resizer.add(heightField);
resizer.add(cancelButton);
resizer.add(confirmButton);
cancelButton.addActionListener((java.awt.event.ActionEvent evt2) -> {resizer.setVisible(false);});
confirmButton.addActionListener((java.awt.event.ActionEvent evt2) -> {photoViewer.selectedImg = photoViewer.resize(photoViewer.selectedImg, Integer.parseInt(widthField.getText().replace(".", "")), Integer.parseInt(heightField.getText().replace(".", "")));}); //WORKING
});
adjustBrightnessButton.setEnabled(false);
//adjustBrightnessButton.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, ActionEvent.CTRL_MASK));
/*adjustBrightnessButton.addActionListener((java.awt.event.ActionEvent evt) -> {
JFrame slider = new JFrame("Brightness");
slider.setSize(300,100);
slider.setAlwaysOnTop(true);
slider.add(brightnessSlider);
slider.setVisible(true);
brightnessSlider.addMouseListener(new MouseListener(){
@Override
public void mouseClicked(MouseEvent e){}
@Override
public void mousePressed(MouseEvent e){}
@Override
public void mouseReleased(MouseEvent e) {
photoViewer.adjustBrightness(Float.valueOf((brightnessSlider.getValue()))/100); //Less memory usage
}
@Override
public void mouseEntered(MouseEvent e){}
@Override
public void mouseExited(MouseEvent e) {}
});
brightnessSlider.addChangeListener((ChangeEvent e) -> {
photoViewer.adjustBrightness(Float.valueOf((brightnessSlider.getValue()))/100); //Real time update, but VERY HEAVY
});
});*/
menu.add(fileMenu);
menu.add(editMenu);
fileMenu.add(openButton);
fileMenu.add(saveButton);
fileMenu.add(saveAsButton);
fileMenu.add(exitButton);
editMenu.add(resizeButton);
editMenu.add(rotatePositive);
editMenu.add(rotateNegative);
editMenu.add(adjustBrightnessButton);
editMenu.add(insertLabel);
menu.setVisible(true);
mainFrame.setJMenuBar(menu);
mainFrame.setVisible(true);
mainFrame.add(photoViewer);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
ImageEditor img = new ImageEditor();
}
}
And here is my second file, the photoViewer
public class ImagePanel extends JPanel{
public ArrayList<File> selectedFiles = new ArrayList<>();
BufferedImage selectedImg;
public int rotation = 0;
boolean flag=true;
String label="";
int lx,ly;
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
AffineTransform at = new AffineTransform();
at.translate(getWidth() / 2, getHeight() / 2);
at.rotate(Math.toRadians(45*rotation));
if(flag && !selectedFiles.isEmpty()){
selectedImg = loadImage(selectedFiles.get(0)); //WORKING
flag = false;
}
if(!selectedFiles.isEmpty())
at.translate(-selectedImg.getWidth() / 2, -selectedImg.getHeight() / 2);
Graphics2D g2d = (Graphics2D) g;
if(!label.isEmpty()){
System.err.println("PHOTODONE");
g2d.drawString("vdsavdfvdfsvfdsvdfs", 0, 0); //PROVARE A UTILIZZARE JFRAME.CREATEIMAGE PER COPIARE L'IMMAGINE E SCRIVERE SU QUELLA
label="";
repaint();
}
g2d.drawImage(selectedImg, at, null);
}
public BufferedImage loadImage(File fileName){
BufferedImage bfImg = null;
try{
bfImg = ImageIO.read(fileName);
if(bfImg.getWidth() > 800)
bfImg = resize(bfImg, 800, bfImg.getHeight());
if(bfImg.getHeight() > 750)
bfImg = resize(bfImg, bfImg.getWidth(), 750);
}
catch(IOException e){
System.err.println("Error loading image");
}
return bfImg;
}
public void updateGraphics(File[] files){
selectedFiles = new ArrayList<>(Arrays.asList(files));
}
public void positiveRotation(){
if(rotation < 8){
rotation++;
repaint();
} //BOTH WORKING
else{
rotation=1;
repaint();
}
}
public void negativeRotation(){
if(rotation > -8){
rotation--;
repaint();
}
else{
rotation=-1;
repaint();
}
}
/*public void adjustBrightness(Float sliderValue){
RescaleOp rop = new RescaleOp(sliderValue, 0, null);
rop.filter(selectedImg, selectedImg); //WORKING
repaint();
}*/
public BufferedImage resize(BufferedImage img, int width, int height) {
Image tmp = img.getScaledInstance(width, height, Image.SCALE_SMOOTH);
BufferedImage dimg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = dimg.createGraphics();
g2d.drawImage(tmp, 0, 0, null);
g2d.dispose();
return dimg;
}
}
The edit i did today was change some things in the main file (and from the photoViewer, since they are bound)
I changed this
selectedImages=fileChooser.getSelectedFile().getAbsolutePath()
photoViewer.updateGraphics(selectedImages);
To this
File[] selectedImages = fileChooser.getSelectedFiles();
photoViewer.updateGraphics(selectedImages);
Then i modified both files to make sure that the functions will accept a FIle array, but if i delete all unrelated code, comment the photoViewer callings, comment ALL the photoViewer file, it still won't work. What is happening?
ADDON
I figured out how to make NetBeans show the stack trace, here it is
java.lang.NullPointerException
at javax.swing.plaf.basic.BasicScrollPaneUI$Handler.mouseWheelMoved(BasicScrollPaneUI.java:866)
at org.netbeans.modules.editor.lib2.view.DocumentViewOp.mouseWheelMoved(DocumentViewOp.java:1523)
at org.netbeans.modules.editor.lib2.view.DocumentViewOp$MouseWheelDelegator.mouseWheelMoved(DocumentViewOp.java:1657)
at java.awt.AWTEventMulticaster.mouseWheelMoved(AWTEventMulticaster.java:532)
at java.awt.Component.processMouseWheelEvent(Component.java:6623)
at java.awt.Component.processEvent(Component.java:6307)
at java.awt.Container.processEvent(Container.java:2236)
at java.awt.Component.dispatchEventImpl(Component.java:4891)
at java.awt.Container.dispatchEventToSelf(Container.java:2318)
at java.awt.Component.dispatchMouseWheelToAncestor(Component.java:5044)
at java.awt.Component.dispatchEventImpl(Component.java:4778)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Component.dispatchEvent(Component.java:4713)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4554)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
at java.awt.Container.dispatchEventImpl(Container.java:2280)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4713)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:159)
[catch] at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)