2011-12-02 3 views
0

JLabel의 맞춤 하위 클래스를 만들었습니다. 하나의 JPanel 안에 하나의 JFrame 안에 하나의 인스턴스가 있습니다. 나는 이 아니며paintComponent() 메서드를 대체합니다. 모든 클래스는 커서가 커서를 가리킬 때 배경색을 변경합니다.내 맞춤 Swing 라벨을 초기화하는 데 시간이 너무 오래 걸리는 이유는 무엇입니까?

JFrame은 즉시로드되지만 몇 초 동안 JPanel은 채워지지 않습니다. 나는 이것이 을 무시하고 디버그 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."); 
    } 
} 
+3

컴파일 가능한 실행 파일 [SSCCE] (http://sscce.org)을 게시하지 않으면 추측이 우리 것보다 낫습니다. 그러나 SWAG가 아닌 도움과 도움이 필요하다면 [SSCCE] (http://sscce.org)를 작성하고 게시하는 것이 좋습니다. 당신은 노력을 후회하지 않을 것이며, 우리도 마찬가지입니다. –

+0

@HovercraftFullOfEels 완료. – Maxpm

+0

Swing GUI 객체는 [이벤트 발송 스레드] (http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)에서 _only_ 작성 및 조작해야합니다. – trashgod

답변

3

내 코드 지연되지 않습니다

내 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); 
    } 
} 

이 문제가 배경가 변경 될 MouseListener를 통해 JLabel의 개념에없는 것을 나에게 제안 오히려 코드의 어딘가에 버그가 있습니다. 어디에? 위에 게시 한 컴파일 가능한 실행 가능 코드 인 SSCCE을 게시 할 때까지 누가 알 수 있습니다.

+0

-1, 꽤 도움이되지 않는 답변이기 때문에. SSCCE를 사용하라는 알림 역할을하지만 SSCCE를 함께 사용하는 동안 댓글을 찍은 후 그대로 말하면 15 분 후에 게시됩니다. – Maxpm

+0

@ Maxx 작동합니까? –

+0

@Andrew Mine? 예. (즉, 문제를 보여줍니다.) – Maxpm

관련 문제