Frage

Ich habe eine benutzerdefinierte Unterklasse von gemacht JLabel. Ich habe eine einzelne Instanz davon in einer einzigen JPanel, in einer einzigen JFrame. Ich tue nicht überschreiben die paintComponent() Methode; Alles, was die Klasse tut, ist die Hintergrundfarbe, wenn der Cursor darüber schwebt.

Das JFrame Lasten sofort, aber für einige Sekunden die JPanel bleibt ungelegt. Ich habe verifiziert, dass dies an meiner benutzerdefinierten Klasse durch Überschreiben liegt paintComponent() und ein Debug hinzufügen println() Aussagen.

public void paintComponent(Graphics context)
{
    System.out.println("Painting...");
    super.paintComponent(context);
    System.out.println("Painted.");
}

Das Seltsame ist, es wird sofort gezeichnet, wenn ich benutze Panel Anstatt von JPanel oder Label Anstatt von JLabel.

Woher kommt diese Verzögerung?

Bearbeiten: Ein Beispielcode. Nichts ist tatsächlich gezeichnet; Schauen Sie sich die Verzögerung der Konsolennachricht an.

import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.awt.GridLayout;
import javax.swing.JPanel;

public class Example extends JLabel implements MouseListener
{
    private static final long serialVersionUID = 0;

    public Example()
    {
        super();
        System.out.println("Constructed.");
    }

    public void paintComponent(java.awt.Graphics g)
    {
        System.out.println("Painting component...");
        super.paintComponent(g);
        System.out.println("Painted.");
    }

    public void mouseEntered(MouseEvent event) { }
    public void mouseExited(MouseEvent event) { }
    public void mouseReleased(MouseEvent event) { }
    public void mousePressed(MouseEvent event) { }
    public void mouseClicked(MouseEvent event) { }

    public static void main(final String[] arguments)
    {
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(1, 1));
        panel.add(new Example());

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(panel);
        frame.setVisible(true);
        System.out.println("Set visible.");
    }
}
War es hilfreich?

Lösung

Mein Code bleibt nicht zurück:

Meine SSCCE:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.*;

@SuppressWarnings("serial")
public class LabelTest extends JPanel {
   public LabelTest() {
      add(new MyLabel("Fubar!"));
   }

   private static void createAndShowGui() {
      LabelTest mainPanel = new LabelTest();

      JFrame frame = new JFrame("LabelTest");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

@SuppressWarnings("serial")
class MyLabel extends JLabel {
   private static final Color BACKGROUND_DEFAULT = new Color(200, 200, 255);
   private static final Color BACKGROUND_MOUSEOVER = new Color(255, 200, 200);
   private static final int PREF_W = 200;
   private static final int PREF_H = 100;

   public MyLabel(String text) {
      super(text, SwingConstants.CENTER);
      setOpaque(true);
      setBackground(BACKGROUND_DEFAULT);
      addMouseListener(new MouseAdapter() {

         @Override
         public void mouseEntered(MouseEvent arg0) {
            setBackground(BACKGROUND_MOUSEOVER);
         }

         @Override
         public void mouseExited(MouseEvent e) {
            setBackground(BACKGROUND_DEFAULT);
         }

      });
   }

   @Override
   public Dimension getPreferredSize() {
      int width = Math.max(super.getPreferredSize().width, PREF_W);
      int height = Math.max(super.getPreferredSize().height, PREF_H);
      return new Dimension(width, height);
   }
}

Dies deutet mir darauf hin, dass das Problem nicht im Konzept eines JLABEL liegt, dessen Hintergrund über einen Mouselistener ändert, sondern dass Sie irgendwo in Ihrem Code einen Fehler haben. Wo? Wer weiß, bis Sie kompilierbarer Runnable -Code veröffentlichen, ein SSCCE, wie der, den ich oben gepostet habe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top