JLabel没有出现

时间:2013-09-25 19:34:43

标签: java swing jframe paint jlabel

出于某种原因,当我将JLabel设置为等于字符串时,它不会出现。我已经导入了正确的库并添加了它,因此它会将文本设置为白色并将其设置为字体,但我很困惑,而且我是java的新人有帮助!

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import java.awt.event.ActionListener;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;

public class math extends JFrame{

    //Variables
    public Font text = new Font("Comic Sans MS", Font.BOLD, 50);
    public Color bordercolor = new Color(255,178,102);
    public int anser;
    public int random1;
    public int random2;
    public Random randomnumber1 = new Random(); 
    public Random randomnumber2 = new Random(); 
    public String problem;
    public JTextField textbox = new JTextField(2);
    public JLabel textanser = new JLabel(problem);

    public math(){
        setBackground(Color.BLACK);
        setLocationRelativeTo(null);
        setTitle("Test");   
        setSize(1300,650);
        setResizable(false);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //  addMouseListener(new ml());     
        }    
        //Paint method
        public void paint(Graphics g){
        g.setColor(bordercolor);
        g.fillRect(0, 0, 50, 700);
        g.fillRect(1250,0, 50,700);
        g.fillRect(0,20,1250,50);
        g.fillRect(0,600,1500,50);
        //Addition Math Problem
        random1 = 1+randomnumber1.nextInt(10);
        random2 = 1+randomnumber2.nextInt(10);
        problem =  random1 + " + " + random2;
        anser = random1 + random2;
        textanser.setLocation(585,275);
        textanser.setFont(text);
        textanser.setText(problem);
        textanser.setForeground(Color.white);
            //Problem on screen
            g.setFont(text);
            g.setColor(Color.WHITE);
            add(textanser);
            //g.drawString(problem,585,275);
            System.out.println(anser);              
            //Text Box
            textbox.setLocation(600, 300);
            textbox.setSize(100,30);
            add(textbox);
            //Action Listener
             textbox.addActionListener(new ActionListener()
             {
                    public void actionPerformed(ActionEvent e)
                    {
                          String input = textbox.getText();
                          double intanser = Double.parseDouble(input);                              
                        //Comparing user anser and real anser
                          if(anser != intanser ){

                              JOptionPane.showMessageDialog(null, "Incorrect the correct anser was " + anser);  
                          }                              
                          //If anser is correct
                          if(anser == intanser){
                              JOptionPane.showMessageDialog(null, "Correct!");                                 
                          }
                    }
             });
            //Integer               
        }   

        public static void main(String[] args) {
        math math = new math();
        }

        public void mouseClicked() {
            // TODO Auto-generated method stub              
        }           
}

1 个答案:

答案 0 :(得分:3)

你在这里犯了错误的假设。如果将一个String放入JLabel并从而设置其内容,如果稍后更改String变量,这将对JLabel显示的String没有影响。理解字符串是 immutable ,这意味着String 对象不能永远改变。 String变量可以引用一个新的不同String对象,但原始的String对象保持不变。

要更改JLabel显示的内容,您必须在JLabel上显式调用setText(newString)

此外,您不应该覆盖JFrame的paint方法,即使您可以这样做,也不应该更改Swing组件,或者在paint或paintComponent方法中添加组件。应该重写的方法是JPanel的paintComponent方法,它应该只用于绘画和绘画,仅此而已。

这里有很多错误和问题。我建议重新开始。


修改
再次总结一下:

  • 不要覆盖JFrame的绘制方法。
  • 如果您必须在Swing GUI中进行绘图,请在JPanel或JComponent的paintComponent方法中进行绘制。
  • 请务必先在paintComponent覆盖中调用super paintComponent方法。
  • 仅使用此方法进行绘画和绘画。不要在GUI中添加或删除组件,不要在此方法中执行任何程序逻辑。您无法控制何时或是否被调用,因此无法依赖它。此外,该方法必须快速,否则您的程序将被视为慢。
  • 不要设置组件的位置。使用布局管理器,通常使用多个JPAnels布局,有些嵌套在其他布局中,每个布局都有自己的布局。
  • 要更改JLabel的文本,请在JLabel上调用setText(...)。更改用于创建JLabel的原始String变量将不会影响JLabel的显示。

修改2

  • 您需要了解布局管理器,例如JFrame默认使用BorderLayout。因此添加到其中的任何内容都没有指定与BorderLayout常量相关的位置添加BorderLayout.CENTER并覆盖所有以前添加的组件。考虑为您的简单GUI使用不同的布局,例如FlowLayout。