**结束。**此问题需要详细的调试信息。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。
14天前关门了。
改进这个问题
我制作了两个网格,并使用嵌套面板将它们添加到窗口中。唯一的问题是,我不能在中心移动网格,也不能在各自的网格下获取标签。我试过使用setbounds,但没用。有什么建议吗?我添加了当前状态的图像。我想在第一个和第二个网格下分别显示球员和对手标签。
public static void main(String[] args) {
window = new JFrame();
window.setTitle("Battleship.exe");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setPreferredSize(new Dimension(800, 800));
P1_container = new JPanel(new GridLayout(10,10));
P1_container.setPreferredSize(new Dimension(400, 400));
P1_container.setBorder(BorderFactory.createLineBorder(Color.black, 5));
compContainer = new JPanel(new GridLayout(10,10));
compContainer.setPreferredSize(new Dimension(400, 400));
compContainer.setBorder(BorderFactory.createLineBorder(Color.black, 5));
grid = new JPanel[10][10];
for (int i =0; i< 10; i++) {
for (int j =0; j< 10; j++) {
grid[i][j] = new JPanel();
grid[i][j].setBackground(Color.white);
grid[i][j].setBorder(BorderFactory.createLineBorder(Color.blue, 2));
grid[i][j].setPreferredSize(new Dimension(35,35));
P1_container.add(grid[i][j]);
}
}
enemyGrid = new JPanel[10][10];
for (int i =0; i< 10; i++) {
for (int j =0; j< 10; j++) {
enemyGrid[i][j] = new JPanel();
enemyGrid[i][j].setBackground(Color.lightGray);
enemyGrid[i][j].setBorder(BorderFactory.createLineBorder(Color.red, 2));
enemyGrid[i][j].setPreferredSize(new Dimension(35, 35));
compContainer.add(enemyGrid[i][j]);
}
}
GridLayout layout = new GridLayout(1, 2);
layout.setHgap(150);
mainPanel = new JPanel(layout);
mainPanel.add(P1_container);
mainPanel.add(compContainer);
player = new JLabel("PLAYER");
player.setBounds(100, 410, 5, 5);
opponent = new JLabel("OPPONENT");
opponent.setBounds(100, 410, 5, 5);
panel = new JPanel();
panel.setPreferredSize(new Dimension(100, 100));
panel.add(mainPanel, BorderLayout.CENTER);
panel.add(player, BorderLayout.WEST);
panel.add(opponent, BorderLayout.WEST);
window.add(panel, BorderLayout.CENTER);
window.pack();
window.setVisible(true);
}
1条答案
按热度按时间e5nqia271#
如果之前的问题已经解决,请将其标记为已解决。人们花时间来帮助你,这是你至少能做的。如果有人回答我的问题,我应该怎么做?
你还在打电话吗
setPreferredSize
你应该重写getPreferredSize
只有在必要的时候。如果你的网格JPanel
s的大小通过getPreferredSize
没有必要打电话setPreferredSize
在各自的容器或JFrame
另外,您仍然没有在edt上创建swing组件。正如其他人提到的,你不能使用
setBounds
当使用LayoutManager
. 要实现您想要的,您需要嵌套布局,正如前面所说的那样。所以你可能想创造两个
JPanel
带边框布局的。这两个新容器将分别容纳每个网格及其标签:下面的代码也没有意义:
默认情况下
JPanel
使用FlowLayout
所以呢BorderLayout.XXX
这里什么都没有。再次花时间阅读布局管理器的可视化指南,但我展示的代码通过不向布局管理器传递任何额外参数来纠正这一点add()