Почему моя пользовательская метка Swing так долго инициализируется? - PullRequest
0 голосов
/ 03 декабря 2011

Я создал пользовательский подкласс JLabel. У меня есть один экземпляр этого, внутри одного JPanel, внутри одного JFrame. Я не переопределяю метод paintComponent(); все, что делает класс, это изменяет цвет фона, когда курсор находится над ним.

JFrame загружается немедленно, но в течение нескольких секунд JPanel остается неиспользованным. Я убедился, что это из-за моего пользовательского класса, переопределив paintComponent() и добавив некоторые отладочные операторы println().

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

Странно то, что он рисуется мгновенно, когда я использую Panel вместо JPanel или Label вместо JLabel.

Откуда исходит это отставание?

РЕДАКТИРОВАТЬ: Пример кода. На самом деле ничего не нарисовано; посмотрите на задержку сообщения консоли.

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.");
    }
}

1 Ответ

3 голосов
/ 03 декабря 2011

Мой код не лагает:

Мой 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);
   }
}

Это наводит меня на мысль, что проблема не в концепции JLabel, фон которого меняется с помощью MouseListener, а скорее у вас есть ошибка где-то в вашем коде.Куда?Кто знает, пока вы не отправите скомпилируемый исполняемый код, SSCCE , как тот, который я выложил выше.

...