java - 如何从 (0,0) 坐标移动面板

标签 java user-interface border-layout

如您所见,5x5 窗口与 0,0 坐标相邻。我想把它们移动到10,10。我该怎么做?

enter image description here

我认为问题出在我的 BorderLayout 中。北部和东部是免费的。我如何用 10,10 维度填充它们

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

public class Main {

public static void main(String[] args) {

    SOS game = new SOS(5);

    // JPanel for sos template
    SOSCanvas window = new SOSCanvas(game); 

    // JPanel which includes info panel, time and exit panel
    SOSGUIPanel info = new SOSGUIPanel(window, "Cihangir", "Mercan"); 

    JFrame jf = new JFrame();

    jf.setTitle( "SOS game");
    jf.setSize(340, 450);
    jf.setVisible(true);
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jf.setLocationRelativeTo(null);

    jf.setLayout( new BorderLayout() );
    jf.add(window, BorderLayout.CENTER ); 
    jf.add(info, BorderLayout.SOUTH );

}

}

该类提供了网格;

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


public class SOSCanvas extends JPanel {

// PROPERTIES

protected SOS game;


// CONSTRUCTORS

public SOSCanvas( SOS game )
{
    this.game= game;                
}

@Override
public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    int dimension = game.getDimension();

    g.drawRect (0, 0, 300, 300);    

    // drawing horizontal lines
    for ( int i = 1; i < dimension; i++ )
    {
        g.drawLine(0, i * (300 / dimension), 300, i * (300 / dimension) );
    }

    // drawing vertical lines
    for ( int i = 1; i < dimension; i++ )
    {
        g.drawLine( i * (300 / dimension), 0, i * (300 / dimension), 300);
    }
}

}

最佳答案

您需要做的第一件事是停止依赖魔数(Magic Number),您需要知道组件的当前大小。

您需要获取组件当前的宽度和高度,而不是使用g.drawRect (0, 0, 300, 300);。由此您可以决定如何处理您的期望与组件的实际宽度和高度之间的差异。

例如,下面是一个可扩展的网格,它可以根据可用空间增大和缩小,但始终保持正方形。它也将始终尝试将自己置于可用空间的中心......

public class SOSCanvas extends JPanel {

    public SOSCanvas() {
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(300, 300);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        int dimension = 5;//game.getDimension();

        int width = getWidth() - 1;
        int height = getHeight() - 1;

        int cellSize = Math.min(width, height);
        int xOffset = (width - cellSize) / 2;
        int yOffset = (height - cellSize) / 2;

        g.drawRect(xOffset, yOffset, cellSize, cellSize);

        // drawing horizontal lines
        for (int i = 1; i < dimension; i++) {
            g.drawLine(
                            xOffset, 
                            yOffset + (i * (cellSize / dimension)), 
                            xOffset + cellSize, 
                            yOffset + (i * (cellSize / dimension)));
        }

        // drawing vertical lines
        for (int i = 1; i < dimension; i++) {
            g.drawLine(
                            xOffset + (i * (cellSize / dimension)), 
                            yOffset, 
                            xOffset + (i * (cellSize / dimension)), 
                            yOffset + cellSize);
        }
    }

}

即使您想要一个(比方说)300x300 的静态网格,您需要使网格水平居中的 x 偏移量也可以使用类似于 xOffset = (getWidth() - 300)/2 的方法来计算,那么所有水平绘制都需要从这个偏移量开始...

关于java - 如何从 (0,0) 坐标移动面板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29529613/

相关文章:

java - IBM 沃森。自然语言。得到 :401 Invalid credentials, 但它们是正确的。来自java sdk

java - 将外部lib添加到android项目中

javascript - AngularJS:从列表中动态添加组件

java - 如何在不使用 setGridLinesVisible() 方法的情况下永久显示 GridPane 对象网格线?

c++ - 当从类构造函数中用于窗口类时,为什么winapi坚持使用PCSTR而不是PCWSTR?

java - West/East 上的 JLabel 不会出现在 BorderLayout 中

java - 安卓 : Menu Item always overflows in portrait

java - JSON解析返回org.json.JSONException : No value for icon_url

swing - 如何在 JPanel、Java Swing 的中心添加 JToolBar?

java - 添加到 BorderLayout.CENTER 的面板不占用剩余空间