2017-03-22 9 views
0

최근에 JComponents로 GUI 시스템을 작성하기 시작했습니다. 모든 것이 작동하지만 JFrame의 아래쪽과 오른쪽면은 칠해지지 않고 흰색을 유지합니다. 실행 GUI의Java JComponents가 JFrame의 가장자리 근처에서 자르고 있습니다.

스크린 샷 : 당신은 'drknBtn'올바르게 표시를 볼 수있는 스크린 샷에서

https://i.stack.imgur.com/wVGzr.png

; 이것은 사진을 찍기 전에 마우스로 마우스를 맴돌 았기 때문입니다. 버튼 위로 마우스를 가져 가면 새로 고침되어 정상적으로 표시됩니다. 이 때문에, 나는 그들을 보유한 패널을 가정 할 것이고, 'bottomPnl'은 그 공백을 덮고 있지만 그 패널 배경은 바닥 부분에 보이지 않는다. 이 문제를 일으킬 수있는 아이디어가 있습니까? pack()을 호출하기 전에 'bottomPnl.repaint()'를 직접 호출했지만 변경은하지 않았습니다.

내 코드는 다음과 같습니다. 주 : 각 JComponent마다, 그 컴퍼넌트를 확장하는 클래스를 작성했습니다. 이 방법으로 각 클래스를 개별적으로 수행하는 대신 이러한 클래스의 생성자에서 구성 요소에 대한 기본값을 설정할 수 있습니다. 프레임 및 패널의 관련 속성을 나열합니다. 프레임 : setSize (width, height); setResizeable (false); setLocationRelativeTo (null); 패널 : setLayoutManager (생성자에서); setPreferredSize (새로운 크기 (폭, 높이)); setMinimumSize 및 setMaximumSize와 같습니다.

public Display(String title, int w, int h){ 

    width=w; 
    height=h; 
    frame = new FrameUI(title,w,h); 

    //parent panel 
    parentPnl= new PanelUI(width,height, new FlowLayout(FlowLayout.CENTER,0,0)); 
    parentPnl.setBackground(new Color(100,175,175)); 

    //top panel 
    topPnl= new PanelUI(width,(int)(height*.15), new FlowLayout(FlowLayout.CENTER,0,0)); 
    topPnl.setBackground(new Color(100,175,175)); 

    chooseFileBtn = new ButtonUI("Browse...",topPnl.getWidth()/4,(int)(topPnl.getHeight()*.9),new ActionListener(){ 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      fc = new FileChooserUI(); 
      fc.setFileFilter(new FileNameExtensionFilter("Image files", ImageIO.getReaderFileSuffixes())); 
      int result = fc.showOpenDialog(null); 
      try { 
       if (result == JFileChooser.APPROVE_OPTION) { 
        picture.setIcon(new ImageIcon(ImageIO.read(fc.getSelectedFile()).getScaledInstance(picture.getWidth(),picture.getHeight(), 0))); 
       } 
      } catch (Exception iOException) { 
      } 
     } 

    }); 

    //middle panel 
    midPnl= new PanelUI((int)(width*.85),(int)(height*.7), new FlowLayout(FlowLayout.CENTER,0,0)); 
    midPnl.setBackground(new Color(75,125,125)); 

    picture = new LabelUI("",midPnl.getWidth(),midPnl.getHeight()); 
    picture.setBackground(new Color(75,125,125)); 
    picture.setVisible(true); 
    picture.setOpaque(true); 
    picture.setIcon(null); 

    //bottom panel 
    bottomPnl= new PanelUI(width,(int)(height*.15), new FlowLayout(FlowLayout.CENTER,0,0)); 
    bottomPnl.setBackground(new Color(100,175,175)); 

    ltnBtn = new ButtonUI("Lighten Picture",bottomPnl.getWidth()/3,(int)(bottomPnl.getHeight()*.9),new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent e) { 

     } 
    }); 
    ltnBtn.setBackground(Color.LIGHT_GRAY); 
    ltnBtn.setForeground(Color.BLACK); 

    drknBtn = new ButtonUI("Darken Picture",bottomPnl.getWidth()/3,(int)(bottomPnl.getHeight()*.9),new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent e) { 

     } 
    }); 
    drknBtn.setBackground(Color.DARK_GRAY); 
    drknBtn.setForeground(Color.WHITE); 

    //add UI Objects 
    topPnl.add(chooseFileBtn); 

    midPnl.add(picture); 

    bottomPnl.add(ltnBtn); 
    bottomPnl.add(drknBtn); 

    parentPnl.add(topPnl); 
    parentPnl.add(midPnl); 
    parentPnl.add(bottomPnl); 

    Container contentPane = frame.getContentPane();  
    contentPane.add(parentPnl); 

    frame.pack(); 
    frame.setVisible(true); 
} 

} 수동으로 패널의 크기에 따라서 패널에 추가 한 구성 요소의 크기를 제어하려고하는 것처럼

+1

처음에는'null' 레이아웃을 사용하고 있습니다. 내 생각에'paint' 나'paintComponent'를 오버라이드하고'super' 메소드를 호출하지 못했습니다. – MadProgrammer

답변

1
topPnl= new PanelUI(width,(int)(height*.15), new FlowLayout(FlowLayout.CENTER,0,0)); 

나에게 보인다. 계산이 잘못되어 일부 구성 요소가 제대로 표시되지 않습니다. 또한 모든 크기는 생성시 고정되며 프레임 크기가 변경되면 조정되지 않습니다.

수동으로 크기를 제어하지 마십시오. 레이아웃 관리자를 사용하여 구성 요소의 속성을 기반으로 구성 요소의 크기를 동적으로 조정합니다.

버튼이 프레임에서 사용할 수있는 공간의 15 %가되는 이유가 무엇인지 알 수 없습니다.

당신은 버튼을 사용하여 버튼의 텍스트 주위에 여분의 빈 공간을 설정할 수 있습니다 정상보다 크게하려면 다음

button.setMargin(new Insets(50, 50, 50, 50)); 

그럼 그냥 FlowLayout의를 사용하여 패널에 버튼을 추가하자 레이아웃 관리자가 그 일을합니다.

는 프레임의 기본 레이아웃은 BorderLayout, 그래서 당신은 그 사용하여 프레임에 "topPnl"를 추가 할 수 있습니다

frame.add(topPnl, BorderLayout.PAGE_START); 

다른 패널은 다음 사용하여 추가 할 수 있습니다

frame.add(midPnl, BorderLayout.CENTER); 
frame.add(bottomPnl, BorderLayout.PAGE_END); 

이것은 Swing이 레이아웃 관리자와 함께 사용되는 방법입니다.

자세한 내용과 예제는 How to Use BorderLayout의 스윙 튜토리얼 섹션을 참조하십시오.

요점은 setMargin(...)과 같은 사용 방법으로 구성 요소의 기본 크기가 무엇인지에 대한 힌트를 제공하는 것입니다.

0

FrameUI 생성자에서 'setSize()'메서드를 제거하여 문제를 해결했습니다. 그러나, 나는 아직도 내가 원하는 비율을 유지하면서 말한대로 동적으로 패널의 크기를 조절할 수있는 방법을 이해하지 못한다. 포인터에 대한 @camickr 감사합니다, 내 원래 문제가 해결되었습니다. 레이아웃 관리자 등에 대한 더 많은 javadocs와 튜토리얼을 살펴볼 것이다.