Java 通过使用缓冲器居中来保持部件尺寸
我正在为战术建立一个小型棋盘,这将是一个有趣的方式来思考兴趣(编程和国际象棋) 我目前面临的一个问题,虽然已经解决,但仍然是保持电路板纵横比为1:1Java 通过使用缓冲器居中来保持部件尺寸,java,swing,jpanel,componentlistener,Java,Swing,Jpanel,Componentlistener,我正在为战术建立一个小型棋盘,这将是一个有趣的方式来思考兴趣(编程和国际象棋) 我目前面临的一个问题,虽然已经解决,但仍然是保持电路板纵横比为1:1 板扩展了JPanel。由于约束的问题,我选择保持电路板的物理大小,而不是渲染大小。在实际使用时,这将导致更快的操作 我希望它看起来像什么,并且已经实现了: 虽然我实现这一点的方式看起来很粗糙,但按照双向飞碟标准(谢谢你基于双向飞碟)的代码很差 如上所示,我手动设置了电路板的大小和位置。就连我也详尽地说,这是永远不应该做的,但我找不到工作的解决方
板
扩展了JPanel
。由于约束的问题,我选择保持电路板的物理大小,而不是渲染大小。在实际使用时,这将导致更快的操作
我希望它看起来像什么,并且已经实现了:
虽然我实现这一点的方式看起来很粗糙,但按照双向飞碟标准(谢谢你基于双向飞碟)的代码很差
如上所示,我手动设置了电路板的大小和位置。就连我也详尽地说,这是永远不应该做的,但我找不到工作的解决方案。我需要的董事会,以填补最大可能的面积,但保持高宽比
如果您能提供任何建议(代码或概念),我非常感谢您花时间帮助我解决这个精英难题 虽然不是一个完整的解决方案,但下面的示例缩放电路板以填充封闭容器的最小尺寸。调整框架大小以查看效果 附录:理想的解决方案是,您可以访问封闭容器的几何图形,并且
setBounds()
可以保持所需的1:1纵横比。GridLayout
的变化可能是合适的。可以直接计算栅格坐标,如图所示
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
/**
*@见https://stackoverflow.com/a/19531648/230513
*/
公开课考试{
私有静态类MyPanel扩展了JPanel{
专用静态最终整数N=8;
专用静态最终整块=48;
@凌驾
公共维度getPreferredSize(){
返回新维度(N*分幅,N*分幅);
}
@凌驾
受保护组件(图形g){
超级组件(g);
g、 setColor(颜色为灰色);
int w=this.getWidth();
int h=this.getHeight();
int tile=数学最小值(w,h)/N;
对于(int行=0;行
如果你的板角被定义为两种宽度|高度的最小值,那么我看不出你的代码有任何问题。@two虽然可以不使用布局管理器,但如果可能的话,你应该使用布局管理器。我所做的不是使用布局管理器。虽然我使用了边框布局,但通过使用null
布局,这些方法也可以获得相同的结果。因此,这是一个糟糕的代码。谢谢你的建议。不过,正如OP中所述,我希望避免这种类型的解决方案。当涉及到事件时,它的效率较低,并且更难维护。谢谢你!附言:黑正方形在左下角。哦,谢谢你的更正。我能看出坐标的问题。有关固定大小,请参见此和。举出的例子遍及全世界;然后,问题变成控制属于主机操作系统的帧。
public Frame() {
final JFrame frame = new JFrame("Chess");
final JPanel content = new JPanel(new BorderLayout());
final JPanel boardConfine = new JPanel(new BorderLayout());
final Board board = new Board();
boardConfine.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
int min = Math.min(boardConfine.getWidth(), boardConfine.getHeight());
int xBuffer = (boardConfine.getWidth() - min) / 2;
int yBuffer = (boardConfine.getHeight() - min) / 2;
board.setBounds(xBuffer, yBuffer, min, min);
}
});
boardConfine.add(board, BorderLayout.CENTER);
content.setBackground(new Color(205, 205, 205));
content.add(boardConfine, BorderLayout.CENTER);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setContentPane(content);
frame.pack();
frame.setVisible(true);
}
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
* @see https://stackoverflow.com/a/19531648/230513
*/
public class Test {
private static class MyPanel extends JPanel {
private static final int N = 8;
private static final int TILE = 48;
@Override
public Dimension getPreferredSize() {
return new Dimension(N * TILE, N * TILE);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.gray);
int w = this.getWidth();
int h = this.getHeight();
int tile = Math.min(w, h) / N;
for (int row = 0; row < N; row++) {
for (int col = 0; col < N; col++) {
if ((row + col) % 2 == 0) {
g.fillRect(col * tile, row * tile, tile, tile);
}
}
}
}
}
private void display() {
JFrame f = new JFrame("Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new MyPanel());
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Test().display();
}
});
}
}