Мышь щелкнула слушателем не работает? - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь нарисовать несколько кругов, которые представляют страны, и когда я нажимаю на любой из этих кругов, цвет этой страны должен измениться с синего на красный, теперь, когда я запускаю программу, она не показывает ошибку, но слушатели делаютне работа.Я думаю, место, где я их прикрепил, неправильное, может кто-нибудь направить меня!

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();

    }  


  }

}   

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Я думаю, место, где я их прикрепил, неправильное

Где вы их прикрепили?Я не вижу оператора addMouseListener(...) в вашем коде.

Вам необходимо добавить MouseListener на панель в конструкторе вашей панели.

0 голосов
/ 22 мая 2018

Наиболее вероятная причина в том, что ваша функция напрямую использует функцию Ellipse2D содержит .Эта функция проверяет, находятся ли заданные x и y внутри эллипса, но не учитывает смещение его положения на экране.Попробуйте следующий код, чтобы увидеть, если он имеет значение:

public boolean contian(Point x)
{
    return shape.contains(new Point(x.getX()-this.x, x.getY()-this.y));
}

В качестве примечания, способ хранения информации о цвете должен быть сделан по-другому.Вы используете одно глобальное значение для хранения цвета, объявленного в вашем классе Algo .Но ваш код предполагает, что вы хотите сохранить его внутри класса Country , потому что вы поместили туда метод changeColor () .Также переместите переменную цвета в класс Страна .

...