java - 无法在我的图片上画出三角形

标签 java swing jpanel paintcomponent

我正在创建一个 map 程序,它应该能够添加地铁、学校等地点。

我可以打开一张 map 图片,并且我的窗口应该调整大小以适合该图像。现在我不希望能够向 map (我的三角形)添加类似的图钉。问题是我无法让它工作。我有一个 MouseAdapter,它应该收集我的 X 和 Y 并将我的三角形放在 map 上。它不起作用,我不明白为什么..当我创建MapPanel时,我什至硬编码了一个三角形,该三角形显示出来,但它总是最终出现在 map 的顶部中心..即使当我创建时更改 x 和 y 的值..

这是我的主程序

package inlupp2_prog2;

import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;

import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.util.*;



public class MapProgram extends JFrame {

JComboBox place;
MapPanel mp = null;
JTextField searchField;
JButton searchButton, hideButton, deletePlaceButton, whatIsHere, hideCat, newCat, delCat;
JFileChooser jfc = new JFileChooser(".");
boolean changed = false;




MapProgram(){
    super("inlupp2 av Filip Blom (fibl7163)");

    //FILEMENU  TOPP
    JMenuBar fileBar = new JMenuBar();
    setJMenuBar(fileBar);

    JMenu archive = new JMenu("File");
    fileBar.add(archive);

    JMenuItem open = new JMenuItem("Open");
    archive.add(open);
    open.addActionListener(new OpenLis());

    JMenuItem save = new JMenuItem("Save");
    archive.add(save);
    //ACTIONLISTENER

    JMenuItem close = new JMenuItem("Close");
    archive.add(close);
    close.addActionListener(new CloseLis());


    //valmeny   TOPP
    JPanel north = new JPanel();
    add(north, BorderLayout.NORTH);
    north.add(new JLabel("New"));

    String[] places = { "NamedPlace", "DescribedPlace" };
    place = new JComboBox(places);
    north.add(place);
    //ACTIONLISTENER

    searchField = new JTextField("search", 10);
    north.add(searchField);
    //ACTIONLISTERNER

    searchButton = new JButton("Search");
    north.add(searchButton);
    //ACTIONLISTENER

    hideButton = new JButton("Hide places");
    north.add(hideButton);
    //ACTIONLISTER

    deletePlaceButton = new JButton("Delete places");
    north.add(deletePlaceButton);
    //ACTIONLISTERN

    whatIsHere = new JButton("What is here?");
    north.add(whatIsHere);
    //ACTIONLISTER


    //kategorier ÖST

    JPanel east = new JPanel();
    add(east, BorderLayout.EAST);

    east.add(new JLabel("Categories"));
    //SCROLLPANE

    hideCat = new JButton("Hide category");
    east.add(hideCat);
    //ACTIONLISTER

    newCat = new JButton("New category");
    east.add(newCat);
    //ACTIONLISTERN

    delCat = new JButton("Delete category");
    east.add(delCat);
    //ACTIONLISTER

    BoxLayout eastLayout = new BoxLayout(east, BoxLayout.Y_AXIS);
    east.setLayout(eastLayout);



    addWindowListener(new CloseLis());


    setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); 
    setSize(800,300);
    setVisible(true);
    setLocationRelativeTo(null);
    setResizable(false);
}

class MouseLis extends MouseAdapter{
    public void MouseClicked(MouseEvent mev){
        int x = mev.getX();
        int y = mev.getY();
        Place p = new Place(x,y);
        mp.add(p);
        mp.repaint();
        mp.validate();
    }
}

class OpenLis implements ActionListener{
    public void actionPerformed(ActionEvent ave){
        int answer = jfc.showOpenDialog(MapProgram.this);
        if(answer != JFileChooser.APPROVE_OPTION){
            return;
        }

        File file = jfc.getSelectedFile();
        String filename = file.getAbsolutePath();
        if(mp != null){
            remove(mp);
        }

        mp = new MapPanel(filename);
        add(mp, BorderLayout.CENTER);
//          mp.add(new Place(500,500));
        pack();
        validate();
        repaint();
        mp.addMouseListener(new MouseLis());
    }
}

