Не может получить доступ к общедоступному методу / переменной JPanel и не может получить доступ из Jpanel к другому общедоступному методу / переменной

#java #swing #nullpointerexception #jpanel

#java #swing #исключение nullpointerexception #jpanel

Вопрос:

 package client;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class YootPanel extends JPanel
{

    private ImageIcon bgIcon;
    public JTextArea textBox;
    public ClientUI clientUI;
    public static final int HORSE_HEIGHT = 25;
    public static final int HORSE_WIDTH = 40;
    public int r1,r2,r3,r4;
    public int b1,b2,b3,b4;
    YootPanelPlot plot;

    public YootPanel(ClientUI clientUI)
    {
        super();    
        init_rest();
        init_bg();
            plot =  = new YootPanelPlot();
        this.setVisible(true);
        this.clientUI = clientUI;
    }

    private void init_bg()
    {
        java.net.URL imgUrl = ClientUI.class.getResource("../images/images/background.png");
        bgIcon = new ImageIcon(imgUrl);
    }

    protected void paintComponent(Graphics g)
    {
        try
        {
            g.drawImage(bgIcon.getImage(), -20, 0, null);
            super.paintComponent(g);
        } catch (Exception e)
        {


        set_Loc();


        g.setColor(Color.RED);
        g.fillOval(plot.plot[0][r1], plot.plot[1][r1], HORSE_WIDTH, HORSE_HEIGHT);
        g.fillOval(plot.plot[0][r2], plot.plot[1][r2], HORSE_WIDTH, HORSE_HEIGHT);
        g.fillOval(plot.plot[0][r3], plot.plot[1][r3], HORSE_WIDTH, HORSE_HEIGHT);
        g.fillOval(plot.plot[0][r4], plot.plot[1][r4], HORSE_WIDTH, HORSE_HEIGHT);
        g.setColor(Color.BLUE);
        g.fillOval(plot.plot[0][b1], plot.plot[1][b1], HORSE_WIDTH, HORSE_HEIGHT);
        g.fillOval(plot.plot[0][b2], plot.plot[1][b2], HORSE_WIDTH, HORSE_HEIGHT);
        g.fillOval(plot.plot[0][b3], plot.plot[1][b3], HORSE_WIDTH, HORSE_HEIGHT);
        g.fillOval(plot.plot[0][b4], plot.plot[1][b4], HORSE_WIDTH, HORSE_HEIGHT);
        System.err.println("Paint");
        }
    }

    public void paint(Graphics g)
    {
        super.paint(g);

    }

private void init_rest()
{
        this.setBorder(javax.swing.BorderFactory.createTitledBorder("Yoot Map"));
        this.setFocusable(false);
        this.setMinimumSize(new java.awt.Dimension(670, 400));
        this.setName("map"); // NOI18N
        this.setOpaque(false);
        this.setPreferredSize(new java.awt.Dimension(630, 400));
        this.setSize(new java.awt.Dimension(630, 400));
        this.setVerifyInputWhenFocusTarget(false);

        org.jdesktop.layout.GroupLayout yootMapLayout = new org.jdesktop.layout.GroupLayout(this);
        this.setLayout(yootMapLayout);
        yootMapLayout.setHorizontalGroup(
        yootMapLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING).add(0, 658, Short.MAX_VALUE));
yootMapLayout.setVerticalGroup(
        yootMapLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING).add(0, 442, Short.MAX_VALUE));
}

    public void set_Loc()
    {
        try
        {
            System.err.println("......" clientUI.client.c2.blueHorseLocation[0]);
            r1 = clientUI.client.c2.getRed(0);
            r2 = clientUI.client.c2.getRed(1);
            r3 = clientUI.client.c2.getRed(2);
            r4 = clientUI.client.c2.getRed(3);
            b1 = clientUI.client.c2.blueHorseLocation[0];
            b2 = clientUI.client.c2.blueHorseLocation[1];
            b3 = clientUI.client.c2.blueHorseLocation[2];
            b4 = clientUI.client.c2.blueHorseLocation[3];
        } catch (NullPointerException e)
        {
             e.printStackTrace();
        }
    }
}
  

Что я пытаюсь сделать, так это получить обновления о том, куда помещать рисовать овалы.
Однако последняя часть r1 = clientUI.client.c2.getRed(1); выдает исключение NullPointerException

Итак, я попытался получить доступ к общедоступным переменным этого класса r1, r2 … и т.д. Однако я также не смог получить доступ к этим общедоступным переменным….

Есть ли способ, которым я могу изменить эти переменные, чтобы я мог перемещать овалы по мере получения новых обновлений координат?

Комментарии:

1. Чтобы получить лучшую помощь раньше, отправьте SSCCE .

2. КСТАТИ, хороший способ исправить форматирование, но в вашем коде все еще есть оба метода paintComponent() amp; paint() . Если вы не следуете предложенным советам или запрашиваете дополнительные разъяснения по поводу рекомендаций, какой смысл людям предлагать какие-либо?

3. Спасибо за ваш совет @AndrewThompson ! Я обнаружил, что вызывал этот класс очень неправильным способом… Я создал JPanel yootMap = new YootPanel (clientUI); вместо YootPanel yootMap = new YootPanel (clientUI);

Ответ №1:

Не используйте общедоступные переменные.

Определите методы для удаления значений любого свойства, которое вы хотите изменить.

Кроме того, пользовательское рисование выполняется путем переопределения метода paintComponent(). Вы не должны переопределять метод paint ().

Комментарии:

1. Похоже, я также не могу получить доступ к общедоступным методам… По какой-то причине моя IDE NetBeans не показывает их во всплывающем окне, и если я вручную пишу общедоступные методы, я сталкиваюсь с ошибкой.

2. Я действительно не понимаю, почему clientUI.client.c2.getRed(0); возвращает исключение NullPointerException…. Они уже существуют…. @camickr

3. Я не использую IDE для написания кода, поэтому я не знаю, в чем ваша проблема. Я бы предположил, что вам не следует использовать YootPanelPlot plot = new YootPanelPlot(); в любом методе paint (). Кроме того, я не могу прочитать ваш код, потому что он неправильно отформатирован.

4. @camickr Хорошо, я попытался переформатировать столько, сколько мог. Я переместил рисование овалов в метод paintComponent(); однако я все еще получаю проблему с исключением NullPointerException при попытке получить значение clientUI.c2.blueHorseLocation[0];….

5. Я попытался вызвать clientUI.c2.blueHorseLocation [0] непосредственно перед repaint(); из другого класса, и он вернул значение местоположения синей лошади; однако сразу после вызова repaint () я получаю исключение NullPointerException…

Ответ №2:

Хорошо, я был глуп и выполнил неправильную работу при создании объекта… Я должен был использовать

 YootPanel object = new YootPanel();
  

но я использовал

 JPanel object = new YootPanel();
  

вместо этого….
Неудивительно, что я не смог получить доступ к методам, которые я создал в классе YootPanel….

Спасибо всем за все ваши ответы!