4
我正在编码一个扫雷克隆,现在我的问题是我的网格上的按钮的比例 - 我想让用户调整窗口的大小,但我喜欢按钮保持相同1 :1宽度/高度比率,而不是在某些情况下变成煎饼或监狱酒吧:)有没有一种方法可以轻松强制JButton始终保持方形而不给它一个固定的宽度和高度?是否有可能强制JButton总是平方?
我正在编码一个扫雷克隆,现在我的问题是我的网格上的按钮的比例 - 我想让用户调整窗口的大小,但我喜欢按钮保持相同1 :1宽度/高度比率,而不是在某些情况下变成煎饼或监狱酒吧:)有没有一种方法可以轻松强制JButton始终保持方形而不给它一个固定的宽度和高度?是否有可能强制JButton总是平方?
您可以编写自定义的LayoutManager
GridLayout
扩展名并设置儿童大小。
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);
}
}
}
}
}
}
}
}
我看到的_exclusive_任务。非常感谢解决方案和代码! :) – Straightfw
我不确定它是否可以接受你的情况,但我想你可以继承JButton并重写大小修改方法?对于子类 – nvlass
@nvlass错误的原因(没必要) - 上浆是一个LayoutManager – kleopatra
@kleopatra感谢校正和指出了这一点:) – nvlass