2013-04-02 24 views
0

我正在嘗試創建非常簡單的類。目標是在滾動條不可見時創建最大尺寸的按鈕。我的代碼不起作用。即使滾動條不可見,條件pane.getVerticalScrollBar()。isVisible()也會返回true。我想知道爲什麼以及如何修復它?當滾動條不可見時創建最大尺寸的按鈕

import java.awt.BorderLayout; 
import java.io.UnsupportedEncodingException; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class Main { 

public static void main(String[] args) throws UnsupportedEncodingException { 
    JFrame frame = new JFrame(); 
    final JButton button = new JButton("Hello"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JPanel panel = new JPanel(new BorderLayout()); 
    final JPanel buttons = new JPanel(); 
    buttons.add(button); 
    buttons.revalidate(); 
    final JScrollPane pane = new JScrollPane(buttons); 
    pane.getViewport().addChangeListener(new ChangeListener() { 

     @Override 
     public void stateChanged(ChangeEvent e) { 
      System.out.println("*******************************************************************"); 
      System.out.println("Vertical visible? " + pane.getVerticalScrollBar().isVisible()); 
      System.out.println("Horizontal visible? " + pane.getHorizontalScrollBar().isVisible()); 
      if (!pane.getVerticalScrollBar().isVisible() && !pane.getHorizontalScrollBar().isVisible()) { 
       button.setSize(button.getWidth() + 1, button.getHeight() + 1); 
       buttons.revalidate(); 
       pane.revalidate(); 
      } else { 
       button.setSize(button.getWidth() - 1, button.getHeight() - 1); 
       buttons.revalidate(); 
       pane.revalidate(); 
       pane.getViewport().removeChangeListener(this); 
      } 
     } 
    }); 
    panel.add(pane); 
    frame.setContentPane(panel); 
    frame.setSize(300, 200); 
    frame.setVisible(true); 
} 
} 

回答

2

請勿使用設定的尺寸方法。

如果您希望按鈕佔用全部可用空間然後使用:

frame.add(button); // height/width will be max 
frame.add(button, BorderLayout.SOUTH); // only width will be max 

讓佈局管理器爲你做的工作。

編輯:

我有另一類規模IMG的標籤,我想找到最好的價值尺度,使其maximalized儘可能

創建一個自定義面板,動態以面板的大小繪製圖像。然後它會根據可用空間自動縮放。

查看Background Panel作爲這種方法的一個例子。

+0

我用按鈕創建了這個例子來簡化我的問題。實際上,而不是按鈕我想在窗格中使用label.setIcon(新ImageIcon(img))。 – cernover

+0

我還有另一個類,它可以在標籤中縮放img,我希望找到最佳的縮放比例值,以儘可能地最大化它,因爲它可以與滾動條同時不可見。 – cernover

+0

我不知道圖像的大小,所以我把它縮小到最小尺寸,然後我測試滾動條是否可見,如果沒有,我將img放大並再次測試,直到出現一個滾動條。然後,當滾動條不可見時,我將img設置爲之前的大小。 – cernover