#java #swing #jlayeredpane
#java #качать #jlayeredpane
Вопрос:
Я программирую графический интерфейс для шахматной игры, я использую JLayeredPane для отображения черно-белых плиток на JFrame, а затем на следующем слое JLayeredPane я бы отображал шахматные фигуры, я новичок в Jlayeredpane и не совсем понимаю, как его использовать, я не могу заставить слой pieces накладываться на слой tiles, я попытался установить непрозрачность как false, и я попытался установить цвет фона как 0,0,0,0 есть идеи?
Я создал jpanel, который содержит массив jpanels с черно-белым фоном, затем я создал другую jpanel, которая содержит массив jlabels, на jlabels есть тексты, отображающие шахматные фигуры.
Общий код:
class frame extends JFrame implements MouseListener, MouseMotionListener{
private JLabel[][]label;
private int xIndex;
private int yIndex;
private JPanel[][]panels;
private JPanel mainPanel;
private JPanel labelPanel;
public frame() {
super("Chessboard");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
label = new JLabel[8][8];
mainPanel = new JPanel();
panels = new JPanel[8][8];
labelPanel = new JPanel();
mainPanel.setLayout(new GridLayout(8,8));
addTiles();
labelPanel.setLayout(new GridLayout(8,8));
addButtons();
JLayeredPane mainPane = new JLayeredPane();
add(mainPane);
mainPane.add(mainPanel,1);
mainPane.add(labelPanel, 2);
setBoard();
setSize(new Dimension(500,500));
setVisible(true);
}
public void setBoard(){
label[0][0].setText("u2656");
label[0][7].setText("u2656");
label[0][1].setText("u2658");
label[0][2].setText("u2657");
label[0][3].setText("u2655");
label[0][4].setText("u2654");
label[0][5].setText("u2657");
label[0][6].setText("u2658");
label[7][0].setText("u265C");
label[7][1].setText("u265E");
label[7][2].setText("u265D");
label[7][3].setText("u265B");
label[7][4].setText("u265A");
label[7][5].setText("u265D");
label[7][6].setText("u265E");
label[7][7].setText("u265C");
for(int i =0; i <8 ;i ){
label[1][i].setText("u2659");
}
for(int i =0; i <8 ;i ){
label[6][i].setText("u265F");
}
}
public void addTiles(){
for(int i =0; i<8;i ){
for(int k =0; k<8;k ){
panels[i][k] = new JPanel();
if(i%2 == 1){
if(k%2 == 0){
panels[i][k].setBackground(Color.gray);
}else{
panels[i][k].setBackground(Color.WHITE);
}
}else{
if(k%2 == 1){
panels[i][k].setBackground(Color.gray);
}else{
panels[i][k].setBackground(Color.WHITE);
}
}
mainPanel.add(panels[i][k]);
}
}
}
public void addButtons(){
for(int i =0; i<8;i ){
for(int k =0; k<8;k ){
label[i][k] = new JLabel();
label[i][k].setLayout(null);
label[i][k].setFont(label[i][k].getFont().deriveFont(29f));
label[i][k].addMouseListener(this);
label[i][k].addMouseMotionListener(this);
labelPanel.add(label[i][k]);
}
}
}
public void findIndex(MouseEvent arg0){
for(int x =0; x<8;x ){
for(int y =0; y <8; y ){
if(arg0.getSource().equals(label[x][y])){
xIndex = x;
yIndex = y;
}
}
}
}
public void mouseDragged(MouseEvent arg0) {
findIndex(arg0);
int mouseX = arg0.getX();
int mouseY = arg0.getY();
label[xIndex][yIndex].setLocation(mouseX, mouseY);
}
Я хочу, чтобы слой pieces отображался поверх слоя tiles из черно-белых jpanels и чтобы цвета были видны.
Комментарии:
1. Не используйте JLayeredPane. Вместо этого используйте простую сетку JPanel для размещения шахматной доски, сделайте фигуры JLabels, и если вы хотите снять фигуры с доски, поместите их в стеклянную панель JFrame. На самом деле это использование JLayeredPane за кулисами, но это проще сделать.
2. должен ли я создать другую панель для стеклянной панели? извините, я не знаком со стеклянными панелями.
3. Нет, вы этого не делаете. Пожалуйста, посмотрите это, поскольку это хорошо объяснено в удобных для поиска руководствах и тому подобном