Мне нужно создать приложение с использованием графического интерфейса 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);
});
}
}
.. веская причина поступить иначе, придерживаться компонентов на основе Swing, таких как JFileChooser.
Лучше начать с просмотра Выполнение индивидуальной покраски и Покраска в AWT и Swing




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