如何解决由于某种原因使用 .setText() 时重叠
我有一个名为 status 的 Jlabel,它是空的。当我第一次执行 status.setText()
时,它可以正常工作,但是当我再次更改它时,它会与第一次更改重叠,而不是像应有的那样替换它。这是怎么回事?
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,75);
rulesText = new JLabel("We will pick a random number in the range of 1 -> 50.");
rulesText.setBounds(100,315,75);
rulesText2 = new JLabel("Your job is to guess that number!");
rulesText2.setBounds(100,120,75);
play = new JButton("Play");
play.setBounds(150,300,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,75);
JLabel hints = new JLabel("");
JTextField text = new JTextField();
text.setBounds(250,150,25);
JButton check = new JButton("Check");
check.setBounds(150,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,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
问题出在这几行
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);
}
}
结果如下:
解决方法
您的代码有一些改进:
-
您正在使用
null-layout
和setBounds(...)
,即 not advised 它会给您带来比解决方案更多的麻烦,这似乎是构建复杂 GUI 的最佳/最简单的方法但事实并非如此,here 是原因的一个例子。 Swing 必须处理多种操作系统、PLAF、屏幕尺寸和分辨率,让 layout managers 为您完成这项工作,您只需将它们组合起来即可。 -
每次调用
check.addActionListener(new ActionListener() {
时,您都在创建名为JLabel
的status
的新实例,并且因为您使用的是null-layout
并且您把它放在同一个位置,它们是重叠的。
按照此答案中给出的第一个建议,使用布局管理器重建整个内容,将 status
标签作为类成员移动,您应该不会有任何问题。
试试这个:
if(randomInt == change) {
status.setText("You chose the correct number!");
status.setForeground(Color.green);
}else{
status.setText("Wrong choice! Try again.");
status.setForeground(Color.red);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。