为什么更改 JLabel 的 bg 颜色会打开另一个 JFrame
Why changing the bg color of a JLabel opens another JFrame
所以我正在尝试在 JAVA 中创建一个国际象棋游戏(自学)。
我使用 JFrame 创建框架,使用 JPanel 将其添加到框架,使用 JLabel 定义棋盘的方块。
我想通过单击它来更改图块的颜色,我正在使用这样的东西:
这是鼠标点击的方法
@Override
public void mouseClicked(MouseEvent e) {
this.x = e.getX();
this.y = e.getY();
System.out.println("X: " + this.x + "; Y:" + this.y);
GUI GUIOBject = new GUI();
GUIOBject.clickOnTile(this.x, this.y);
}
这里调用的函数,GUIObject.clickOnTile(int x, int y);
是这样的:
public void clickOnTile(int x, int y){
this.labels[x/60 + y/60*8].setBackground(Color.blue);
}
问题是这样做我每次点击某处都会得到一个新的window。
因此,当我单击某个图块时,它会为正确的图块着色,但会打开一个新图块。
知道这是为什么吗?我怎样才能只在那个框架中进行更改?
这是完整的源代码:
Main.java
public static void main(String[] args){
GUI graphic_user_interface = new GUI();
}
GUI.java:
public JFrame frame;
public JPanel panel;
public JLabel[] labels;
public String[] positions = {"a", "b", "c", "d", "e", "f", "g", "h"};
public GUI(){
this.createFrame();
this.createPanel();
this.createLabels();
this.addPanel();
this.addLabels();
this.setFrameVisible();
}
public void clickOnTile(int x, int y){
this.labels[x/60 + y/60*8].setBackground(Color.blue);
}
@Override
public void createFrame() {
this.frame = new JFrame();
this.frame.setSize(500, 500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
public void createPanel() {
this.panel = new JPanel();
this.panel.setLayout(new GridLayout(8,8));
JPanel panel = new JPanel();
}
private void createLabels(){
this.labels = new JLabel[64];
for (int i = 0; i < 8; i++) {
for (int j = 0; j <8; j++) {
this.labels[i*8 + j] = new JLabel(this.positions[j] + (i+1));
this.labels[i*8 + j].setBounds(i*10, i*10, 50, 50);
this.labels[i*8 + j].setBorder(BorderFactory.createEtchedBorder(1));
this.labels[i*8 + j].setOpaque(true);
if(i%2 == 0){
if(j%2 == 0){
this.labels[i*8 + j].setBackground(Color.black);
}else{
this.labels[i*8 + j].setBackground(Color.white);
}
}else{
if(j%2 == 1){
this.labels[i*8 + j].setBackground(Color.black);
}else{
this.labels[i*8 + j].setBackground(Color.white);
}
}
}
}
}
private void addPanel(){
this.frame.add(this.panel);
}
private void addLabels(){
for (int i = 0; i < 64; i++) {
this.panel.add(this.labels[i]);
}
}
private void setFrameVisible(){
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
this.frame.setLocation(dim.width/2-this.frame.getSize().width/2, dim.height/2-this.frame.getSize().height/2);
this.frame.getContentPane().addMouseListener(new Mouse());
this.frame.setVisible(true);
}
Mouse.java:
public静态整数x;
public 静态整数 y;
@Override
public void mouseClicked(MouseEvent e) {
this.x = e.getX();
this.y = e.getY();
System.out.println("X: " + this.x + "; Y:" + this.y);
GUI GUIOBject = new GUI();
GUIOBject.clickOnTile(this.x, this.y);
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
IGUI(界面):
public void createFrame();
public void createPanel();
发现问题:
在鼠标中 class 我创建了一个新对象,然后调用函数为 JLabel 着色。
我将标签变量设为静态,然后在 Mouse class 中更改它,它工作得很好。
所以我正在尝试在 JAVA 中创建一个国际象棋游戏(自学)。
我使用 JFrame 创建框架,使用 JPanel 将其添加到框架,使用 JLabel 定义棋盘的方块。
我想通过单击它来更改图块的颜色,我正在使用这样的东西:
这是鼠标点击的方法
@Override
public void mouseClicked(MouseEvent e) {
this.x = e.getX();
this.y = e.getY();
System.out.println("X: " + this.x + "; Y:" + this.y);
GUI GUIOBject = new GUI();
GUIOBject.clickOnTile(this.x, this.y);
}
这里调用的函数,GUIObject.clickOnTile(int x, int y);
是这样的:
public void clickOnTile(int x, int y){
this.labels[x/60 + y/60*8].setBackground(Color.blue);
}
问题是这样做我每次点击某处都会得到一个新的window。
因此,当我单击某个图块时,它会为正确的图块着色,但会打开一个新图块。 知道这是为什么吗?我怎样才能只在那个框架中进行更改?
这是完整的源代码:
Main.java
public static void main(String[] args){
GUI graphic_user_interface = new GUI();
}
GUI.java:
public JFrame frame;
public JPanel panel;
public JLabel[] labels;
public String[] positions = {"a", "b", "c", "d", "e", "f", "g", "h"};
public GUI(){
this.createFrame();
this.createPanel();
this.createLabels();
this.addPanel();
this.addLabels();
this.setFrameVisible();
}
public void clickOnTile(int x, int y){
this.labels[x/60 + y/60*8].setBackground(Color.blue);
}
@Override
public void createFrame() {
this.frame = new JFrame();
this.frame.setSize(500, 500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
public void createPanel() {
this.panel = new JPanel();
this.panel.setLayout(new GridLayout(8,8));
JPanel panel = new JPanel();
}
private void createLabels(){
this.labels = new JLabel[64];
for (int i = 0; i < 8; i++) {
for (int j = 0; j <8; j++) {
this.labels[i*8 + j] = new JLabel(this.positions[j] + (i+1));
this.labels[i*8 + j].setBounds(i*10, i*10, 50, 50);
this.labels[i*8 + j].setBorder(BorderFactory.createEtchedBorder(1));
this.labels[i*8 + j].setOpaque(true);
if(i%2 == 0){
if(j%2 == 0){
this.labels[i*8 + j].setBackground(Color.black);
}else{
this.labels[i*8 + j].setBackground(Color.white);
}
}else{
if(j%2 == 1){
this.labels[i*8 + j].setBackground(Color.black);
}else{
this.labels[i*8 + j].setBackground(Color.white);
}
}
}
}
}
private void addPanel(){
this.frame.add(this.panel);
}
private void addLabels(){
for (int i = 0; i < 64; i++) {
this.panel.add(this.labels[i]);
}
}
private void setFrameVisible(){
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
this.frame.setLocation(dim.width/2-this.frame.getSize().width/2, dim.height/2-this.frame.getSize().height/2);
this.frame.getContentPane().addMouseListener(new Mouse());
this.frame.setVisible(true);
}
Mouse.java:
public静态整数x;
public 静态整数 y;
@Override
public void mouseClicked(MouseEvent e) {
this.x = e.getX();
this.y = e.getY();
System.out.println("X: " + this.x + "; Y:" + this.y);
GUI GUIOBject = new GUI();
GUIOBject.clickOnTile(this.x, this.y);
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
IGUI(界面):
public void createFrame();
public void createPanel();
发现问题:
在鼠标中 class 我创建了一个新对象,然后调用函数为 JLabel 着色。
我将标签变量设为静态,然后在 Mouse class 中更改它,它工作得很好。