【问题标题】:How do I convert a JLabel into a String & vice versa?如何将 JLabel 转换为字符串,反之亦然?
【发布时间】:2019-08-21 15:00:14
【问题描述】:

我正在尝试构建一个井字游戏,该游戏通过使用 JDialog 框 dialogBox 和 JTextField textField 来获取玩家输入。单击提交按钮后,接受输入并为游戏中的每个玩家命名。但是,我遇到的问题是我无法将 JLabel 转换为字符串,反之亦然。

我想从textField 获取文本输入并将其分配给jlblStatus 以显示用户名。我创建了makeString (),它使用XML Encoder 和ByteArrayOutputStream 将jlblStatus 更改为字符串,这样我就可以将textField 的输入分配给jlblStatus。然后我可以使用 XML 解码器和 ByteArrayInputStream 使用makeLabel()jlblStatus 转换回 JLabel。

但是,我收到编译错误incompatible types: String cannot be converted to JLabelincompatible types: JLabel cannot be converted to String,这意味着makeString() 无法将jlblStatus 转换为字符串。

具有 makeString() 和 makeLabel() 的类

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.LineBorder;
import java.io.ByteArrayOutputStream;
import java.io.ByteArrayInputStream;
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;


public class TicTacToeFrame extends JFrame {
   public char whoseTurn = 'X';   

   public Cell [] [] cells = new Cell [3] [3];

   JLabel jlblStatus = new JLabel ("X's turn to play");

   public boolean gameOver = false;

   public String players;

   public JPanel panel;

   JDialog dialogBox;

   JTextField textField;

   public TicTacToeFrame () {
     panel = new JPanel (new GridLayout (3, 3, 0, 0));
     for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            panel.add (cells [i] [j] = new Cell(this));
        }
    }

    panel.setBorder (new LineBorder (Color.red, 1));
    jlblStatus.setBorder (new LineBorder (Color.yellow, 1));

    add (panel, BorderLayout.CENTER);
    add (jlblStatus, BorderLayout.SOUTH);
  }

  public class miniFrame implements ActionListener {
    public miniFrame () {
      JFrame Frame = new JFrame ();
      dialogBox = new JDialog (Frame, "TicTacToe User Input", true);
      dialogBox.setLayout (new FlowLayout ());
      textField = new JTextField ("ENTER YOUR NAME", 20);
      JButton Submit = new JButton ("Submit");
      JLabel Player_X = new JLabel ("Player X: ");
      Submit.addActionListener (this);

      dialogBox.add (Player_X);
      dialogBox.add (textField);
      dialogBox.add (Submit);

      dialogBox.setSize (400, 150);
      dialogBox.setVisible (true);
   }

    public void actionPerformed (ActionEvent e) {
      String s = e.getActionCommand ();
      if (s.equals ("Submit")) {
         playerOne = textField.getText () + "'s turn to play";
         makeString (jlblStatus);
         jlblStatus = playerOne;
         makeLabel (playerOne);
      }
   }
 }

 String makeString (JLabel jl) {//This is the method which converts the Jlabel into a String
   ByteArrayOutputStream baos = new ByteArrayOutputStream ();
   XMLEncoder e = new XMLEncoder (baos);
   e.writeObject (jl);
   e.close ();
   return new String (baos.toByteArray ());
 }//CLOSE TOSTRING METHOD

 JLabel makeLabel (String str) {//This is the method which converts the String into a JLabel
   XMLDecoder d = new XMLDecoder (new ByteArrayInputStream (str.getBytes ()));
   JLabel label = (JLabel) d.readObject ();
   d.close ();
   return label;
 }//CLOSE FROMSTRING METHOD

 //ISFULL METHOD
 public boolean isFull () {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (cells [i] [j].getToken () == ' ') {
              return false;//FALSE BOOLEAN IS RETURNED 
            }
        }
    }
    return true;
 }

 public boolean isWon (char token) {
   for (int i = 0; i < 3; i++) {
      if ((cells [i] [0].getToken () == token) && (cells [i] [1].getToken () == token) && (cells [i] [2].getToken () == token)) {
          return true;
      }
   }

   for (int j = 0; j < 3; j++) {
      if ((cells [0] [j].getToken () == token) && (cells [1] [j].getToken () == token) && (cells [2] [j].getToken () == token)) {
         return true;
      }
   }

   if ((cells [0] [0].getToken() == token) && (cells [1] [1].getToken () == token) && (cells [2] [2].getToken () == token)) {
       return true;
   }

   if ((cells [0] [2].getToken() == token) && (cells [1] [1].getToken () == token) && (cells [2] [0].getToken () == token)) {
      return true;
   }

   return false;
 }
}

编译错误

TicTacToeFrame.java:70: error: incompatible types: String cannot be converted to JLabel
      jlblStatus = playerOne;
                   ^
TicTacToeFrame.java:71: error: incompatible types: JLabel cannot be converted to String
      makeLabel (jlblStatus);
                 ^
Note: Some messages have been simplified; recompile with - 
Xdiags:verbose to get full output
2 errors

我将如何解决这个问题并将 Jlabel 转换为字符串,反之亦然?

【问题讨论】:

    标签: java swing jlabel tic-tac-toe incompatibletypeerror


    【解决方案1】:

    您可能正在寻找这个:

    jlblStatus.setText(playerOne);
    makeLabel(jlblStatus.getText());
    

    【讨论】:

    猜你喜欢
    • 2011-05-27
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多