2014-06-19 2 views
2

나는 시간이 지남에 따라 커지는 컬러 막대를 그리려고합니다. 그것은 기본 layoutmanager를 사용할 때 작동하지만, GridBagLayout을 사용하여이를 구현하려고 시도하면 작동하지 않습니다. 문제가 무엇인지 조사하기 위해 테스트 목적으로 테스트 프로젝트를 작성했습니다. graphics2D 객체와 별도로 몇 가지 버튼을 추가 했으므로 실제 프로젝트 인 것처럼 보입니다. 그러나 며칠 후, 나는 단서가 없다는 것을 인정해야한다. 무엇이 잘못 될지. 누군가가 나를 도울 수 있기를 바랍니다!GridBagLayout을 사용하여 프레임의 Grahpics2D 객체 그리기

사전에 코드에 사용 된 일부 단어로 혼동하지 마십시오. 내 모국어는 영어가 아닙니다.

import java.awt.*; 
import javax.swing.*; 
import java.util.TimerTask; 
import java.util.Timer; 


public class FarbBalkenTest extends JPanel { 

static Timer timer = new Timer(); 
static TimerTask task ; 
static int time; 

public static void main(String[] args) { 

    FarbBalkenTest fbt = new FarbBalkenTest(); 
    fbt.init(); 


} 

public static void addComponent(Container cont, GridBagLayout gbl, Component c, int x, int y, int width, int height, double weightx, double weighty){ 

    GridBagConstraints gbc = new GridBagConstraints(); 
    gbc.fill = GridBagConstraints.BOTH; 
    gbc.gridx=x; 
    gbc.gridy=y; 
    gbc.gridwidth=width;gbc.gridheight=height; 
    gbc.weightx=weightx;gbc.weighty=weighty; 
    gbl.setConstraints(c,gbc); 
    cont.add(c); 

} 


public void init(){ 

    final JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().setBackground(new Color(230,230,230)); 
    Container c = frame.getContentPane(); 
    GridBagLayout gbl = new GridBagLayout(); 
    c.setLayout(gbl); 
    ZeichenTest z_test = new ZeichenTest(); 

    addComponent(c,gbl, new Button("top left"), 0,0,1,1,1.0,1.0); 
    addComponent(c,gbl, new Button("top right"), 2,0, 1,1,1.0,1.0); 
    addComponent(c, gbl,z_test, 1,1,1,1,1.0,1.0); 
    addComponent(c,gbl, new Button("down left"),0,2,1,1,1.0,1.0); 
    addComponent(c,gbl, new Button("down right"),2,2,1,1,1.0,1.0); 
    frame.setSize(500,500); 
    frame.setVisible(true); 


    task = new TimerTask(){ 
     public void run(){ 
      frame.repaint(); 
      time+= 20; 
      System.out.println(time); 
     } 
    }; 
    timer.scheduleAtFixedRate(task, 0, 1000); 



} 
public class ZeichenTest extends JComponent { 

    public void paintComponent (Graphics g){ 

      Graphics2D g2d = (Graphics2D) g; 

      Color startgreen = new Color(50,205,50); 

      Color endred = new Color (255, 97, 3); 

      GradientPaint startend = new GradientPaint(0,25 , startgreen, 400, 25 , endred); 

      g2d.setPaint (startend); 

      g2d.fillRect(50, 200 , time, 50); 
     } 


    } 

} 
+0

문제는 무엇인가에 main 코드를 포장? –

+0

문제는 내가 끌고 싶었던 바를 볼 수 없었다는 것입니다. 하지만 문제가 해결되면서 버튼을 오버레이하지 않으므로 직사각형의 위치를 ​​(0,0)으로 변경해야했습니다. – CarlCosinus

답변

5

는 "내가 기본의 레이아웃을 사용할 때 작동하지만 메신저는 늘 GridBagLayout에와이를 구현하려고 할 때."

GBL은 바람직한 크기를 기준으로합니다. ZeichenTest에 없습니다. getPreferredSize()을 무시하여 명시 적으로 설정해야합니다.

public class ZeichenTest extends JComponent { 
    ... 
    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(... , ...); 
    } 
} 

또한주의, 구성 요소의 적절한 사이즈를 설정 한 후, 바로 프레임에 pack() 전화 (BorderLayout를 선호 크기를 존중하지 않고,에 맞게 당신 패널을 늘릴 것이다 JFrame의의 기본 레이아웃) setSize() 대신. pack()은 원하는 크기에 따라 모든 것을 "적합"합니다. 실제로 setSize() 대신 pack()을 호출하여 현재 구성 요소에 기본 크기가 없는지 테스트 할 수 있으며 시작시 프레임 축소가 표시됩니다. 그러나 구성 요소와 호출 팩의 getPreferredSize()을 무시하면 프레임이 새로운 기본 크기에 맞는 크기가됩니다.


기타주의 사항 :

  • 사용 java.swing.Timer 대신 TimerTask. EDT에서 다시 페인트해야하며 Swing Timer가 이것을 처리합니다. 난 당신이 repaint()ZeichenTest하지 프레임의 인스턴스를 의미 생각보다 How to Use Swing Timer

  • 에서 참조하십시오. 그것은 차이를 만든다. 불쾌한 페인트 atrifacts

    @Override 
    protected void paintComponent(Graphics g) { 
        super.paintComponent(g); 
    } 
    
  • 스윙 애플 리케이션은 항상 이벤트 발송 쓰레드 (EDT)에서 실행해야 두지하기로

  • 항상 당신의 paintComponent 방법에 super.paintComponent를 호출합니다. Initial Threads을 참조하십시오. 기본적으로,이 경우, 단지 SwingUtilities.invokeLater(...)

    public static void main(String[] args) { 
        SwingUtilities.invokeLater(new Runnable(){ 
         public void run() { 
          FarbBalkenTest fbt = new FarbBalkenTest(); 
          fbt.init(); 
         } 
        }); 
    } 
    
+0

Thx 많이, 친구! 비록 내가 술집에 대한 내 진짜 프로젝트의 생성자에서 setPreferredSize를 사용했습니다. 나는 이것을 서둘러 썼다. 그래서 나는 몇 가지 것을 잊었다. 추가 조언을 주셔서 감사합니다. 나는 오늘 집에 올 때 그들을 통해 볼 것입니다. 내 문제에 대한 해결책을 찾을 수 있었고 매우 간단했습니다. 사각형을 (0,0)에 그려야했습니다. 그렇지 않으면 단추가 그립니다. 나는 어리석은 느낌이 들었다. 왜냐하면 그 해결책은 너무도 명백했다. 그러나 어쨌든, 다시 한번 감사드립니다! – CarlCosinus

관련 문제