1

ユーザーがボタンを押して乱数を生成するプログラムを作成しています。その数によって、JLabel に表示されるテキストが決まります。プログラムの動作方法は、メインの JFrame が「Work」というボタンを保持し、「Get a new job」というボタンで別の JFrame を開き、結果とともに JLabel を表示するというものです。ランダムに生成された数値を保持する変数を、数値ジェネレーター クラスから「作業」ボタンの ActionListener クラスに渡すことができないようです。また、JLabel を使用してその JFrame を終了し、再度開いた場合に、JLabel を閉じる前のテキストが表示され、デフォルトのテキストなしにリセットされないように、JLabel にテキストを保存するにはどうすればよいでしょうか。詳細が必要な場合はお知らせください。

メインクラス:

import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;



public class Main{

            public static void main(String [] args){

                JFrame main = new JFrame("This is the real life!");
                main.setSize(500,500);
                main.setResizable(false);
                main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                main.setVisible(true);

                JPanel mainPanel = new JPanel(new GridBagLayout());
                main.getContentPane().add(mainPanel, BorderLayout.NORTH);
                GridBagConstraints c = new GridBagConstraints();

                JLabel mainText = new JLabel("This is your life.");
                c.gridx = 50;
                c.gridy = 50;
                c.insets = new Insets(50,10,10,10);
                mainPanel.add(mainText, c);

                JButton workButton = new JButton("Work");
                c.gridx = 50;
                c.gridy = 75;
                c.insets = new Insets(150,10,10,10);
                mainPanel.add(workButton, c);
                workButton.addActionListener(new workButtonAction());

            }
}

「作業」ボタン ActionListener クラス:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class workButtonAction extends numGeneratorAction implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub

        JFrame workFrame = new JFrame("Your job");
        workFrame.setSize(250,250);
        workFrame.setResizable(false);
        workFrame.setVisible(true);

        JPanel workPanel = new JPanel();
        workFrame.add(workPanel);

        JButton numGenerator = new JButton("Get a new job.");
        workPanel.add(numGenerator);
        numGenerator.addActionListener(new numGeneratorAction());

        JLabel Job = new JLabel();

        numGeneratorAction generatorObject = new numGeneratorAction();
        generatorObject.actionPerformed(e);

        if(job == 0){ //The job variable is not recognized in this class.
            Job.setText("Text will go here.");
        }
    }

}

ナンバ ジェネレータ クラス:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

public class numGeneratorAction implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        int job;

        Random dice = new Random();
        job = dice.nextInt(4);
        System.out.println(job);

    }

}
4

2 に答える 2

1

親クラスへのコールバックを作成する必要がある場合は、単純な手法をパターンとして使用します。子クラスは、親への参照を保持するいくつかのメソッドで拡張する必要があります。親は、子が親に通知するために使用する新しいインターフェイスを実装する必要があります。この例では、ボタンに基づいて新しいクラスにインターフェイスを追加しようとします。次に、ボタンをコンストラクターの引数としてオブジェクトとして受け取るアクションリスナーの新しいクラスを作成して、その起源を取得します。

ただし、上記の内容は無視してください。これはパターンであり、あなたの場合は必要ありません。ActionListener に直行し、イベントのソースを保持する ActionEvent があり ます。 -リスナー

于 2013-07-02T23:40:29.567 に答える
1

ローカル変数として宣言しているジョブが認識されず、メソッドの外側にスコープがなく、outisde actionPerformed として宣言するだけですprotected int job;

ところでいくつかのアドバイス:

  • 最後に電話frame.setVisible(true)

  • 2-public class workButtonAction extends numGeneratorAction implements ActionListenerなぜこれを延長するのですか?拡張する場合、親が実装するため、ActionListener を実装する必要はありません。

  • 3- トップ クラスに ActionListener を実装しないでください。匿名クラスまたはプライベート 内部クラスを使用することを好みます。

  • 4- actionListener メソッドでフレームを作成しないでください。ローカル変数ではなくグローバル変数として配置します。

  • 5- Javaコードの規則に従います(クラスの最初の文字は大文字にする必要
    があります)。

今あなたのコードで:

フレームを保持するクラスを作成します

public class MainFrame {

private JFrame main;
private JPanel mainPanel;
private JLabel mainText;
private JButton workButton;

public MainFrame(){
                main = new JFrame("This is the real life!");
                main.setSize(500,500);
                main.setResizable(false);
                main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


                mainPanel = new JPanel(new GridBagLayout());
                main.getContentPane().add(mainPanel, BorderLayout.NORTH);
                GridBagConstraints c = new GridBagConstraints();

                mainText = new JLabel("This is your life.");
                c.gridx = 50;
                c.gridy = 50;
                c.insets = new Insets(50,10,10,10);
                mainPanel.add(mainText, c);

                workButton = new JButton("Work");
                c.gridx = 50;
                c.gridy = 75;
                c.insets = new Insets(150,10,10,10);
                mainPanel.add(workButton, c);
                workButton.addActionListener(new WorkButtonAction());
                main.pack();
                main.setVisible(true);
}


private class WorkButtonAction implements ActionListener {
       @override
       public void actionPerformed(ActionEvent evt){
               // here create a JDialog instead of a JFrame
                 JDialog dialog = new MyDialog(main,true);
                 dialog.setVisible(true);
       }


}

}

JDialog

public class MyDialog extends JDialog{

private JPanel workPanel;
private JButton numGenerator;
private JLabel jlabel;
private Random dice = new Random();

public MyDialog(){

        setTitle("Your job");
        setSize(250,250);
        setResizable(false);
        workPanel = new JPanel();
        add(workPanel);
        numGenerator = new JButton("Get a new job.");
        workPanel.add(numGenerator);

       numGenerator.addActionListener(new NumGeneratorAction(){
                @Override
                public void actionPerformed(ActionEvent evt){
                      int job = dice.nextInt(4);
                      if(job == 0)
                            jobLabel.setText("Text will go here.");
                }

       });

        jobLabel = new JLabel();

}




}

そしてあなたのメインクラスで

public class Main {
  public static void main(String args []){
       SwingUtilities.invokeLater(new Runnable(){
                @Override
                public void run(){
                  new MainFrame();
                }
         });

  }
}
于 2013-07-03T00:11:33.427 に答える