0

わかりましたので、実行すると問題なく動作しますが、答えがポップアップしません。

私は何を間違えましたか?

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class AF implements ActionListener{

    double length;
    double width;
    double answer;

    JTextField twidth;
    JTextField tlength;

    void AFWindow() {

        JFrame AFwindow = new JFrame();
        JPanel pan2 = new JPanel(new GridBagLayout());
        AFwindow.setVisible(true);
        AFwindow.setSize(250, 150);
        AFwindow.setResizable(false);
        GridBagConstraints c = new GridBagConstraints();
        AFwindow.add(pan2);
        pan2.setBackground(Color.LIGHT_GRAY);

        c.gridx = 0;
        c.gridy = 5;
        tlength = new JTextField();
        tlength.setText("    Length    ");
        pan2.add(tlength, c);

        c.gridx = 0;
        c.gridy = 0;
        twidth = new JTextField();
        twidth.setText("     Width     ");
        pan2.add(twidth, c);

        JButton Find = new JButton("Ok");

        c.gridx = 0;
        c.gridy = -5;
        pan2.add(Find);
        Find.addActionListener(this);
        Find.setActionCommand("ok");
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equalsIgnoreCase("ok")){
            try {
            this.length = Double.parseDouble(tlength.getText());
            this.width = Double.parseDouble(twidth.getText());
        }
        catch(NumberFormatException ex){
            System.out.println("There was an issue!");
        }
        }
    }

    int area = (int) (length * width);
    public void answer(){
        JFrame answer = new JFrame();
        answer.setVisible(true);
        answer.setBackground(Color.yellow);
        JPanel pan2 = new JPanel();
        JLabel howanswer = new JLabel("Your answer is" + area + "We got this by multiplying the length and width");
        pan2.add(howanswer);
    }
}
4

3 に答える 3

2

そのコードには複数の問題があります。それらを文書化するのを忘れましたが、修正の始まりについてはこのコードを見てください。

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class AF implements ActionListener{

    double length;
    double width;

    JTextField twidth;
    JTextField tlength;
    JFrame AFwindow;

    void AFWindow() {

        AFwindow = new JFrame();
        JPanel pan2 = new JPanel(new GridBagLayout());

        GridBagConstraints c = new GridBagConstraints();
        AFwindow.add(pan2);
        pan2.setBackground(Color.LIGHT_GRAY);
        pan2.setBorder(new EmptyBorder(100,100,100,100));

        c.gridx = 0;
        c.gridy = 5;
        tlength = new JTextField();
        tlength.setText("    Length    ");
        pan2.add(tlength, c);

        c.gridx = 0;
        c.gridy = 0;
        twidth = new JTextField();
        twidth.setText("     Width     ");
        pan2.add(twidth, c);

        JButton Find = new JButton("Ok");

        c.gridx = 0;
        c.gridy = -5;
        pan2.add(Find);
        Find.addActionListener(this);
        Find.setActionCommand("ok");
        AFwindow.pack();
        AFwindow.setLocationByPlatform(true);
        AFwindow.setVisible(true);
    }

    int area;

    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equalsIgnoreCase("ok")){
            try {
                this.length = Double.parseDouble(tlength.getText());
                this.width = Double.parseDouble(twidth.getText());
                area = (int) (length * width);
                answer();
            }
            catch(NumberFormatException ex){
                ex.printStackTrace();
                // System.out.println("There was an issue!");
                // Can you vague that up for me?!?!
                JOptionPane.showMessageDialog(AFwindow, ex);
            }
        }
    }

    public void answer(){
        JPanel pan2 = new JPanel();
        JLabel howanswer = new JLabel("Your answer is " + area + " We got this by multiplying the length and width");
        pan2.add(howanswer);
        JOptionPane.showMessageDialog(AFwindow, pan2);
    }

    public static void main(String[] args) {
        System.out.println("Hi!");
        new AF().AFWindow();
    }
}
于 2012-07-05T08:05:29.140 に答える
1

OKボタンを押すと応答フレームがポップアップすることを期待していますか?その場合は、answerメソッドを呼び出す必要があります。

    if (e.getActionCommand().equalsIgnoreCase("ok")){
        try {
            this.length = Double.parseDouble(tlength.getText());
            this.width = Double.parseDouble(twidth.getText());
            answer();       //  <--- This is missing
        }

また、あなたがする必要がある他のいくつかのこと:

  • 通常、フレームにコンポーネントを追加した後、GUI構築メソッドの最後でJFrame.setVisibleを呼び出す必要があります。これを以下の例で示しましたが、setVisible(..)もAFwindow()メソッドの下部に移動する必要があります。

  • メソッドの外部で実行int area = (int) (length * width);する場合、このステートメントはインスタンス変数の初期化として解釈され、AFオブジェクトをインスタンス化するときに発生します。また、オブジェクトがインスタンス化されるとき、lengthとwithに値をまだ割り当てていません。したがって、areaは常に0になります。代わりに、そのステートメントを回答関数の内部に移動してください。

  • 回答方法で実際のコンポーネントをフレームに追加するのを忘れました。したがって、フレームを表示に設定すると、空のフレームのみが表示されます。

いくつかの適切な変更の例を次に示します。

public void answer(){
    int area = (int) (length * width);  //  <--- Move this inside answer method
    JFrame answer = new JFrame();
    answer.setBackground(Color.yellow);
    JPanel pan2 = new JPanel();
    JLabel howanswer = new JLabel("Your answer is" + area + "We got this by multiplying the length and width");
    pan2.add(howanswer);
    answer.add(pan2); //  <--- Don't forget to add your components to the frame
    answer.pack();    //  <--- Resize the frame to a suitable size
    answer.setVisible(true); //  <--- Set the frame to visible AFTER you have added the components

}
于 2012-07-05T07:48:58.217 に答える
0

このコードは私のために働きます:

public class Test {
    public static void main(String[] args){
        JFrame test = new JFrame();
        test.setVisible(true);
        test.setSize(100,100);
        test.setResizable(false);
        test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

コードを減らして、そのような方法で問題点を見つけようとすることができると思います。setVisible(true)呼び出されたことを確認するために、いくつかのログを記録できます。またsetDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);、GUI の終了後にスレッドを終了するために使用することをお勧めします (終了後のアクションを実行したくない場合)。

于 2012-07-05T07:22:26.210 に答える