0

何らかの理由で、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              
        }           
}
4

1 に答える 1

3

あなたはここで誤った仮定をしています。String を JLabel に配置してその内容を設定した場合、後で String 変数を変更しても、JLabel によって表示される String には影響しません。Strings はimmutableであること、つまり Stringオブジェクトは決して変更できないことを理解してください。String 変数は新しい別の String オブジェクトを参照できますが、元の String オブジェクトは変更されません。

JLabel が表示する内容を変更するには、JLabel を明示的に呼び出す必要がありますsetText(newString)

また、JFrame の paint メソッドをオーバーライドするべきではありません。オーバーライドできたとしても、Swing コンポーネントを変更したり、paint または paintComponent メソッド内にコンポーネントを追加したりしないでください。オーバーライドする必要があるメソッドは、JPanel の paintComponent メソッドであり、ペイントおよびペイント専用である必要があります。

ここには多くのエラーと問題があります。最初からやり直すことをお勧めします。



要約すると、もう一度編集します。

  • JFrame のペイント メソッドをオーバーライドしないでください。
  • Swing GUI で描画する必要がある場合は、JPanel または JComponent の paintComponent メソッドで描画します。
  • paintComponent オーバーライドでは、最初にスーパー paintComponent メソッドを呼び出すようにしてください。
  • この方法は、ペイントとペイントのみに使用してください。GUI からコンポーネントを追加または削除しないでください。このメソッドでプログラム ロジックを実行しないでください。いつ、または呼び出されるかを制御できないため、それに依存することはできません。また、メソッドは非常に高速でなければなりません。そうしないと、プログラムが遅いと認識されます。
  • コンポーネントの位置を設定しないでください。レイアウト マネージャーを使用します。多くの場合、複数の JPanel を使用して複数のレイアウトを作成します。一部は別のレイアウトにネストされ、それぞれに独自のレイアウトがあります。
  • JLabel のテキストを変更するsetText(...)には、JLabel を呼び出します。JLabel の作成に使用された元の String 変数を変更しても、JLabel の表示には影響しません。

編集 2

  • たとえば、JFrame はデフォルトで BorderLayout を使用するなど、レイアウト マネージャーを理解する必要があります。したがって、BorderLayout 定数に関連する場所を指定せずに追加されたものはすべて、BorderLayout.CENTER が追加され、以前に追加されたすべてのコンポーネントをカバーします。シンプルな GUI に FlowLayout などの別のレイアウトを使用することを検討してください。
于 2013-09-25T19:38:04.460 に答える