如何解决JLabel 未显示在我的 JButton 网格中
创建一个名为黑白棋的游戏,我正在尝试将黑白计数器的起始位置(使用 JLabel
,标记为 'W'
和 'B'
)添加到板的中间彼此斜对,但由于某种原因,只有 2 个显示,另外 2 个没有显示,我不明白为什么。
我该如何修复它?
import java.io.*;
import java.util.*;
import java.lang.*;
import java.awt.*;
import javax.swing.*;
public class reversi
{
// instance variables - replace the example below with your own
private JFrame frame;
private JLabel userName1;
private JLabel userName2;
private JTextField textUsername1;
private JTextField textUsername2;
private JButton startButton;
private JButton [][] squares = new JButton[8][8];
private JLabel whites = new JLabel("W");
private JLabel blacks = new JLabel("B");
/**
*
*/
public reversi()
{
// initialise instance variables
gui();
}
/**
*
*/
public void gui()
{
frame = new JFrame("reversi Game");
frame.setSize(800,800);
frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
//frame.setLayout(new BoxLayout(frame,BoxLayout.X_AXIS));
JPanel userInterface = new JPanel(new GridBagLayout());
userInterface.setBackground(Color.LIGHT_GRAY);
userInterface.setBorder(BorderFactory.createBevelBorder(0));
//userInterface.setPreferredSize(new Dimension(350,700));
GridBagConstraints c = new GridBagConstraints();
//c.anchor = GridBagConstraints.norTH;
JPanel board = new JPanel();
board.setBackground(Color.GRAY);
board.setBorder(BorderFactory.createBevelBorder(1));
board.setPreferredSize(new Dimension(750,700));
userName1 = new JLabel("Enter First player: ");
userName2 = new JLabel("Enter Second player: ");
textUsername1 = new JTextField(15);
textUsername2 = new JTextField(15);
startButton = new JButton("START");
c.gridx = 0;
c.gridy = 0;
userInterface.add(userName1,c);
c.gridx = 1;
userInterface.add(textUsername1,c);
c.gridx = 0;
c.gridy = 1;
userInterface.add(userName2,c);
c.gridx = 1;
userInterface.add(textUsername2,c);
c.gridx = 0;
c.gridy = 2;
c.gridwidth = 2;
c.anchor = GridBagConstraints.soUTH;
userInterface.add(startButton,c);
userInterface.setBorder(BorderFactory.createTitledBorder(
BorderFactory.createEtchedBorder(),"Players/scoreboard"));
board.setLayout(new GridLayout(8,8));
for(int i = 0; i< 8; i++){
for (int j = 0; j < 8; j++)
{
squares[i][j] = new JButton();
squares[i][j].setBackground(Color.GREEN);
board.add(squares[i][j]);
}
}
squares[4][3].add(blacks);
squares[4][4].add(whites);
squares[3][4].add(blacks);
squares[3][3].add(whites);
frame.add(board,BorderLayout.CENTER);
JPanel wrapper = new JPanel();
wrapper.add(userInterface);
frame.add(wrapper,BorderLayout.LINE_END);
makeMenuBar();
frame.pack();
frame.setVisible(true);
}
private void makeMenuBar()
{
//Finish coding later
JMenuBar menubar = new JMenuBar();
frame.setJMenuBar(menubar);
JMenu fileMenu = new JMenu("File");
menubar.add(fileMenu);
JMenuItem saveFile = new JMenuItem("Save File");
fileMenu.add(saveFile);
JMenuItem quitGame = new JMenuItem("Quit");
fileMenu.add(quitGame);
quitGame.addActionListener(ev -> {quit(); });
}
private void quit()
{
System.exit(0);
}
}
解决方法
每个组件(即您的 JLabels
(whites
和 blacks
))只能添加到容器中一次,如果您需要添加更多标签,即使它们具有相同的标签String
里面,你必须为那些创建一个新对象,否则这些将显示在你添加的最后一个容器中。
squares[4][3].add(blacks);
squares[4][4].add(whites);
squares[3][4].add(blacks); // Only this one is added
squares[3][3].add(whites); // Only this one is added
您将需要这样的东西,或者有一个 JLabels
数组并将它们添加到您所有的 squares
中,然后只需调用 yourJLabelArray[i][j].setText("W")
(或 "B"
)
squares[4][3].add(new JLabel("B"));
squares[4][4].add(new JLabel("W"));
squares[3][4].add(new JLabel("B"));
squares[3][3].add(new JLabel("W"));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。