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 JMenuItem deleteItem =
new JMenuItem(
"Delete");
75 spriteMenu.add(deleteItem);
77 spriteList.addMouseListener(
new java.awt.event.MouseAdapter() {
78 public void mousePressed(java.awt.event.MouseEvent e) {
79 if (e.isPopupTrigger()) showMenu(e);
81 public void mouseReleased(java.awt.event.MouseEvent e) {
82 if (e.isPopupTrigger()) showMenu(e);
84 private void showMenu(java.awt.event.MouseEvent e) {
85 int index = spriteList.locationToIndex(e.getPoint());
87 spriteList.setSelectedIndex(index);
88 spriteMenu.show(e.getComponent(), e.getX(), e.getY());
93 JButton addSpriteBtn =
new JButton(
"Add Sprite");
94 addSpriteBtn.addActionListener(e -> addSprite());
95 spritePanel.add(addSpriteBtn, BorderLayout.SOUTH);
97 rightPanel.add(spritePanel, BorderLayout.CENTER);
99 JSplitPane leftSplit =
new JSplitPane(JSplitPane.VERTICAL_SPLIT, tabbedPane,
new JScrollPane(consoleArea));
100 leftSplit.setDividerLocation(600);
101 leftSplit.setResizeWeight(0.7);
103 JSplitPane mainSplit =
new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftSplit, rightPanel);
104 mainSplit.setDividerLocation(1000);
105 add(mainSplit, BorderLayout.CENTER);
107 setJMenuBar(createMenuBar());
109 spriteList.addListSelectionListener(e -> {
110 int idx = spriteList.getSelectedIndex();
112 codeWorkspace.saveCurrentCode();
114 codeWorkspace.loadSpriteCode(sd);
115 soundPanel.refreshList(sd.
sounds);
119 syncWithSourceFiles();
126 setLocationRelativeTo(
null);
423 if (assetsDir.exists()) {
424 File[] files = assetsDir.listFiles();
430 try (ZipInputStream zis =
new ZipInputStream(
new FileInputStream(zipFile))) {
432 while ((entry = zis.getNextEntry()) !=
null) {
433 if (entry.getName().equals(
"project.json")) {
434 InputStreamReader reader =
new InputStreamReader(zis);
436 }
else if (entry.getName().startsWith(
"assets/")) {
437 String filename = entry.getName().substring(7);
438 if (filename.isEmpty()) {
442 File outFile =
new File(assetsDir, filename);
443 Files.copy(zis, outFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
520 File generatedSrcDir =
new File(srcDir,
"generated");
523 if (binDir.exists()) {
524 File[] files = binDir.listFiles();
531 if (generatedSrcDir.exists()) {
532 File[] files = generatedSrcDir.listFiles((dir, name) -> name.endsWith(
".java"));
534 for (File f : files) {
535 String className = f.getName().replace(
".java",
"");
536 boolean existsInProject =
false;
538 if (sd.
name.equals(className)) { existsInProject =
true;
break; }
540 if (!existsInProject) f.delete();
544 generatedSrcDir.mkdirs();
547 int spriteCount =
project.sprites.size();
548 String[] sourceCode =
new String[spriteCount];
549 String[] classNames =
new String[spriteCount];
550 for (
int i = 0; i < spriteCount; i++) {
553 classNames[i] =
"generated." + sprite.
name;