37 setTitle(
"JScratch - Java IDE");
39 setDefaultCloseOperation(EXIT_ON_CLOSE);
40 setLayout(
new BorderLayout());
42 getContentPane().setBackground(
new Color(77, 151, 255));
47 stagePreview.setBorder(BorderFactory.createLineBorder(
new Color(220, 220, 220), 2));
52 JPanel rightPanel =
new JPanel(
new BorderLayout());
53 rightPanel.setOpaque(
false);
54 rightPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
56 JPanel stageContainer =
new JPanel(
new BorderLayout());
58 stageContainer.setOpaque(
false);
59 rightPanel.add(stageContainer, BorderLayout.NORTH);
61 JPanel spritePanel =
new JPanel(
new BorderLayout());
62 spritePanel.setBackground(Color.WHITE);
63 spritePanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
65 spriteList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
66 spritePanel.add(
new JScrollPane(
spriteList), BorderLayout.CENTER);
68 JPopupMenu spriteMenu =
new JPopupMenu();
69 JMenuItem renameItem =
new JMenuItem(
"Rename");
71 spriteMenu.add(renameItem);
73 spriteList.addMouseListener(
new java.awt.event.MouseAdapter() {
74 public void mousePressed(java.awt.event.MouseEvent e) {
75 if (e.isPopupTrigger()) showMenu(e);
77 public void mouseReleased(java.awt.event.MouseEvent e) {
78 if (e.isPopupTrigger()) showMenu(e);
80 private void showMenu(java.awt.event.MouseEvent e) {
81 int index = spriteList.locationToIndex(e.getPoint());
83 spriteList.setSelectedIndex(index);
84 spriteMenu.show(e.getComponent(), e.getX(), e.getY());
89 JButton addSpriteBtn =
new JButton(
"Add Sprite");
90 addSpriteBtn.addActionListener(e -> addSprite());
91 spritePanel.add(addSpriteBtn, BorderLayout.SOUTH);
93 rightPanel.add(spritePanel, BorderLayout.CENTER);
95 JSplitPane leftSplit =
new JSplitPane(JSplitPane.VERTICAL_SPLIT, tabbedPane,
new JScrollPane(consoleArea));
96 leftSplit.setDividerLocation(600);
97 leftSplit.setResizeWeight(0.7);
99 JSplitPane mainSplit =
new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftSplit, rightPanel);
100 mainSplit.setDividerLocation(1000);
101 add(mainSplit, BorderLayout.CENTER);
103 setJMenuBar(createMenuBar());
105 spriteList.addListSelectionListener(e -> {
106 int idx = spriteList.getSelectedIndex();
108 codeWorkspace.saveCurrentCode();
110 codeWorkspace.loadSpriteCode(sd);
111 soundPanel.refreshList(sd.
sounds);
115 syncWithSourceFiles();
122 setLocationRelativeTo(
null);
396 if (assetsDir.exists()) {
397 File[] files = assetsDir.listFiles();
403 try (ZipInputStream zis =
new ZipInputStream(
new FileInputStream(zipFile))) {
405 while ((entry = zis.getNextEntry()) !=
null) {
406 if (entry.getName().equals(
"project.json")) {
407 InputStreamReader reader =
new InputStreamReader(zis);
409 }
else if (entry.getName().startsWith(
"assets/")) {
410 String filename = entry.getName().substring(7);
411 if (filename.isEmpty()) {
415 File outFile =
new File(assetsDir, filename);
416 Files.copy(zis, outFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
445 try (ZipOutputStream zos =
new ZipOutputStream(
new FileOutputStream(file))) {
446 zos.putNextEntry(
new ZipEntry(
"project.json"));
447 String json =
new GsonBuilder().setPrettyPrinting().create().toJson(
project);
448 zos.write(json.getBytes());
452 if (assetsDir.exists()) {
453 File[] files = assetsDir.listFiles();
455 for (File f : files) {
456 zos.putNextEntry(
new ZipEntry(
"assets/" + f.getName()));
457 Files.copy(f.toPath(), zos);
463 }
catch (Exception e) {
465 JOptionPane.showMessageDialog(
this,
"Error saving project: " + e.getMessage());
493 File generatedSrcDir =
new File(srcDir,
"generated");
496 if (binDir.exists()) {
497 File[] files = binDir.listFiles();
504 if (generatedSrcDir.exists()) {
505 File[] files = generatedSrcDir.listFiles((dir, name) -> name.endsWith(
".java"));
507 for (File f : files) {
508 String className = f.getName().replace(
".java",
"");
509 boolean existsInProject =
false;
511 if (sd.
name.equals(className)) { existsInProject =
true;
break; }
513 if (!existsInProject) f.delete();
517 generatedSrcDir.mkdirs();
520 int spriteCount =
project.sprites.size();
521 String[] sourceCode =
new String[spriteCount];
522 String[] classNames =
new String[spriteCount];
523 for (
int i = 0; i < spriteCount; i++) {
526 classNames[i] =
"generated." + sprite.
name;