2012-12-11 6 views
1

다음 코드를 보면서 왜 다음 두 문장을 바꿀 때 왜 그려지는 사각형에 변화가 보이지 않는지 말해 줄 수 있습니까? 그래서 변경하는 경우 :paintComponent 모양이 변경되지 않습니다.

g.setColor(Color.black); 
g.fillRect(l, w, 100, 100); 

프로그램은 여전히 ​​같은 크기로 나는 처음에는 노란색으로 색상을 변경하거나 크기 나 위치를 변경하려고해도 시작 같은 위치에 검은 사각형을 인쇄합니다. 나는 BlueJ 다. 다음은 나의 전체 코드입니다 :

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

public class SwingPaintDemo2 extends JComponent { 

public static boolean isWall = true; 

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


private static void createAndShowGUI() { 
    //System.out.println("Created GUI on EDT? "+ 
    //SwingUtilities.isEventDispatchThread()); 
    JFrame f = new JFrame("Swing Paint Demo"); 
    JPanel MyPanel = new JPanel(); 
    MyPanel.setBorder(BorderFactory.createEmptyBorder(1000, 1000, 1000, 1000)); 
    MyPanel.setPreferredSize(new Dimension(250, 200)); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.add(new MyPanel()); 
    f.pack(); 
    f.setVisible(true); 

} 


public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    int l = 10; 
    int w = 10; 

    g.setColor(Color.black); 
    g.fillRect(l, w, 100, 100); 

     } 

} 

어떤 조언을 주시면 감사하겠습니다.

답변

5

SSCCE가 MyPanel 클래스 인 경우 컴파일하지 않거나 new SwingPaintDemo2()을 의미합니까? 당신이 new SwingPaintDemo2()을 의미 가정에

:

코드는 일을 잘 수행하지만 JFrame는 아주 작은 크기입니다 : 당신이 그것을 그 구성 요소의 크기와 전혀 제공하지 말아 때문에

enter image description here

크기가있어 컴포넌트가 추가되지 않았으므로 JComponent을 올바른 크기로 반환해야합니다. 따라서 pack()을 호출하면 의 크기가 올바르게 지정됩니다.

,515,

해결

오버라이드 JComponentgetPreferredSize()의 모든 도면에 적합한 폭과 높이를 반환한다. 하지만

제안 :

enter image description here

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

public class SwingPaintDemo2 extends JPanel { 

    public static boolean isWall = true; 

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

    private static void createAndShowGUI() { 
     //System.out.println("Created GUI on EDT? "+ 
     //SwingUtilities.isEventDispatchThread()); 
     JFrame f = new JFrame("Swing Paint Demo"); 
     JPanel MyPanel = new JPanel(); 
     MyPanel.setBorder(BorderFactory.createEmptyBorder(1000, 1000, 1000, 1000)); 
     MyPanel.setPreferredSize(new Dimension(250, 200)); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new SwingPaintDemo2()); 
     f.pack(); 
     f.setVisible(true); 

    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     int l = 10; 
     int w = 10; 

     g.setColor(Color.black); 
     g.fillRect(l, w, 100, 100); 

    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(150, 150); 
    } 
} 
+1

:

  • 망가 오히려 여기

JPanel (위 수정하여 코드 구현) 예입니다 확장 JComponent를 확장 대단히 감사합니다. 선생님, 그랬어요. 재미있는 점은 내가 처음 게시 한 코드가 컴파일 오류를주지 않는다는 것입니다. 클래스를 옮겨 다니기 때문에 클래스가 손상되었을 수 있습니다. 하지만 같은 코드로 새로운 클래스를 만들 때 컴파일 오류가 발생했습니다. 그러나 관계없이, 나를 도울 시간을내어 주셔서 감사합니다. 내가 너를 upvote 할 수 있으면 나는 (나의 명망에 아직도 일해 - 뉴비) 있을텐데. – user1894469

+0

@ user1894469 atleast its working now. 그리고 그 문제가 아니라 그 게시물의 옆에있는 진드기를 확인하는 것을 잊지 마라. –

+1

나는 그것에 관해 당신에게 묻기 직전이었다 : 다시 한번. – user1894469

관련 문제