由于某种原因使用.setText()时发生重叠 [英] Overlaping when using .setText() for some reason
问题描述
我有一个名为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:
-
您正在使用
null-layout
和setBounds(...)
,即 与解决方案相比,它会让您头疼得多,这似乎是最好的/此处是为什么创建复杂GUI的最简单方法,但并非如此.Swing必须处理多个OS,PLAF,屏幕大小和分辨率,因此布局经理为您完成这项工作,您所要做的就是将它们结合起来.
You're using
null-layout
andsetBounds(...)
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屋!