Добавить значки на изображение, используя графический интерфейс Java

Мне нужно создать приложение с использованием графического интерфейса Java (Eclipse).

Мне нужно показать изображение и добавить меню, как в приведенном ниже коде. Кроме того, когда пользователь использует мышь, чтобы щелкнуть изображение, мне нужно сохранить местоположение и добавить значок в это место. Поэтому, если пользователь щелкает в двух разных местах, мне нужно поместить значок в каждое место.

Я пытаюсь это сделать, но не знаю, как добавить значки на изображение. В некоторых других статьях я вижу, что, возможно, мне нужно использовать метод repaint(), но я не понимаю, как этот метод работает.

Если кто-то может помочь мне в том, что мне нужно добавить в мой код, я могу поместить значки на изображение.

Я поместил сюда весь свой код.

public class MainWindowApp extends JFrame {

private JMenuBar menuBar;
private JMenu fileMenu, helpMenu, gameMenu, createGame, addObjects, startMenu;
private JMenuItem openItem, saveItem, conMenu, clearItem, fruitItem, pacmanItem;
private JMenuItem aboutUsItem, conItem, playGameItem, simulationItem, stopDrawObjectsItem;
private Game game;
private int pacman = 0, fruit = 0;
private Board board;

public MainWindowApp() {
    game = new Game();
    initUI();
    initComponents();
    createActions();

}

private void initUI() {
    board=new Board();
    add(board);

    pack();

    setTitle("Bardejov");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
}

public void initComponents() {
    // set menu bar
    menuBar = new JMenuBar();
    setJMenuBar(menuBar);
    menuBar.setVisible(true);

    // set file menu with open, save
    fileMenu = new JMenu("File");
    openItem = new JMenuItem("Open");
    // CTRL_MASK: The control modifier. An indicator that the control key was held
    // down during the event.
    openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK));
    fileMenu.add(openItem);
    saveItem = new JMenuItem("Save");
    saveItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.CTRL_MASK));
    fileMenu.add(saveItem);
    menuBar.add(fileMenu);

    // set Game menu with create game, clear game
    gameMenu = new JMenu("Game options");
    createGame = new JMenu("Create new game");
    addObjects = new JMenu("Add objects");
    clearItem = new JMenuItem("Clear game");
    pacmanItem = new JMenuItem("Pacman");
    fruitItem = new JMenuItem("Fruit");
    stopDrawObjectsItem = new JMenuItem("Stop add objects");
    addObjects.add(pacmanItem);
    addObjects.add(fruitItem);
    addObjects.add(stopDrawObjectsItem);
    createGame.add(addObjects);
    gameMenu.add(createGame);
    gameMenu.add(clearItem);
    menuBar.add(gameMenu);

    // set start menu
    startMenu = new JMenu("Play game");
    simulationItem = new JMenuItem("Eat simulate");
    playGameItem = new JMenuItem("start game");

    // set help menu
    helpMenu = new JMenu("Help");
    conItem = new JMenuItem("Connection");
    aboutUsItem = new JMenuItem("About us");
    helpMenu.add(conItem);
    helpMenu.add(aboutUsItem);
    menuBar.add(helpMenu);

}

public void createActions() {
    pacmanItem.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            fruit = 0;
            pacman = 1;

        }

    });
    fruitItem.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            pacman = 0;
            fruit = 1;
        }
    });
    stopDrawObjectsItem.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            pacman = 0;
            fruit = 0;
        }
    });
    openItem.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("open file");
            try {
                readFileDialog();
            } catch (FileNotFoundException e1) {
                System.out.println("File not found");
            }
        }
    });
    saveItem.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            System.out.println("save file");
            writeFileDialog();
        }
    });
}

public void readFileDialog() throws FileNotFoundException {
    // try read from the file

    FileDialog fd = new FileDialog(this, "Open csv file", FileDialog.LOAD);
    fd.setFile("*.csv");
    fd.setDirectory("C:\\");
    fd.setFilenameFilter(new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
            return name.endsWith(".csv");
        }
    });
    fd.setVisible(true);
    String folder = fd.getDirectory();
    String fileName = fd.getFile();
    try {
        CsvReader csvReader = new CsvReader();
        csvReader.init(folder + fileName, ",");
        game = csvReader.read(1);

    } catch (ParseException e) {
        e.printStackTrace();
    }
}

public void writeFileDialog() {
    // try write to the file
    FileDialog fd = new FileDialog(this, "Save the game", FileDialog.SAVE);
    fd.setFile("*.csv");
    fd.setFilenameFilter(new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
            return name.endsWith(".csv");
        }
    });
    fd.setVisible(true);
    String folder = fd.getDirectory();
    String fileName = fd.getFile();
    try {
        game.saveGame(folder + fileName);
    } catch (IOException ex) {
        System.out.print("Error writing file  " + ex);
    }
}

int x = -1;
int y = -1;

public void mouseClicked(MouseEvent arg) {
    System.out.println("mouse Clicked");
    System.out.println("(" + arg.getX() + "," + arg.getY() + ")");
    x = arg.getX();
    y = arg.getY();
    int maxId = game.getBiggestId() + 1;
    if (fruit == 1)
        game.add(new Fruit(maxId, Map.pixel2Polar(new Point3D(x, y, 0)), 1));
    else if (pacman == 1)
        game.add(new Pacman(maxId, Map.pixel2Polar(new Point3D(x, y, 0)), 1, 1, null));
    else
        return;
    repaint();
}

public static void main(String[] args) {

    EventQueue.invokeLater(() -> {
        MainWindowApp ex = new MainWindowApp();
        ex.setVisible(true);
    });
}
}

1) «Я поместил сюда весь свой код». Не делайте этого. Попытка загрузить изображение может быть сделана в полном примере кода менее 30 строк кода. Для более быстрой помощи редактировать, чтобы добавить минимальный воспроизводимый пример или Краткий, автономный, правильный пример. 2) Один из способов получить изображение (я) для примера - установить горячую ссылку на изображения, которые можно увидеть в этот вопрос и ответ. НАПРИМЕР. Этот ответ горячие ссылки на изображение, встроенное в этот вопрос. 3) FileDialog fd.., если у вас нет ..

Andrew Thompson 22.12.2018 20:23

.. веская причина поступить иначе, придерживаться компонентов на основе Swing, таких как JFileChooser.

Andrew Thompson 22.12.2018 20:25

Лучше начать с просмотра Выполнение индивидуальной покраски и Покраска в AWT и Swing

MadProgrammer 22.12.2018 21:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
127
0

Другие вопросы по теме