当前位置: 首页 > 知识库问答 >
问题:

java解析来自组件的数据

慕佑运
2023-03-14

我正在创建一个游戏,我正在做一个字符选择屏幕,其中有一个JTextField用于输入用户名,屏幕上还有一个JButton“创建字符”,当按下时会解析JTextField,如果有任何问题(名称中的空格,以空格开头等),它会将一些文本放在JTextField旁边的JLabel中。

我将JButton连接到actionPerformed方法,该方法调用解析数据的函数。我的问题是,每次我按下按钮,一个新标签就会被放置在原来的JLabel上。

我像这样创建JLabel:

public static JLabel label;
label = new JLabel();
// some properties

我这样调用解析方法:

parseCharacterSelection(nameInput, label);

其中,nameInput是JTextField。我的问题是,为什么每次按下jb按钮都会创建一个新标签

public void parseCharacterCreation(JTextField input, JLabel label) {

    // Variable that hold whether or not
    // the User Name is acceptable

    player_name = input.getText();

    // Make some initial checks on the
    // input string
    //----------------------------------
    if( player_name.isEmpty() ) {
        label.setText("You need to pick a username");
    } else if( player_name.startsWith(" ") ) {
        label.setText("Name Cannot start with a space");
    } else {
        pass = true;
    }

    // Attempt to write to file
    // Catch some errors
    //----------------------------------
    if(pass == true) {
        try {
            if( player_name.contains(" ") ) {
                player_name = player_name.replaceAll("\\s", "_");
                player_file = new File("src/Resources/characters/" + player_name + ".properties");
            }

            if(!player_file.exists()) {
                player_file.createNewFile();
            }

            FileWriter      fw = new FileWriter(player_file.getAbsoluteFile());
            BufferedWriter  bw = new BufferedWriter(fw);

            bw.write(player_name);
            bw.close();

        } catch( IOException e ) {
            e.printStackTrace();
        } finally {
            System.out.println("DONE");
        }
    }
}

//ScreenCharacter类

public class ScreenCharacter extends JPanel {

public static JButton       create;
public static JTextField    nameInput;
public static JLabel        errorLabel;

public ScreenCharacter() {

    this.setLayout(null);
    this.add(createUserName());
    this.add(createMainArea());
}

private static JPanel createUserName() {

    MatteBorder matteBorder = new MatteBorder(1, 0, 1, 0, Color.decode("#222222"));
    EmptyBorder emptyBorder = new EmptyBorder(10, 75, 10, 10);
    CompoundBorder border   = new CompoundBorder(matteBorder, emptyBorder);

    JPanel userNameArea     = new JPanel();
    userNameArea.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
    userNameArea.setBounds(0, 35, Engine.screenX, 50);
    userNameArea.setBorder(border);
    userNameArea.setBackground(new Color(255, 255, 255, 70));

    JLabel nameLabel        = new JLabel();
    nameLabel.setText("Enter Your Username: ");

    nameInput = new JTextField();
    nameInput.setForeground(Color.black);
    nameInput.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0));
    nameInput.setPreferredSize(new Dimension(200, 25));

    errorLabel = new JLabel();
    errorLabel.setText("This is a test label");
    errorLabel.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 0));
    errorLabel.setPreferredSize(new Dimension(200, 25));
    errorLabel.setAlignmentX(JLabel.LEFT_ALIGNMENT);

    userNameArea.add(nameLabel);
    userNameArea.add(nameInput);
    userNameArea.add(errorLabel);


    return userNameArea;
}

private static JPanel createMainArea() {

    JPanel resetCreatePanel = new JPanel(new GridLayout(1, 2));
    resetCreatePanel.setPreferredSize(new Dimension(300, 30));
    resetCreatePanel.setBackground(Color.black);

    create  = new JButton("Create Character");
    create.setBorder(BorderFactory.createLineBorder(Color.decode("#171717")));
    create.setFont(new Font("Dialog", 1, 11));
    create.setBackground(Color.black);
    create.setForeground(Color.white);
    create.setFocusPainted(false);
    create.setContentAreaFilled(false);
    create.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            if(!errorLabel.getText().isEmpty()) {
                errorLabel.setText("");
            } else {
                Engine.p_parser.parseCharacterCreation(nameInput, errorLabel);
            }
        }
    });

    resetCreatePanel.add(create);


}

}

//发动机

public class Engine {
    public static PlayerParser p_parser;
    public Engine() {
        p_parser = new PlayerParser();

    }
}

共有1个答案

赫连冠玉
2023-03-14

谢谢大家的帮助。“问题”是组件所在的JPanel有一个半透明的背景。具有透明度的JComponents不知何故会被弄乱,这使得它看起来像有多个标签正在创建。但是没有透明度它工作得很好。

 类似资料:
  • 免责声明: 首先我想说的是,我对网络开发还很陌生——也许这个问题是由于缺乏基础知识造成的,因此,如果有任何有用的建议,我将不胜感激。 问题: 我试图在我的web应用程序上加载gltf格式的3D数据,但是数据是动态的- 然而,我想坚持使用反应三纤维德雷,因为它易于与反应一起使用。不幸的是,我无法在示例或其他人的代码中找到解决方案。 可在此处找到可编辑沙盒: https://codesandbox.i

  • 问题内容: 我在Goji框架上运行了一些东西: 我希望有人能帮助我做的是弄清楚如何提交HTML表单以将数据发送到Golang代码。 因此,如果存在一个带有name属性的输入字段,并且该属性的值是name,并且用户在其中输入名称并提交,那么在提交的表单页面上,Golang代码将打印问候,名称。 这是我能想到的: 这是我的hello.html文件: 在身体里: 如何连接到使Golang代码获取的是在表

  • 此函数类似于numpy.array,除了它有较少的参数。 这个例程对于将 Python 序列转换为ndarray非常有用。 构造器接受下列参数: 下面的例子展示了如何使用asarray函数: # 将列表转换为 ndarray import numpy as np a = np.asarray(x) print a 输出如下: [1 2 3] 示例 2 import numpy as np x

  • 问题内容: 我从一个教程中获取了以下代码: 将被突出显示,并显示两个错误: 容器类型中的方法add(Component)不适用于参数(JLabel) 无法解析类型javax.swing.JComponent。从所需的.class文件间接引用它 作为Java的新手,我不太了解Eclipse试图告诉我什么。我该怎么做才能使其正常工作? 编辑:代码运行时没有一行,因此问题不在于找不到JFrame或JLa

  • 我正在从谷歌地图上提取一些数据,但我似乎不能用它做任何事情。下面是我的代码: 你知道我做错了什么吗?

  • Milo Yip 2016/10/13 本文是《从零开始的 JSON 库教程》的第五个单元解答篇。解答代码位于 json-tutorial/tutorial05_answer。 1. 编写 test_parse_array() 单元测试 这个练习纯粹为了熟习数组的访问 API。新增的第一个 JSON 只需平凡的检测。第二个 JSON 有特定模式,第 i 个子数组的长度为 i,每个子数组的第 j 个