2017-03-22 88 views
0

我最近開始使用JComponents創建GUI系統。一切正常,但JFrame的底部和右側不會被塗刷並保持白色。運行GUI的Java JComponents在JFrame邊緣被切斷

截圖:

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

在你可以看到 'drknBtn' 正確顯示屏幕截圖;這是因爲我在拍照之前用鼠標盤旋了它。懸停在按鈕上刷新它們,它們顯示爲正常。由於這個原因,我認爲面板可以容納它們,'bottomPnl'覆蓋了這個空白區域,但是面板背景並沒有顯示在底部。任何想法可能會導致這種情況?我在調用pack()之前直接調用'bottomPnl.repaint()',但沒有改變。

我的代碼如下。 注意:對於每個JComponent,我創建了一個擴展該組件的類。通過這種方式,我可以爲這些類的構造函數中的組件設置默認值,而不是單獨執行每個類的構造函數。我將列出框架和麪板的相關屬性。 框架:setSize(width,height); setResizeable(假); setLocationRelativeTo(NULL); Panel:setLayoutManager(來自構造函數); setPreferredSize(new Dimension(width,height)); 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設計用於佈局管理器的方式。

閱讀Swing教程How to Use BorderLayout中的部分以獲取更多信息和示例。

重點是使用方法,如setMargin(...),以提供組件的首選大小應該是什麼。

0

我通過刪除FrameUI構造函數中的setSize()方法解決了這個問題。但是,我仍然不明白如何按照您所說的動態調整面板大小,同時仍然保持我想要的比例。謝謝@camickr的指針,我原來的問題是固定的。我將研究佈局管理器等的更多javadoc和教程。