28 setLayout(
new BorderLayout());
32 sidebar.setPreferredSize(
new Dimension(200, 0));
33 sidebar.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, Color.GRAY));
40 protected void paintComponent(Graphics g) {
41 super.paintComponent(g);
45 gridCanvas.setBackground(
new Color(40, 44, 52));
48 MouseAdapter ma =
new MouseAdapter() {
49 @Override
public void mousePressed(MouseEvent e) {
paintTile(e); }
50 @Override
public void mouseDragged(MouseEvent e) {
paintTile(e); }
51 @Override
public void mouseMoved(MouseEvent e) {
52 int ds = mapData.tileSize *
mapData.displayScale;
57 @Override
public void mouseExited(MouseEvent e) {
65 add(
sidebar, BorderLayout.WEST);
66 add(
new JScrollPane(
gridCanvas), BorderLayout.CENTER);
77 sidebar.setLayout(
new GridBagLayout());
78 GridBagConstraints gbc =
new GridBagConstraints();
79 gbc.fill = GridBagConstraints.HORIZONTAL;
81 gbc.insets =
new Insets(2, 5, 2, 5);
86 sidebar.add(
new JLabel(
"MAP SETTINGS"), gbc);
90 JPanel tsPanel =
new JPanel(
new BorderLayout());
91 tsPanel.add(
new JLabel(
"Tile Size: "), BorderLayout.WEST);
92 JSpinner tsSpinner =
new JSpinner(
new SpinnerNumberModel(
mapData.tileSize, 1, 128, 1));
93 tsSpinner.addChangeListener(e -> {
94 mapData.tileSize = (int) tsSpinner.getValue();
98 tsPanel.add(tsSpinner, BorderLayout.CENTER);
103 JPanel wPanel =
new JPanel(
new BorderLayout());
104 wPanel.add(
new JLabel(
"Width: "), BorderLayout.WEST);
105 JSpinner wSpinner =
new JSpinner(
new SpinnerNumberModel(
mapData.width, 1, 500, 1));
106 wSpinner.addChangeListener(e -> {
107 int newW = (int) wSpinner.getValue();
112 wPanel.add(wSpinner, BorderLayout.CENTER);
117 JPanel hPanel =
new JPanel(
new BorderLayout());
118 hPanel.add(
new JLabel(
"Height: "), BorderLayout.WEST);
119 JSpinner hSpinner =
new JSpinner(
new SpinnerNumberModel(
mapData.height, 1, 500, 1));
120 hSpinner.addChangeListener(e -> {
121 int newH = (int) hSpinner.getValue();
126 hPanel.add(hSpinner, BorderLayout.CENTER);
131 JPanel sPanel =
new JPanel(
new BorderLayout());
132 sPanel.add(
new JLabel(
"View Scale: "), BorderLayout.WEST);
133 JSpinner sSpinner =
new JSpinner(
new SpinnerNumberModel(
mapData.displayScale, 1, 20, 1));
134 sSpinner.addChangeListener(e -> {
135 mapData.displayScale = (int) sSpinner.getValue();
139 sPanel.add(sSpinner, BorderLayout.CENTER);
143 sidebar.add(
new JSeparator(), gbc);
146 sidebar.add(
new JLabel(
"LAYERS"), gbc);
147 ButtonGroup bg =
new ButtonGroup();
148 for (
int i = 0; i <
mapData.layers.size(); i++) {
158 sidebar.add(
new JSeparator(), gbc);
160 sidebar.add(
new JLabel(
"TILES"), gbc);
162 JPanel palette =
new JPanel(
new GridLayout(0, 2, 5, 5));
163 for (
int i = 1; i <= 20; i++) {
164 if (!
mapData.tileAssets.containsKey(i) && i > 1 && !
mapData.tileAssets.containsKey(i-1))
break;
165 final int tileId = i;
166 JButton b =
new JButton() {
167 @Override
protected void paintComponent(Graphics g) {
168 super.paintComponent(g);
170 if (img !=
null) g.drawImage(img, 5, 5, getWidth()-10, getHeight()-10,
null);
172 g.setColor(Color.LIGHT_GRAY);
173 g.fillRect(5, 5, getWidth()-10, getHeight()-10);
174 g.setColor(Color.BLACK);
175 g.drawString(
""+tileId, 10, 20);
178 g.setColor(Color.YELLOW);
179 g.drawRect(2, 2, getWidth()-4, getHeight()-4);
183 b.setPreferredSize(
new Dimension(40, 40));
184 b.addActionListener(e -> {
195 JButton configBtn =
new JButton(
"Config Selected Tile");
200 JButton exportBtn =
new JButton(
"Export PNG");
207 sidebar.add(Box.createGlue(), gbc);
238 private void drawGrid(Graphics g,
boolean showGridLines) {
240 int ds = mapData.tileSize * (showGridLines ? mapData.displayScale : 1);
242 for (
int i = 0; i <
mapData.layers.size(); i++) {
245 Graphics2D g2d = (Graphics2D) g.create();
246 g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
248 for (
int x = 0; x <
mapData.width; x++) {
249 for (
int y = 0; y <
mapData.height; y++) {
250 int tileId = layer.
tiles[x][y];
254 g2d.drawImage(img, x * ds, y * ds, ds, ds,
null);
257 g2d.fillRect(x * ds, y * ds, ds, ds);
266 g.setColor(
new Color(60, 60, 60));
267 for (
int x = 0; x <=
mapData.width; x++) g.drawLine(x * ds, 0, x * ds,
mapData.height * ds);
268 for (
int y = 0; y <=
mapData.height; y++) g.drawLine(0, y * ds,
mapData.width * ds, y * ds);
271 g.setColor(
new Color(255, 255, 255, 80));
278 BufferedImage img =
new BufferedImage(
mapData.width *
mapData.tileSize,
mapData.height *
mapData.tileSize, BufferedImage.TYPE_INT_ARGB);
279 Graphics2D g2d = img.createGraphics();
284 if (saver.showSaveDialog(
this) == JFileChooser.APPROVE_OPTION) {
285 File file = saver.getSelectedFile();
286 if (!file.getName().endsWith(
".png")) file =
new File(file.getAbsolutePath() +
".png");
288 ImageIO.write(img,
"PNG", file);
289 JOptionPane.showMessageDialog(
this,
"Exported successfully!");
290 }
catch (IOException e) {