由于某种原因使用.setText()时发生重叠 [英] Overlaping when using .setText() for some reason

查看:66
本文介绍了由于某种原因使用.setText()时发生重叠的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个名为status的Jlabel,它是空的.当我第一次执行 status.setText()时,它可以正常工作,但是当我再次更改它时,它会覆盖第一次更改,而不是像应有的那样替换它.发生了什么事?

I have a Jlabel called status that is empty. When I do status.setText() the first time it works normally but when I change it again it overlaps the first change instead of replacing it like it should. What is going on?

package panda.org;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.lang.Math;

public class NumberGame implements ActionListener{

    JFrame frame;
    JLabel rules;
    JLabel rulesText;
    JLabel rulesText2;
    JLabel lets;
    JButton play;
    JButton exit;
    JPanel panel;

    Font myFont = new Font("Serif Plain", Font.BOLD, 15);

    NumberGame() {

        frame = new JFrame("NumberGame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 500);
        frame.setLocationRelativeTo(null);
        frame.setLayout(null);
        frame.setResizable(true);
        Image icon = Toolkit.getDefaultToolkit().getImage("C:\\Users\\Gaming MSI\\Pictures\\Saved Pictures\\download (1).png");
        frame.setIconImage(icon);

        rules = new JLabel("Rules: ");
        rules.setFont(myFont);
        rules.setBounds(50, 100, 100, 75);

        rulesText = new JLabel("We will pick a random number in the range of 1 -> 50.");
        rulesText.setBounds(100, 100, 315, 75);

        rulesText2 = new JLabel("Your job is to guess that number!");
        rulesText2.setBounds(100, 120, 315, 75);

        play = new JButton("Play");
        play.setBounds(150, 300, 100, 75);
        play.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                int failedAttempts = 0;

                JLabel label = new JLabel("Guess the number from 1 till 50");
                label.setFont(myFont);
                label.setBounds(150, 75, 315, 75);

                JLabel hints = new JLabel("");

                JTextField text = new JTextField();
                text.setBounds(250, 150, 100, 25);

                JButton check = new JButton("Check");
                check.setBounds(150, 150, 75, 25);

                double randomDouble = Math.random();
                randomDouble = randomDouble * 50 + 1;

                int randomInt = (int) randomDouble;

                double finalRandomDouble = randomDouble;
                check.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {

                        System.out.println(randomInt);
                        String nb = text.getText();

                        int change = Integer.parseInt(nb);

                        JLabel status = new JLabel("");
                        status.setBounds(150, 160, 1000, 100);

                        frame.add(status);

                        if(randomInt == change) {
                            status.setText("You chose the correct number!");
                            status.setForeground(Color.green);
                        }
                        if(randomInt != change) {
                            status.setText("Wrong choice! Try again.");
                            status.setForeground(Color.red);
                        }
                    }
                });

                rules.setText("");
                rulesText.setText("");
                rulesText2.setText("");

                frame.add(hints);
                frame.add(label);
                frame.add(check);
                frame.add(text);
            }
        });

        exit = new JButton("Exit");
        exit.setBounds(350, 300, 100, 75);
        exit.addActionListener(new ActionListener()  {
            public void actionPerformed(ActionEvent e) {

                int result = JOptionPane.showConfirmDialog(frame,"Are you sure want to exit?", "Exit",
                        JOptionPane.YES_NO_OPTION,
                        JOptionPane.QUESTION_MESSAGE);
                if(result == JOptionPane.YES_OPTION){
                    System.exit(0);
                }else if (result == JOptionPane.NO_OPTION){
                }else {
                }
            }
        });

        frame.add(play);
        frame.add(exit);
        frame.add(rules);
        frame.add(rulesText);
        frame.add(rulesText2);

        frame.setVisible(true);
    }

    public static void main(String[] args) {

        NumberGame number = new NumberGame();

    }

    @Override
    public void actionPerformed(ActionEvent e) {

    }
}

有人要求提供更多代码,所以这就是我的全部代码!希望对您有所帮助:D

Someone asked for more code so this is all of my code! I hope this helps :D

问题出在这些行中


                        if(randomInt == change) {
                            status.setText("You chose the correct number!");
                            status.setForeground(Color.green);
                        }
                        if(randomInt != change) {
                            status.setText("Wrong choice! Try again.");
                            status.setForeground(Color.red);
                        }
                    }

结果显示如下:

This is how the result appears:

推荐答案

您的代码需要做一些改进:

There are some improvements to do in your code:

  1. 您正在使用 null-layout setBounds(...),即 与解决方案相比,它会让您头疼得多,这似乎是最好的/此处是为什么创建复杂GUI的最简单方法,但并非如此.Swing必须处理多个OS,PLAF,屏幕大小和分辨率,因此布局经理为您完成这项工作,您所要做的就是将它们结合起来.

  1. You're using null-layout and setBounds(...) which is not advised it will give you more headaches than solutions, it may seem like the best / easiest way to build complex GUIs but it's not, here's an example of why. Swing has to deal with multiple OS, PLAFs, screen sizes and resolutions, let the layout managers do that work for you, all you have to do is combine them.

每次调用 check.addActionListener(new ActionListener(){)时,您都会为 JLabel 创建一个名为 status <的新实例./code>,并且因为您使用的是 null-layout ,并且将其放置在同一位置,所以它们是重叠的.

Every time you call check.addActionListener(new ActionListener() {, you're creating a new instance of your JLabel named status, and because you're using null-layout and you're placing it in the same position, they're overlapping.

遵循此答案中给出的第一条建议,使用布局管理器重新构建整个内容,将 status 标签作为类成员移动,您应该不会有任何问题.

Follow the first advice given in this answer, rebuild the whole thing with layout managers, move the status label as a class member and you shouldn't have any problems.

这篇关于由于某种原因使用.setText()时发生重叠的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