为什么不重新粉刷JLabel?

时间:2019-06-02 11:09:15

标签: java swing

我有一个项目,其中有几个组成部分。问题在于,当执行repaint()命令时,不会绘制JLabel。我想说明的是,绘制图形或其他任何东西都不是问题。显然发生的是在repaint()中,当我强制JLabel重新绘制时,除非您更改JLabel链,否则它们不会绘制。

JLabel的初始化并定义其参数:

puntuacionL.setFont(new Font("Marker Felt", Font.PLAIN, 20));
                puntuacionL.setBounds(710, 212, 150, 30);
                puntuacionL.setOpaque(true);
                puntuacionL.setBackground(Color.CYAN);
                puntuacionL.setForeground(Color.white);
                puntuacionL.setVisible(true);


                comoJugar.setFont(new Font("Marker Felt", Font.PLAIN, 20));
                comoJugar.setBounds(710, 245, 150, 30);
                comoJugar.setOpaque(true);
                comoJugar.setBackground(Color.CYAN);
                comoJugar.setForeground(Color.white);
                comoJugar.setVisible(true);

我尝试了两种选择来强制重新定义JLabel:

1。mietiqueta.setText("whatever")。 在此选项中,我要做的是在repaint ()标签字符串中重新定义。

2。 重新绘制组件:mietiqueta.paintComponent(g)

我会上载结果的记录,这很有用,但是您至少需要10个信誉点

Repaint()方法:

 @Override
            public void update(Graphics g){
                paint(g);
            }
            @Override
            public void paint(Graphics g) {
                if (offGraphics == null)  {

                offImage = createImage(900,900);
                offGraphics = (Graphics2D) offImage.getGraphics();
                }

                puntuacionL.setText("  Puntuación: "+Integer.toString(puntuacion));
                comoJugar.setText("  Pulsa H para ayuda");
                Graphics2D g2d = (Graphics2D) g;
                puntoIncialBala();
                Image fondo = new ImageIcon(getClass().getResource("/imagenes/fondo.jpeg")).getImage();
                Image img2 = new ImageIcon(getClass().getResource("/imagenes/fondoMapa.png")).getImage();
                offGraphics.drawImage(img2, 30, 30, this);
                int posVidaX = 710;
                offGraphics.setColor(Color.CYAN);
                offGraphics.fillRoundRect(710, 30, 150, 100, 10, 10);

                for (int k = 0; k < vidas; k++) {
                    Image vida = new ImageIcon(getClass().getResource("/imagenes/vida.png")).getImage();
                    offGraphics.drawImage(vida, posVidaX, 50, this);
                    posVidaX = posVidaX + vida.getWidth(this);
                }
                timeLabel.paintComponents(g);
                for (int k = 0; k < arrayCasilla.size(); k++) {
                    offGraphics.drawImage(arrayCasilla.get(k).getImg(), (int) arrayCasilla.get(k).getY(), (int) arrayCasilla.get(k).getX(), this);
                }
                Image img = new ImageIcon(getClass().getResource("/imagenes/BalaCanon.png")).getImage();

                if (flagBala == true) {
                    //puntuacionL.setText("  Puntuación: "+Integer.toString(puntuacion));
                    if (pintarCasilla == true) {
                        puntuacionL.setText("  Puntuación: "+Integer.toString(puntuacion));
                        comoJugar.setText("  Pulsa H para ayuda");
                        queHayCasilla();
                        if (casilla[x][y].getTipo().compareTo("cangrejo") == 0) {
                            puntuacion = puntuacion + 1;
                        } else if (casilla[x][y].getTipo().compareTo("ron") == 0) {
                            posVidaX = 710;
                            //puntuacion = puntuacion + 1;
                            vidas--;
                            if (vidas == 0) {
                                timer.stop();
                                etiquetaFin.setVisible(true);
                                finalizar.setVisible(true);
                                contenedorFinal.setVisible(true);
                            }
                            offGraphics.setColor(Color.CYAN);
                            offGraphics.fillRoundRect(710, 30, 150, 100, 10, 10);
                            for (int k = 0; k < vidas; k++) {
                                Image vida = new ImageIcon(getClass().getResource("/imagenes/vida.png")).getImage();
                                offGraphics.drawImage(vida, posVidaX, 50, this);
                                posVidaX = posVidaX + vida.getWidth(this);
                            }

                        } else if (casilla[x][y].getTipo().compareTo("cofre") == 0) {
                            puntuacion = puntuacion + 2;

                        }
                        if (posY[y] < 441) {
                            arrayCasilla.add(casilla[x][y]);
                        }
                        for (int k = 0; k < arrayCasilla.size(); k++) {
                            if (posY[y] < 441) {
                                offGraphics.drawImage(arrayCasilla.get(k).getImg(), (int) arrayCasilla.get(k).getY(), (int) arrayCasilla.get(k).getX(), this);
                            }
                        }
                        animacion.stop();
                        if (!animacion.isRunning()) {
                            i = 0;
                        }
                        pintarCasilla = false;
                        flagBala = false;
                    } else {
                        offGraphics.drawImage(img, (int) x1, (int) x2, this);
                    }

                }
                try {
                    imgB = ImageIO.read(getClass().getResource("/imagenes/canon.png"));
                } catch (IOException ex) {
                    Logger.getLogger(PanelCanon.class.getName()).log(Level.SEVERE, null, ex);
                }
                offGraphics.setColor(Color.gray);
                offGraphics.fillRect(30, 720, 646, 122);

                AffineTransform tx = AffineTransform.getRotateInstance(Math.PI / 2 - anguloRotacion, imgB.getWidth(this) / 2, imgB.getHeight(this) / 2);
                AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
                tx.rotate(Math.PI / 2 - anguloRotacion);
                System.out.println(tx.toString());
                offGraphics.drawImage(op.filter(imgB, null), 360, 740, null);
                g2d.drawImage(offImage, 0, 0, this);

                puntuacionL.setText("  Puntuación: "+Integer.toString(puntuacion));
                comoJugar.setText("  Pulsa H para ayuda");
                System.out.println("Posicion bala x" + x1);
                System.out.println("Posicion bala y: " + x2);

            }

