Почему JLabel не обновляется, когда метод setText () вызывается в jpanel.paintComponent ()? - PullRequest
0 голосов
/ 04 мая 2019

После поиска более 3 часов для подобной проблемы и не нашел никакой подсказки, я надеюсь, что я получу мое спасение услышать.Я пытаюсь написать проблему, которая хранит в очереди до 5 линий, которые рисуются внутри JPanel с помощью метода paintComponent ().Также я хочу обновить текст JLabel для подсчета размера очереди.Я пытаюсь обновить JLabel методом setText внутри метода Jpanel.paintComponent ().Проблема, с которой я столкнулся и не могу ее преодолеть: 1. Когда paintComponent запускает строку: label.setText ("..." + lineQueue.size ());внутри класса DrawPanel я получаю исключение, означающее, что метка равна нулю.Как это возможно, если конструктор DrawPanel его инициализировал?2. Чтобы преодолеть первую проблему, я ставлю if (label! = Null), чем label.setText ("..." + lineQueue.size ()) , но текст метки не обновляется независимо от того, что происходит с JFrame.Может кто-нибудь объяснить мне, в чем проблема?Это сводит меня с ума: (

Мой код (4 файла):

   public class Point
{
    private int x;
    private int y;
    public Point (int x, int y)
    {
        this.x = x;
        this.y = y;
    }

    public int getX()
    {
        return x;
    }

    public int getY()
    {
        return y;
    }
}

import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.JPanel;

public class MyLine
{
    private Point p1;
    private Point p2;
    private Color color;

    public MyLine (Point point1 ,Point point2, Color color)
    {
        p1 = point1;
        p2 = point2;
        this.color = color;
    }

    public void drawLine (Graphics g)
    {
        g.setColor(color);
        g.drawLine (p1.getX(),p1.getY(),p2.getX(),p2.getY());
    }

}

import java.awt.Color;
import java.awt.Graphics;
import java.util.*;
import javax.swing.JPanel;
import javax.swing.JLabel;
import java.util.Queue;

public class DrawPanel extends JPanel
{

    private LinkedList<MyLine> lineQueue;
    private JLabel label;

    public DrawPanel(JLabel label)
    {
        label = this.label;
        lineQueue = new LinkedList <MyLine>();
    }   

    public void paintComponent (Graphics g)
    {

        super.paintComponent(g);

        Random rand = new Random();
        Point p1 = new Point (rand.nextInt(400),rand.nextInt(400));
        Point p2 = new Point (rand.nextInt(400),rand.nextInt(400));
        Color color = new Color (rand.nextInt(256), rand.nextInt(256), rand.nextInt(256));

        if (lineQueue.size() >= 5)
            lineQueue.remove();
        lineQueue.add(new MyLine (p1,p2,color));

        ListIterator<MyLine> iterator = lineQueue.listIterator(0);
        while (iterator.hasNext() == true)
            iterator.next().drawLine(g);
        if (label!=null)
        {
            label.setText("... "+ lineQueue.size());
        }

    }
}

import java.awt.Color;
import javax.swing.*;
import java.awt.BorderLayout;

public class TestDrawLine
{
    public static void main(String[] args)
    {
        JFrame frame = new JFrame ();
        frame.setLayout(new BorderLayout());
        frame.setSize(400,350);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JLabel label = new JLabel();

        DrawPanel drawPanel = new DrawPanel(label);
        drawPanel.setBackground(Color.BLACK);
        frame.add (drawPanel,BorderLayout.CENTER);

        JPanel southPanel = new JPanel();
        southPanel.add (label);
        frame.add (southPanel,BorderLayout.SOUTH);

        frame.setVisible(true);

    }
}

1 Ответ

2 голосов
/ 04 мая 2019
label = this.label;

Это инициализирует аргумент переменной экземпляра.Вам нужно сделать точное обратное:

this.label = label;

, которое инициализирует переменную экземпляра с аргументом.

Чтобы преодолеть первую проблему, я поставил if (label! = Null)than label.setText ("..." + lineQueue.size ())

Это не может решить проблему.Все, что это делает, - то, что это больше ничего не делает вместо того, чтобы вызвать исключение.Метка все еще пуста, и вы просто больше с ней ничего не делаете.

Тем не менее, метод paintComponent() не должен изменять состояние вашего компонента (или чего-либо еще).Это только должно покрасить компонент.Этот метод будет вызываться много раз, когда Swing решит, что компонент необходимо перекрасить.

...