簡體   English   中英

鼠標單擊的偵聽器不起作用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM