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: . 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);
}