我有一个可能以某种方式发生干扰的计时器,该计时器负责控制倒计时。

计时器代码:

     timer = new Timer(1000, new ActionListener() {
     @Override
       public void actionPerformed(ActionEvent e) {

         if (seconds == 0 && minutes == 0) {
             timer.stop();
             etiquetaFin.setVisible(true);
             finalizar.setVisible(true);
             contenedorFinal.setVisible(true);
         } else if (seconds > 0) {
             seconds--;
         } else if (minutes > 0) {
             minutes--;
             seconds = 59;
         }
             revalidate();
     //puntuacionL.paintImmediately(710, 212, 150, 30);
     //puntuacionL.setText("  Puntuación: "+Integer.toString(puntuacion));
     //comoJugar.setText("  Pulsa H para ayuda");
     timeLabel.setText("   "+timeFormatter.format(minutes) + ":"  + timeFormatter.format(seconds));

   }
});
timer.start();

这就是魔术发生的地方,我已经一无所知了。如您所见,在事件内部我评论了以下几行:

puntuacionL.setText("  Puntuación: "+Integer.toString(puntuacion));
comoJugar.setText("  Pulsa H para ayuda");

如果在计时器事件中我重新定义了标签,并且使用了与paint ()不同的字符串,则对它们进行了绘制,但是对我来说当然不起作用,因为我希望不修改字符串。

我没有把整个类都放进去,因为它很大,但是如果有人仍然需要完整的上下文,很乐意编辑问题并放所有代码。

1 个答案:

答案 0 :(得分:0)

我真的不确定您要做什么,但是您似乎不了解使用组件和自定义绘画的基本概念。

这是我看到的问题:

  1. 不要覆盖update(...)。没有理由这样做。

  2. 不要覆盖paint()。通过重写组件的paintComponent(...)方法来完成自定义绘制。

  3. 不使用绘画方法读取图像。当您专门在组件上调用repaint()或当Swing确定需要绘制组件时,将重新绘制组件。应该在类的构造函数中读取图像,以使绘制代码尽可能高效。

  4. 不要在绘画方法中更改类的属性。这尤其适用于更改外部组件(如JLabel)的文本。

  5. 不要在绘画方法中的任何组件上调用paintComponents()。

  6. 在绘画方法中不访问计时器。同样,绘制代码的全部目的是绘制组件的当前状态,而不是更改状态。计时器的用途是在每次触发时更改组件的状态。因此,应该由Timer逻辑更改JLabel上的文本。然后,JLabel将自动重新绘制自身。请参见:Program freezes during Thread.sleep() and with Timer,以获取将JLabel与计时器保持不同步的基本示例。

请阅读Custom Painting的Swing教程中的部分,以获取有关绘画基础的更多信息。