0

I have an incomplete program of a virtual lab. The program runs perfectly fine but when I convert it to a .jar file and double-click on it, regardless of where I put the jar file, I get this error message: enter image description here. These are the contents of my manifeset.mf file:

Manifest-Version: 1.0
Main-Class: VirtualLab

I know it's not an issue with my jdk because I've been able to open jar files for other programs on my computer. The jar file opens when I remove all the code except for the VirtualLab constructor. Typing "java -jar myfile.jar" in command prompt gives me "Error: Unable to access jarfile VirtualLab.jar". I'm using Windows 10. Here are all my 4 java files:

import javax.swing.*;
import java.awt.*;

public class VirtualLab extends JFrame {
    private static Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
    private static VirtualLab virtualLab;
    private static double scaleFactor = dimension.width / 1536.0;
    public static int velocity;
    public static int startTime;

    public static void main(String[] args) {
        virtualLab = new VirtualLab();
        Runnable r1 = new Runnable() {
            @Override
            public void run() {
                try {
                    String prevState = "Stationary";
                    startTime = (int) (System.nanoTime() / 1_000_000);
                    while (true) {
                        if (velocity != 0) GraphicsPanel.moveWoodenBlocks(velocity > 0 ? 1 : -1);
                        int pxPerSecond = Math.abs(velocity) * 836 / 15;
                        int delay = pxPerSecond == 0 ? 0 : 1000 / pxPerSecond;
                        if (velocity < 0) {
                            if (!prevState.equals("Negative")) startTime = (int) (System.nanoTime() / 1_000_000);
                            prevState = "Negative";
                        } else if (velocity == 0) {
                            if (!prevState.equals("Stationary")) startTime = (int) (System.nanoTime() / 1_000_000);
                            prevState = "Stationary";
                        } else {
                            if (!prevState.equals("Positive")) startTime = (int) (System.nanoTime() / 1_000_000);
                            prevState = "Positive";
                        }
                        VirtualLab.update();
                        Thread.sleep(delay);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        Thread t1 = new Thread(r1);
        t1.start();
    }

    VirtualLab () {
        setTitle("Virtual Lab");
        setSize(dimension);
        getContentPane().add(new GraphicsPanel());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        addMouseListener(new Mouse());
        addMouseMotionListener(new Mouse());
        setBackground(Color.WHITE);
        setVisible(true);
        repaint();
    }

    public static int coordinateAdjust (int num) {
        return (int) Math.round(num * scaleFactor);
    }

    public static int fontAdjust (int num) {
        return (int) Math.round(num * Math.sqrt(scaleFactor));
    }

    public static void update () {
        virtualLab.repaint();
    }

    public static String getCondition () {
        if (velocity < 0) return "Negative";
        else if (velocity == 0) return "Stationary";
        else return "Positive";
    }

    public static String getTime () {
        int milliseconds = (int) (System.nanoTime() / 1_000_000) - startTime;
        int tensDigitMin = milliseconds / 600_000, onesDigitMin = (milliseconds -= tensDigitMin * 600_000) / 60_000;
        int tensDigitSecond = (milliseconds -= onesDigitMin * 60_000) / 10_000;
        int onesDigitSecond = (milliseconds - tensDigitSecond * 10_000) / 1000;
        return "" + tensDigitMin + onesDigitMin + ":" + tensDigitSecond + onesDigitSecond;
    }
}
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

public class Mouse implements MouseListener, MouseMotionListener {

    @Override
    public void mouseClicked(MouseEvent mouseEvent) {
        if (GraphicsPanel.getAddButton().contains(mouseEvent.getPoint())) GraphicsPanel.addWoodenBlock();
        else if (GraphicsPanel.getRemoveButton().contains(mouseEvent.getPoint())) GraphicsPanel.removeWoodenBlock();
        else if (GraphicsPanel.getMinusFiveButton().contains(mouseEvent.getPoint())) VirtualLab.velocity--;
        else if (GraphicsPanel.getPlusFiveButton().contains(mouseEvent.getPoint())) VirtualLab.velocity++;
        else if (GraphicsPanel.getResetButton().contains(mouseEvent.getPoint())) {
            VirtualLab.startTime = (int) (System.nanoTime() / 1_000_000);
        }
        VirtualLab.update();
    }

    @Override
    public void mousePressed(MouseEvent mouseEvent) {
        if (GraphicsPanel.getAddButton().contains(mouseEvent.getPoint())) {
            GraphicsPanel.addButtonColor = Colors.DARKBLUE;
        } else if (GraphicsPanel.getRemoveButton().contains(mouseEvent.getPoint())) {
            GraphicsPanel.removeButtonColor = Colors.DARKBLUE;
        } else if (GraphicsPanel.getMinusFiveButton().contains(mouseEvent.getPoint())) {
            GraphicsPanel.minusFiveButtonColor = Colors.DARKBLUE;
        } else if (GraphicsPanel.getPlusFiveButton().contains(mouseEvent.getPoint())) {
            GraphicsPanel.plusFiveButtonColor = Colors.DARKBLUE;
        } else if (GraphicsPanel.getResetButton().contains(mouseEvent.getPoint())) {
            GraphicsPanel.resetButtonColor = Colors.DARKBLUE;
        }
        VirtualLab.update();
    }

    public void mouseReleased(MouseEvent mouseEvent) {
        GraphicsPanel.addButtonColor = Colors.LIGHTBLUE;
        GraphicsPanel.removeButtonColor = Colors.LIGHTBLUE;
        GraphicsPanel.plusFiveButtonColor = Colors.LIGHTBLUE;
        GraphicsPanel.minusFiveButtonColor = Colors.LIGHTBLUE;
        GraphicsPanel.resetButtonColor = Colors.LIGHTBLUE;
        VirtualLab.update();
    }

    @Override
    public void mouseEntered(MouseEvent mouseEvent) {
        // do nothing
    }

    @Override
    public void mouseExited(MouseEvent mouseEvent) {
        // do nothing
    }

    @Override
    public void mouseDragged(MouseEvent mouseEvent) {
        // do nothing
    }

    @Override
    public void mouseMoved(MouseEvent mouseEvent) {
        if (GraphicsPanel.getAddButton().contains(mouseEvent.getPoint())) GraphicsPanel.addButtonColor = Color.BLUE;
        else GraphicsPanel.addButtonColor = Colors.LIGHTBLUE;
        if (GraphicsPanel.getRemoveButton().contains(mouseEvent.getPoint())) {
            GraphicsPanel.removeButtonColor = Color.BLUE;
        } else GraphicsPanel.removeButtonColor = Colors.LIGHTBLUE;
        if (GraphicsPanel.getMinusFiveButton().contains(mouseEvent.getPoint())) {
            GraphicsPanel.minusFiveButtonColor = Color.BLUE;
        } else GraphicsPanel.minusFiveButtonColor = Colors.LIGHTBLUE;
        if (GraphicsPanel.getPlusFiveButton().contains(mouseEvent.getPoint())) {
            GraphicsPanel.plusFiveButtonColor = Color.BLUE;
        } else GraphicsPanel.plusFiveButtonColor = Colors.LIGHTBLUE;
        if (GraphicsPanel.getResetButton().contains(mouseEvent.getPoint())) {
            GraphicsPanel.resetButtonColor = Color.BLUE;
        } else GraphicsPanel.resetButtonColor = Colors.LIGHTBLUE;
        VirtualLab.update();
    }
}
import javafx.scene.shape.Line;

import javax.swing.*;
import java.awt.*;
import java.util.Stack;

public class GraphicsPanel extends JPanel {
    private static Stack<Rectangle> woodenBlocks = new Stack<>();
    private static Rectangle hook = new Rectangle(), table[] = {new Rectangle(), new Rectangle(), new Rectangle()};
    private static Point pulleyCenter;
    private static int pulleyRadius = VirtualLab.coordinateAdjust(25);
    private static Line[] strings = {new Line(), new Line()}, supports = {new Line(), new Line()};
    public static Color addButtonColor = Colors.LIGHTBLUE, removeButtonColor = Colors.LIGHTBLUE;
    private static Rectangle addButton = new Rectangle(), removeButton = new Rectangle();
    public static Color minusFiveButtonColor = Colors.LIGHTBLUE, plusFiveButtonColor = Colors.LIGHTBLUE;
    private static Rectangle plusFiveButton = new Rectangle(), minusFiveButton = new Rectangle();
    public static Color resetButtonColor = Colors.LIGHTBLUE;
    private static Rectangle resetButton = new Rectangle();

    GraphicsPanel () {
        Rectangle woodenBlock = new Rectangle();
        woodenBlock.x = VirtualLab.coordinateAdjust(700);
        woodenBlock.y = VirtualLab.coordinateAdjust(336);
        woodenBlock.width = VirtualLab.coordinateAdjust(200);
        woodenBlock.height = VirtualLab.coordinateAdjust(100);
        woodenBlocks.add(woodenBlock);
        table[0].x = VirtualLab.coordinateAdjust(400);
        table[0].y = woodenBlock.y + VirtualLab.coordinateAdjust(100);
        table[0].width = VirtualLab.coordinateAdjust(800);
        table[0].height = VirtualLab.coordinateAdjust(100);
        table[1].x = VirtualLab.coordinateAdjust(450);
        table[1].y = VirtualLab.coordinateAdjust(436);
        table[1].width = VirtualLab.coordinateAdjust(100);
        table[1].height = VirtualLab.coordinateAdjust(400);
        table[2].x = VirtualLab.coordinateAdjust(1000);
        table[2].y = VirtualLab.coordinateAdjust(436);
        table[2].width = VirtualLab.coordinateAdjust(100);
        table[2].height = VirtualLab.coordinateAdjust(400);
        strings[0].setStartX(woodenBlock.x + woodenBlock.width);
        pulleyCenter = new Point(VirtualLab.coordinateAdjust(1220), VirtualLab.coordinateAdjust(375));
        strings[0].setStartY(pulleyCenter.y);
        strings[0].setEndX(pulleyCenter.x - pulleyRadius);
        strings[0].setEndY(pulleyCenter.y);
        strings[1].setStartX(pulleyCenter.x + pulleyRadius);
        strings[1].setStartY(pulleyCenter.y);
        strings[1].setEndX(pulleyCenter.x + pulleyRadius);
        strings[1].setEndY(pulleyCenter.y + VirtualLab.coordinateAdjust(300));
        Point topRightCorner = new Point(table[0].x + table[0].width, table[0].y);
        supports[0].setStartX(topRightCorner.x - VirtualLab.coordinateAdjust(10));
        supports[0].setStartY(topRightCorner.y);
        supports[0].setEndX(pulleyCenter.x);
        supports[0].setEndY(pulleyCenter.y);
        supports[1].setStartX(topRightCorner.x);
        supports[1].setStartY(topRightCorner.y + VirtualLab.coordinateAdjust(10));
        supports[1].setEndX(pulleyCenter.x);
        supports[1].setEndY(pulleyCenter.y);
        hook.x = (int) strings[1].getStartX() - VirtualLab.coordinateAdjust(10);
        hook.y = (int) strings[1].getEndY();
        hook.width = VirtualLab.coordinateAdjust(20);
        hook.height = VirtualLab.coordinateAdjust(20);
        addButton.x = VirtualLab.coordinateAdjust(1300);
        addButton.width = VirtualLab.coordinateAdjust(200);
        addButton.height = VirtualLab.coordinateAdjust(200);
        removeButton.x = VirtualLab.coordinateAdjust(1000);
        removeButton.width = VirtualLab.coordinateAdjust(200);
        removeButton.height = VirtualLab.coordinateAdjust(200);
        minusFiveButton.x = VirtualLab.coordinateAdjust(10);
        minusFiveButton.width = VirtualLab.coordinateAdjust(200);
        minusFiveButton.height = VirtualLab.coordinateAdjust(200);
        plusFiveButton.x = VirtualLab.coordinateAdjust(250);
        plusFiveButton.width = VirtualLab.coordinateAdjust(200);
        plusFiveButton.height = VirtualLab.coordinateAdjust(200);
        resetButton.x = VirtualLab.coordinateAdjust(600);
        resetButton.y = VirtualLab.coordinateAdjust(150);
        resetButton.width = VirtualLab.coordinateAdjust(200);
        resetButton.height = VirtualLab.coordinateAdjust(50);
    }

    public void paintComponent (Graphics g) {
        g.setColor(Color.BLUE);
        for (Rectangle i : table) {
            g.drawRect(i.x, i.y, i.width, i.height);
            g.fillRect(i.x, i.y, i.width, i.height);
        }
        for (int i = 0; i < woodenBlocks.size(); i++) {
            Rectangle woodenBlock = woodenBlocks.get(i);
            g.setColor(Colors.BROWN);
            g.drawRect(woodenBlock.x, woodenBlock.y, woodenBlock.width, woodenBlock.height);
            g.fillRect(woodenBlock.x, woodenBlock.y, woodenBlock.width, woodenBlock.height);
            g.setColor(Color.WHITE);
            g.setFont(new Font("Verdana", Font.PLAIN, VirtualLab.fontAdjust(22)));
            int x = woodenBlock.x + VirtualLab.coordinateAdjust(10);
            int y = (woodenBlock.y + (woodenBlock.y + woodenBlock.height)) / 2;
            g.drawString("Wooden Block " + (i + 1), x, y);
        }
        g.setColor(Color.GREEN);
        for (Line i : strings) {
            g.drawLine((int) i.getStartX(), (int) i.getStartY(), (int) i.getEndX(), (int) i.getEndY());
        }
        g.setColor(Color.BLACK);
        Point center = new Point(pulleyCenter.x - pulleyRadius, pulleyCenter.y - pulleyRadius);
        g.drawOval(center.x, center.y, pulleyRadius * 2, pulleyRadius * 2);
        g.fillOval(center.x, center.y, pulleyRadius * 2, pulleyRadius * 2);
        g.setColor(Color.YELLOW);
        for (Line i : supports) {
            g.drawLine((int) i.getStartX(), (int) i.getStartY(), (int) i.getEndX(), (int) i.getEndY());
        }
        g.setColor(Color.GRAY);
        g.drawRect(hook.x, hook.y, hook.width, hook.height);
        g.fillRect(hook.x, hook.y, hook.width, hook.height);
        g.setColor(addButtonColor);
        g.drawRect(addButton.x, 0, addButton.width, addButton.height);
        g.fillRect(addButton.x, 0, addButton.width, addButton.height);
        g.setColor(Color.WHITE);
        g.setFont(new Font("Verdana", Font.PLAIN, VirtualLab.fontAdjust(22)));
        g.drawString("Add", VirtualLab.coordinateAdjust(1380), VirtualLab.coordinateAdjust(50));
        g.drawString("Wooden", VirtualLab.coordinateAdjust(1360), VirtualLab.coordinateAdjust(100));
        g.drawString("Block", VirtualLab.coordinateAdjust(1375), VirtualLab.coordinateAdjust(150));
        g.setColor(removeButtonColor);
        g.drawRect(removeButton.x, 0, removeButton.width, removeButton.height);
        g.fillRect(removeButton.x, 0, removeButton.width, removeButton.height);
        g.setColor(Color.WHITE);
        g.drawString("Remove", VirtualLab.coordinateAdjust(1060), VirtualLab.coordinateAdjust(50));
        g.drawString("Wooden", VirtualLab.coordinateAdjust(1060), VirtualLab.coordinateAdjust(100));
        g.drawString("Block", VirtualLab.coordinateAdjust(1075), VirtualLab.coordinateAdjust(150));
        g.setColor(minusFiveButtonColor);
        g.drawRect(minusFiveButton.x, minusFiveButton.y, minusFiveButton.width, minusFiveButton.height);
        g.fillRect(minusFiveButton.x, minusFiveButton.y, minusFiveButton.width, minusFiveButton.height);
        g.setColor(plusFiveButtonColor);
        g.drawRect(plusFiveButton.x, plusFiveButton.y, plusFiveButton.width, plusFiveButton.height);
        g.fillRect(plusFiveButton.x, plusFiveButton.y, plusFiveButton.width, plusFiveButton.height);
        g.drawRect(resetButton.x, resetButton.y, resetButton.width, resetButton.height);
        g.fillRect(resetButton.x, resetButton.y, resetButton.width, resetButton.height);
        g.setColor(Color.WHITE);
        g.drawString("-1 cm / s", VirtualLab.coordinateAdjust(60), VirtualLab.coordinateAdjust(100));
        g.drawString("+1 cm/s", VirtualLab.coordinateAdjust(300), VirtualLab.coordinateAdjust(100));
        g.setFont(new Font("Proxima Nova", Font.PLAIN, VirtualLab.fontAdjust(48)));
        g.setColor(Color.BLACK);
        int x = VirtualLab.coordinateAdjust(30), y = VirtualLab.coordinateAdjust(500);
        g.drawString("Velocity: " + VirtualLab.velocity + " cm/s", x, y);
        x = VirtualLab.coordinateAdjust(600);
        y = VirtualLab.coordinateAdjust(50);
        g.drawString(VirtualLab.getCondition(), x, y);
        g.drawString(VirtualLab.getTime(), x, VirtualLab.coordinateAdjust(100));
        g.setColor(Color.WHITE);
        g.drawString("Reset", VirtualLab.coordinateAdjust(640), VirtualLab.coordinateAdjust(190));
    }

    public static void addWoodenBlock () {
        Rectangle woodenBlock = new Rectangle();
        woodenBlock.x = (int) strings[0].getStartX() - VirtualLab.coordinateAdjust(200);
        woodenBlock.y = VirtualLab.coordinateAdjust(336 - 100 * woodenBlocks.size());
        woodenBlock.width = VirtualLab.coordinateAdjust(200);
        woodenBlock.height = VirtualLab.coordinateAdjust(100);
        woodenBlocks.add(woodenBlock);
    }

    public static void removeWoodenBlock () {
        woodenBlocks.pop();
    }

    public static void moveWoodenBlocks (int displacement) {
        for (Rectangle i : woodenBlocks) i.x += displacement;
        hook.y += displacement;
        strings[0].setStartX(strings[0].getStartX() + displacement);
        strings[1].setEndY(strings[1].getEndY() + displacement );
        VirtualLab.update();
    }

    public static Rectangle getAddButton () {
        int x = addButton.x, sideLength = addButton.width;
        return new Rectangle(x, 0, sideLength, sideLength);
    }

    public static Rectangle getRemoveButton () {
        int x = removeButton.x, sideLength = removeButton.width;
        return new Rectangle(x, 0, sideLength, sideLength);
    }

    public static Rectangle getMinusFiveButton () {
        return new Rectangle(minusFiveButton.x, minusFiveButton.y, minusFiveButton.width, minusFiveButton.height);
    }

    public static Rectangle getPlusFiveButton () {
        return new Rectangle(plusFiveButton.x, plusFiveButton.y, plusFiveButton.width, plusFiveButton.height);
    }

    public static Rectangle getResetButton () {
        return resetButton;
    }
}
import java.awt.*;

public class Colors {
    public static final Color LIGHTBLUE = new Color(51, 204, 255);
    public static final Color BROWN = new Color(102, 51, 0);
    public static final Color DARKBLUE = new Color(0, 0, 153);
}
  • Clicking jar files runs them, at least on Windows. Is that what you intended to do or did you want to extract it? – user May 25 '20 at 23:37
  • *removing a lot of code in this program makes the jar file suddenly open* What? You haven't shown us a MANIFEST, or anything that would allow us to reproduce the issue - which is? What happens when you do `java -jar myjar.jar`? – Elliott Frisch May 25 '20 at 23:39
  • "Error: Unable to access jarfile VirtualLab.jar" for "java -jar VirtualLab.jar" in command prompt running as administrator. Also, I edited the question. – Arman Lamei May 25 '20 at 23:54
  • I want the jar file to run when I double-click on it but currently, nothing happens when I double-click on it. – Arman Lamei May 26 '20 at 00:07
  • What operating system are you using? Try run jar with cmd : java -jar myfile.jar – Lê Hoàng Dững May 26 '20 at 00:11
  • I'm using Windows 10 and that gives me "Error: Unable to access jarfile VirtualLab.jar" for both jar files that can be opened and jar files that can't be opened. – Arman Lamei May 26 '20 at 00:17
  • The jar file opens when I remove all the code except for the VirtualLab constructor. – Arman Lamei May 26 '20 at 00:20
  • I also get this error when the jar file is in a directory with a folder name containing unicode code or a space, please copy the jar file to another directory and run it again – Lê Hoàng Dững May 26 '20 at 00:57
  • Now the file says could not find main class. This is the content of my manifest file: Manifest-Version: 1.0 VirtualLab-Class: VirtualLab – Arman Lamei May 26 '20 at 01:54
  • I installed jdk 14 and it worked. Thank you Johannes. – Arman Lamei May 26 '20 at 02:27

0 Answers0