0

テキスト フィールドはメインに対してローカルであるため、actionPerformed からアクセスできません。インスタンス変数にする必要があると思いますが、フレームもメインにあるため、どのようにすればよいかわかりません。フレームに追加します。

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;
import java.net.*;
import java.sql.*;
import java.lang.Object;
import java.awt.Graphics;
import java.awt.Graphics2D;

/**
 * This class demonstrates how to load an Image from an external file
 */
public class Test extends JPanel {

    int x=77, y=441, w=23, h=10;

    BufferedImage img =
  new BufferedImage(100, 50,
                    BufferedImage.TYPE_INT_ARGB);    
   // BufferedImage img;

    public void paintComponent(Graphics g) {
        g.drawImage(img, 0, 0, null);
           // g.fillRect(10,10,10,10);
    }

    public Test() {
       try {
           img = ImageIO.read(new File("sales-goal.png"));
       } catch (IOException e) {}


       Graphics2D g = img.createGraphics();
       Color myColor = Color.decode("#32004b");
       g.setColor(myColor);
       g.fillRect(x,y,w,h);
                //77,441,23,10
    }

    public Dimension getPreferredSize() {
        if (img == null) {
             return new Dimension(100,100);
        } else {
           //return new Dimension(img.getWidth(null), img.getHeight(null));
            return new Dimension(300,600);
       }
    }

    public static void main(String[] args) {


        JFrame f = new JFrame("Load Image Sample");
        JTextField textField=new JTextField();
        f.add(textField);
        textField.setBounds(10,10,40,30);
        textField.setVisible(true);

        f.addWindowListener(new WindowAdapter(){
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });

        f.add(new Test());
        f.pack();
        f.setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
               //if (e.getSource() == textField) {}

    }
}
4

3 に答える 3

0

フレームを作成し、コンストラクター内で初期化します。

public static void main(String[] args) {
    new Test();
}
于 2012-04-15T13:41:13.173 に答える
0

このようにスイングアプリケーションをセットアップするべきではないと思います。メソッドですべてを作成する代わりにmain、JFrame のサブクラスを作成し、そのコンストラクタ (またはそのようなもの) で初期化を行う必要があります。このクラスは、含まれるコンポーネントへの参照を保持できます。例:

public class TestFrame extends JFrame {

    private JTextField textField;

    public TestFrame() {
        super("Load Image Sample");
        textField = new JTextField();
        this.add(textField);
        textField.setBounds(10,10,40,30);
        textField.setVisible(true);

        this.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        this.add(new Test());
        this.pack();
        this.setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == textField) {
            // ...
        }
    }
}
于 2012-04-14T07:37:48.193 に答える
-1

イベント処理メソッドactionPerformedは、インターフェイスで登録する必要がありActionListenerます。textField と Test はどちらも JFrame のコンポーネントであるため、論理的な場所は JFrame、またはすべてを結び付ける別のコントローラー クラスになります。

いくつかの詳細について、より従来のアプローチでコードを書き直しました。そのために、新しいクラス MyFrame を導入しました。

public class MyFrame extends JFrame implements ActionListener {

    JTextField textField = new JTextField();

    public MyFrame(String title) {
        super(title); // Or constructor without parameters and:
        setTitle("Load Image Sample");

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //setLayout(...); for instance with null for absolute positioning

        add(textField);
        textField.setBounds(10, 10, 40, 30);
        textField.setVisible(true);

        Test panel = new Test();
        add(panel);

        pack();
    }

    public static void main(String[] args) {
        JFrame f = new MyFrame("Load Image Sample");
        f.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Text: " + textField.getText());
    }
}

そしてあなたのJPanel

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;


/**
* This class demonstrates how to load an Image from an external file
*/
class Test extends JPanel {

    int x = 77, y = 441, w = 23, h = 10;
    BufferedImage img;
    Color myColor = Color.decode("#32004b");

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(myColor);
        g.fillRect(x, y, w, h);

        g.drawImage(img, 0, 0, null);
        // g.fillRect(10,10,10,10);
    }

    public Test() {
        setBackground(Color.red);
        try {
            img = ImageIO.read(new File("sales-goal.png"));
        } catch (IOException e) {
            img = new BufferedImage(100, 50, BufferedImage.TYPE_INT_ARGB);
        }
        setPreferredSize(new Dimension(300, 600));
    }
}
于 2012-04-14T08:09:39.287 に答える