2013-01-17 31 views
4

我正在编码一个扫雷克隆,现在我的问题是我的网格上的按钮的比例 - 我想让用户调整窗口的大小,但我喜欢按钮保持相同1 :1宽度/高度比率,而不是在某些情况下变成煎饼或监狱酒吧:)有没有一种方法可以轻松强制JButton始终保持方形而不给它一个固定的宽度和高度?是否有可能强制JButton总是平方?

+0

我不确定它是否可以接受你的情况,但我想你可以继承JButton并重写大小修改方法?对于子类 – nvlass

+1

@nvlass错误的原因(没必要) - 上浆是一个LayoutManager – kleopatra

+0

@kleopatra感谢校正和指出了这一点:) – nvlass

回答

6

您可以编写自定义的LayoutManagerGridLayout扩展名并设置儿童大小。

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

public class SquareButtonsTestApp extends JFrame { 

    public static void main (String[] args) { 
     new SquareButtonsTestApp(); 
    } 

    public SquareButtonsTestApp() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     getContentPane().setLayout(new MyGridLayout(10, 20)); 
     for (int i=0; i<10; i++) { 
      for (int j=0; j<20; j++) { 
       getContentPane().add(new JButton(" ")); 
      } 
     } 
     setSize(800,600); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    class MyGridLayout extends GridLayout { 
     public MyGridLayout(int rows, int cols) { 
      super(rows, cols); 
     } 
     public void layoutContainer(Container parent) { 
      synchronized (parent.getTreeLock()) { 
       Insets insets = parent.getInsets(); 
       int ncomponents = parent.getComponentCount(); 
       int nrows = getRows(); 
       int ncols = getColumns(); 
       boolean ltr = parent.getComponentOrientation().isLeftToRight(); 

       if (ncomponents == 0) { 
        return; 
       } 
       if (nrows > 0) { 
        ncols = (ncomponents + nrows - 1)/nrows; 
       } else { 
        nrows = (ncomponents + ncols - 1)/ncols; 
       } 
       // 4370316. To position components in the center we should: 
       // 1. get an amount of extra space within Container 
       // 2. incorporate half of that value to the left/top position 
       // Note that we use trancating division for widthOnComponent 
       // The reminder goes to extraWidthAvailable 
       int totalGapsWidth = (ncols - 1) * getHgap(); 
       int widthWOInsets = parent.getWidth() - (insets.left + insets.right); 
       int widthOnComponent = (widthWOInsets - totalGapsWidth)/ncols; 
       int extraWidthAvailable = (widthWOInsets - (widthOnComponent * ncols + totalGapsWidth))/2; 

       int totalGapsHeight = (nrows - 1) * getVgap(); 
       int heightWOInsets = parent.getHeight() - (insets.top + insets.bottom); 
       int heightOnComponent = (heightWOInsets - totalGapsHeight)/nrows; 
       int extraHeightAvailable = (heightWOInsets - (heightOnComponent * nrows + totalGapsHeight))/2; 

       int size=Math.min(widthOnComponent, heightOnComponent); 
       widthOnComponent=size; 
       heightOnComponent=size; 
       if (ltr) { 
        for (int c = 0, x = insets.left + extraWidthAvailable; c < ncols ; c++, x += widthOnComponent + getHgap()) { 
         for (int r = 0, y = insets.top + extraHeightAvailable; r < nrows ; r++, y += heightOnComponent + getVgap()) { 
          int i = r * ncols + c; 
          if (i < ncomponents) { 
           parent.getComponent(i).setBounds(x, y, widthOnComponent, heightOnComponent); 
          } 
         } 
        } 
       } else { 
        for (int c = 0, x = (parent.getWidth() - insets.right - widthOnComponent) - extraWidthAvailable; c < ncols ; c++, x -= widthOnComponent + getHgap()) { 
         for (int r = 0, y = insets.top + extraHeightAvailable; r < nrows ; r++, y += heightOnComponent + getVgap()) { 
          int i = r * ncols + c; 
          if (i < ncomponents) { 
           parent.getComponent(i).setBounds(x, y, widthOnComponent, heightOnComponent); 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+0

我看到的_exclusive_任务。非常感谢解决方案和代码! :) – Straightfw

相关问题