class CloseLis extends WindowAdapter implements ActionListener{

    public void closeSave(){
        if(changed){
        int answer = JOptionPane.showConfirmDialog(null,"You have unsaved changes...\nYou Still want to close this program?", "WARNING", JOptionPane.YES_NO_OPTION);
//          int answer = JOptionPane.showConfirmDialog(MapProgram.this, "You have unsaved changes...\nYou Still want to close this program?");
        if(answer==0){
            System.exit(0);
        } 
        }

        System.exit(0);
    }

    public void windowClosing(WindowEvent wev){
        closeSave();
    }


    public void actionPerformed(ActionEvent ave){
        closeSave();
    }

}

public static void main(String[] args){
    new MapProgram();
}

}

这是我创建三角形的类

package inlupp2_prog2;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Place extends JComponent {

public Place(int x, int y){
    setBounds(x,y,50,50);
    Dimension d = new Dimension(50, 50);
    setPreferredSize(d);
    setMaximumSize(d);
    setMinimumSize(d);
}

protected void paintComponent(Graphics g){
    super.paintComponent(g);
    g.setColor(Color.BLACK);
    int[] xes = {0,25,50};
    int[] yes = {0,50,0};
    g.fillPolygon(xes, yes, 3);
}

}

这是我的 map 面板

package inlupp2_prog2;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;

public class MapPanel extends JPanel{
private ImageIcon map;

public MapPanel(String filename){
    map = new ImageIcon(filename);
    int w = map.getIconWidth();
    int h = map.getIconHeight();
    Dimension d = new Dimension(w,h);
    setPreferredSize(d);
    setMaximumSize(d);
    setMinimumSize(d);
}

protected void paintComponent(Graphics g){
    super.paintComponent(g);
    g.drawImage(map.getImage(), 0, 0, getWidth(), getHeight(), this);
}


}

最佳答案

class MouseLis extends MouseAdapter{
    public void MouseClicked(MouseEvent mev){
        int x = mev.getX();
        int y = mev.getY();
        Place p = new Place(x,y);
        mp.add(p);
        mp.repaint();
        mp.validate();
    }
}

请注意mouseClicked != MouseClicked。经验教训:始终在重写方法时使用@Override,因为这会显示错误:

class MouseLis extends MouseAdapter{
    @Override
    public void MouseClicked(MouseEvent mev){
        int x = mev.getX();
        int y = mev.getY();
        Place p = new Place(x,y);
        mp.add(p);
        mp.repaint();
        mp.validate();
    }
}

注意:我是如何发现你的错误的?通过使用您的代码并在其中添加 println ,包括:

  public void MouseClicked(MouseEvent mev) {
     System.out.println("" + mev.getPoint());
     int x = mev.getX();
     int y = mev.getY();
     Place p = new Place(x, y); //!!
     p.setBorder(BorderFactory.createLineBorder(Color.red)); //!!
     mp.add(p);
     mp.repaint();
     mp.validate();
  }

这个家伙从来没有打印出来,所以它让我开始寻找它不起作用的原因。另外,将来请考虑创建并发布 Minimal, Complete, and Verifiable Example Program 。我们不想看到您的整个程序,而是您应该将代码压缩为仍然可以编译的最小代码,没有与您的问题无关的额外代码,但仍然演示您的问题。您很可能通过简单地尝试隔离和暴露错误来自行解决问题。

关于java - 无法在我的图片上画出三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29827261/

相关文章:

java - JMenu 问题中的 JFileChooser

java - 如何将 ShapeIcons 添加到没有标签的 JPanel 中?

java - 删除recycleView中的sqlite条目

java - 将 JMenuItem 添加到 JMenu 会导致菜单栏消失

java - Rapidminer与Java的集成: Obtaining the output Example Set (Process Result)

java - 在 GUI 组件上使用可重用操作的最佳实践

java - 当 Servlet 销毁声明变量的值时

java - 如何生成自动 addWindowListener(new ExitListener());在智能 10.0.3

Java 项目仅在窗口大小调整后出现

java - 如何使 JPanel 保持在另一个已设置大小的 JPanel 之上