md1hunox
md1hunox

Reputation: 3955

Developing existing GUI code in Netbeans GUI Builder

I'm doing project in eclipse, I did the swing part. But now, i wish to use Netbeans to do the Swing part of the project as its easier to do and i'll be able to do it more neatly as I am not experienced much with swing and its layout Managers. Here is an example i found on stackoverflow which consists of some swing components.

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.*;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.swing.*;

public class MoveIcon extends JPanel {

    private static final long serialVersionUID = 1L;
    private static final String IMAGE_PATH = "http://duke.kenai.com/misc/Bullfight.jpg";
    private static final String IMAGE_PATH_PLAYER = "http://duke.kenai.com/iconSized/duke4.gif";
    public static final int STEP = 3;
    private static final int TIMER_DELAY = STEP * 8;
    private BufferedImage bkgrndImage = null;
    private BufferedImage playerImage = null;
    private Map<Direction, Boolean> directionMap = new HashMap<Direction, Boolean>();
    private int playerX = 0;
    private int playerY = 0;

    enum Direction {

        UP(KeyEvent.VK_UP, 0, -1), DOWN(KeyEvent.VK_DOWN, 0, 1),
        LEFT(KeyEvent.VK_LEFT, -1, 0), RIGHT(KeyEvent.VK_RIGHT, 1, 0);
        private int keyCode;
        private int xDirection;
        private int yDirection;

        private Direction(int keyCode, int xDirection, int yDirection) {
            this.keyCode = keyCode;
            this.xDirection = xDirection;
            this.yDirection = yDirection;
        }

        public int getKeyCode() {
            return keyCode;
        }

        public int getXDirection() {
            return xDirection;
        }

        public int getYDirection() {
            return yDirection;
        }
    }

    public MoveIcon() {
        try {
            URL bkgrdImageURL = new URL(IMAGE_PATH);
            URL playerImageURL = new URL(IMAGE_PATH_PLAYER);
            bkgrndImage = ImageIO.read(bkgrdImageURL);
            playerImage = ImageIO.read(playerImageURL);
            setPreferredSize(new Dimension(bkgrndImage.getWidth(), bkgrndImage.getHeight()));
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        for (Direction direction : Direction.values()) {
            directionMap.put(direction, false);
        }
        setKeyBindings();
        Timer timer = new Timer(TIMER_DELAY, new TimerListener());
        timer.start();
    }

    private void setKeyBindings() {
        InputMap inMap = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
        ActionMap actMap = getActionMap();
        for (final Direction direction : Direction.values()) {
            KeyStroke pressed = KeyStroke.getKeyStroke(direction.getKeyCode(), 0, false);
            KeyStroke released = KeyStroke.getKeyStroke(direction.getKeyCode(), 0, true);
            inMap.put(pressed, direction.toString() + "pressed");
            inMap.put(released, direction.toString() + "released");
            actMap.put(direction.toString() + "pressed", new AbstractAction() {

                private static final long serialVersionUID = 1L;

                @Override
                public void actionPerformed(ActionEvent e) {
                    directionMap.put(direction, true);
                }
            });
            actMap.put(direction.toString() + "released", new AbstractAction() {

                private static final long serialVersionUID = 1L;

                @Override
                public void actionPerformed(ActionEvent e) {
                    directionMap.put(direction, false);
                }
            });
        }

    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (bkgrndImage != null) {
            g.drawImage(bkgrndImage, 0, 0, null);
        }
        if (playerImage != null) {
            g.drawImage(playerImage, playerX, playerY, null);
        }
    }

    private class TimerListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            boolean moved = false;
            for (Direction direction : Direction.values()) {
                if (directionMap.get(direction)) {
                    playerX += STEP * direction.getXDirection();
                    playerY += STEP * direction.getYDirection();
                    moved = true;
                }
            }
            if (moved) {
                int x = playerX - 2 * STEP;
                int y = playerY - 2 * STEP;
                int w = playerImage.getWidth() + 4 * STEP;
                int h = playerImage.getHeight() + 4 * STEP;
                MoveIcon.this.repaint(x, y, w, h); // !! repaint just the player
            }
        }
    }

    private static void createAndShowUI() {
        JFrame frame = new JFrame("MoveIcon");
        frame.getContentPane().add(new MoveIcon());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                createAndShowUI();
            }
        });
    }
}

The question is: with some of the swing components already designed programatically, can i open this project in netbeans and use its GUI Builder to further build on the GUI part?

Upvotes: 2

Views: 4057

Answers (2)

trashgod
trashgod

Reputation: 205785

What you propose is not supported, but you can add any number of new JPanel Form instances to your existing frame. SouthPanel was created by choosing File > New File > Swing GUI Forms > JPanel Form, adding a JLabel and specifying FlowLayout.

private static void createAndShowUI() {
    JFrame frame = new JFrame("MoveIcon");
    frame.add(new MoveIcon(), BorderLayout.CENTER);
    frame.add(new SouthPanel(), BorderLayout.SOUTH);
    ...
}

MoveIcon Image

Upvotes: 2

gobernador
gobernador

Reputation: 5739

No, but yes.

The problem has to do with how NetBeans does its projects and UI builder.

Netbeans puts a folder in the root of the project folder called "nbproject" which contains stuff that's unique to Netbeans that doesn't happen in Eclipse (I would explain, but it's beyond the scope of your question). You can, however, use File -> Import Project -> Eclipse Project... and it should work.

The trickier part comes with the Swing GUI. You can absolutely import the Swing code into Netbeans, but Netbeans has its own library that isn't exactly pure Swing. It's called org.jdesktop.application and it includes SingleFrameApplication, FrameView, and a few other tailor-made things. When you build an application with the Netbeans framework, it creates it preferring these classes over the "actual" Swing. Can you use the drag and drop editor? I've never tried, but I'll bet the answer is no. On the other hand, I do have one project I'm working on now that I abandoned the Netbeans Swing for the pure Swing, and if you're ok with not having the drag and drop features, it's actually kind of nice. It's way more flexible and capable because the generated code is not edit-blocked.

Upvotes: 2

Related Questions