![](/img/trans.png)
[英]JmenuItem mouse pressed work but mouse clicked event does not work? why?
[英]Mouse Clicked Listener does not work?
我試圖繪制多個表示國家的圓圈,當我單擊這些圓圈中的任何一個時,該國家的顏色必須從藍色更改為紅色,現在當我運行該程序時,它沒有顯示錯誤,但偵聽器不起作用。 我猜我附着它們的地方是錯誤的,誰能指導我!
public class Algo extends JPanel
{
public String[] Names = {"Egypt", "London", "Korea", "Egypt", "London", "Egypt", "London", "Korea", "Egypt", "London"};
public int[] X = {105, 324, 190, 346, 162, 270, 196, 277, 57, 225};
public int[] Y = {110, 477, 212, 444, 207, 331, 230, 497, 470, 297};
public List<Country> Countries = new ArrayList<>();
private Color color = Color.blue;
public static void main(String[] args)
{
new Algo();
}
public Algo()
{
EventQueue.invokeLater(new Runnable()
{
@Override
public void run()
{
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex)
{
ex.printStackTrace();
}
JFrame frame = new JFrame("Airport");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new CountriesPane());
frame.pack();
frame.setSize(700, 700);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class CountriesPane extends JPanel implements MouseListener
{
public CountriesPane()
{
for (int i = 0; i < Names.length; i++)
{
Country C = new Country(X[i], Y[i]);
C.Name = Names[i];
Countries.add(C);
}
}
@Override
public void mousePressed(MouseEvent me) {
}
@Override
public void mouseReleased(MouseEvent me) {
}
@Override
public void mouseEntered(MouseEvent me) {
}
@Override
public void mouseExited(MouseEvent me) {
}
@Override
public void mouseClicked(MouseEvent me)
{
Point lol = me.getPoint();
for (int i = 0; i < Countries.size(); i++)
{
if (Countries.get(i).contian(lol))
Countries.get(i).changeColor();
}
}
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
for (int i = 0; i < Names.length; i++)
{
Countries.get(i).paint(g2d);
g2d.drawString(" " +Names[i],Countries.get(i).x, Countries.get(i).y);
}
}
}
public class Country
{
private int height = 20;
private int width = 20;
private int x;
private int y;
private Ellipse2D shape;
private String Name;
public Country( int w, int z)
{
x = w;
y = z;
shape = new Ellipse2D.Double(w, z, width, height);
}
public boolean contian(Point x)
{
return shape.contains(x);
}
public void paint(Graphics2D g2d)
{
g2d.setColor(color);
g2d.fill(shape);
}
public void changeColor()
{
if (color == Color.BLUE)
{
color = Color.RED;
}
else
{
color = color.BLUE;
}
repaint();
}
}
}
最可能的原因是您的包含函數直接使用Ellipse2D的包含函數。 此函數檢查給定的x和y是否在Ellipse的內部,但不考慮其在屏幕上的位置偏移。 嘗試下面的代碼,看看是否有所不同:
public boolean contian(Point x)
{
return shape.contains(new Point(x.getX()-this.x, x.getY()-this.y));
}
附帶說明一下,存儲顏色信息的方式應有所不同。 您使用單個全局值存儲在類Algo中聲明的顏色。 但是,您的代碼建議您將其存儲在Country類中,因為您將方法changeColor()放在了那里。 還要將color變量移至Country類別。
我猜我附着它們的地方是錯誤的
您在哪里附上它們? 我在您的代碼中看不到addMouseListener(...)
語句。
您需要在面板的構造函數中將MouseListener添加到面板。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.