-2

GenerateButton クラスの終わりまでにポイントを取得しましたが、すべてのポイントを含む public double[][] マトリックスを取得したので、どこから描画を開始すればよいでしょうか?

私のMain.java:

import java.awt.*;
import javax.swing.*;

public class Main {
     public static Display display = new Display();

     public static void main(String[] args) {
         display.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        display.setVisible(true);
     }
}

私のDisplay.java:

import java.awt.*;
import java.awt.event.*;
import java.awt.dnd.*;
import java.util.Vector;

import javax.swing.*;

public class Display extends JFrame {
    final int FRAME_WIDTH = 910;
    final int FRAME_HEIGHT = 660;
    final int X_OFFSET = 40;
    final int Y_OFFSET = 40;

    final int GRAPH_OFFSETX = 15;
    final int GRAPH_OFFSETY = 40;
    final int GRAPH_WIDTH = 500;
    final int GRAPH_HEIGHT = 500;
    final int GRAPH_INTERVAL = 20;

    JButton submit;
    JTextField numPoint;
    JPanel bpanel;
    JPanel points;
    Vector<JTextField> pointsA = new Vector<JTextField>();
    int maxPoints;
    public double[][] matrix;

    public Display() {
        init();
    }

    public void init() {
        setBackground(Color.WHITE);
        setLocation(X_OFFSET, Y_OFFSET);
        setSize(FRAME_WIDTH, FRAME_HEIGHT);
        setTitle("Geometric Transformations");
        getContentPane().setLayout(null);
        setDefaultLookAndFeelDecorated(true);

        numPoint = new JTextField();
        numPoint.setText("# Points?");
        numPoint.setBounds(530,200,120+20,25);

        SubmitButton submit = new SubmitButton("Submit");
        submit.setBounds(530+150, 200, 100, 25);

        GenerateButton submitC = new GenerateButton("Generate");
        submitC.setBounds(530-5, 200+130, 100, 25);

        points = new JPanel(new GridLayout(2,2));
        points.setBounds(530, 200+40,100+270,80);

        this.add(numPoint);
        this.add(submit);
        this.add(submitC);
        this.add(points, BorderLayout.LINE_START);

        repaint();
    }

    public void paint(Graphics g) {
        super.paint(g);
        g.setColor(Color.WHITE);
        g.fillRect(100, 100, 20, 30);
        g.setColor(Color.BLACK);
        genGraph(g, GRAPH_OFFSETX, GRAPH_OFFSETY,
                 GRAPH_WIDTH, GRAPH_HEIGHT, GRAPH_INTERVAL);
    }

    public void genGraph (Graphics g, int x, int y,
                          int width, int height, int interval) {
        // draw background
        int border = 5;
        g.setColor(Color.BLACK);
        width = width - (width % interval);
        height = height - (height % interval);
        for (int col=x; col <= x+width; col+=interval) {
            g.drawLine(col, y, col, y+height);
        }
        for (int row=y; row <= y+height; row+=interval) {
            g.drawLine(x, row, x+width, row);
        }
    }
    class SubmitButton extends JButton implements ActionListener {

        public SubmitButton(String title){
            super(title);
            addActionListener(this);
        }
        public void actionPerformed (ActionEvent e) {
            maxPoints = Integer.parseInt(numPoint.getText()) * 2;

            points.removeAll();        // clear JPanel so results from last aren't appended to
                                // delete this line and first enter 2 then 10 for # points
            for (int i=0; i<maxPoints; i++) {
                JTextField textField = new JTextField();
                points.add(textField);        // add to JPanel that gets displayed
                pointsA.add(textField);        // for getting values from later
            }

            matrix = new double[2][pointsA.size()/2];       // setting up dimension of matrix double[][]

            points.validate();
            points.repaint();

            // What to Check:
            // Things between commas are either spaces (which will be stripped later)
            // or numbers!

            // Pairs must match up!
        }
    }
    class GenerateButton extends JButton implements ActionListener {
        public GenerateButton (String title) {
            super(title);
            addActionListener(this);
        }
        public void actionPerformed (ActionEvent e) {
            int c=0;
            for (int i=0; i<pointsA.size()/2; i++) {
                JTextField pointTF = pointsA.get(i);
                Double point = Double.parseDouble(pointTF.getText());
                matrix[0][c] = point;
                c++;
            }
            c=0;
            for (int i=pointsA.size()/2; i<pointsA.size(); i++) {
                JTextField pointTF = pointsA.get(i);
                Double point = Double.parseDouble(pointTF.getText());
                matrix[1][c] = point;
                c++;
            }
            for (int i=0; i<matrix.length; i++) {
                for (int j=0; j<matrix[0].length; j++) {
                    System.out.println("i:"+i+"\t"+"j:"+j);
                    System.out.println("      "+matrix[i][j]);
                }
            }
        }
    }
}
4

2 に答える 2

4

あなたが何を求めているのか正確にはわかりません。通常、すべての描画機能を paint() メソッドに入れます。ただし、通常は、ボタンの actionPerformed() メソッドが呼び出されるのと同じスレッドである AWT ディスパッチ スレッドから長時間実行される作業を保持する必要があります。プログラムの応答性を維持するために、プログラムを SwingWorker に委譲することができます。

アプリが表示されない場合は、JPanel の初期化中に pack() と show() を (この順序で) 呼び出していないことが原因である可能性があります。通常、これは init() メソッドの最後に行う必要があります。後でコンポーネントを追加したり、この後に AWT スレッド以外の場所でコンポーネントの状態を変更したりすると、AWT が怒って例外をスローする可能性があります。

ポイント自体を描画する方法を知りたい場合は、Graphics.drawPolyline() および関連するメソッドを調べて、paint() メソッド内から呼び出す必要があります。

ボタンハンドラー内からそれらを描画する方法を尋ねている場合は、そうしません。repaint() を呼び出して、オブジェクトが独自のタイミングで再描画できるようにします。また、あなたの場合、私はわざわざ JButton をサブクラス化しません。actionListener を実装するだけです。init() メソッドでは、2 つのボタンを作成し、リスナーをそれらに登録するだけです。これは、コンストラクターをオーバーライドする必要がないことも意味します。

また、init() メソッド中に送信をマスクします。参照されることはなく、bpanel も参照されません。また、X と Y の配列を 1 つの行列に結合するのではなく、別々に使用します。いずれにせよ、内部クラスは既にマトリックスを参照できるため、マトリックスをパブリックとして宣言する必要はありません。実際、すべてのフィールドを非公開として宣言することができます (そしておそらく宣言する必要があります)。また、あまりにも多くのマジック ナンバーが飛び交っていて、あまりにも多くの Swing と戦っています。また、私たちがあなたの問題に答えることができるように、可能な限り最小の問題を示してみてください。

ああ、あなたの線が描かれていない本当の理由: 描画したい JFrame ではなく、JPanel で repaint を呼び出します。points.repaint() の代わりに repaint() を呼び出すと、JFrame はそれ自体とそのすべての子の描画を処理します。

于 2008-12-21T03:51:49.620 に答える
2

フレーム自体ではなく、新しいコンポーネントを作成し、そこにドットを描画する必要があります。

これを読む:

http://java.sun.com/products/jfc/tsc/articles/painting

そして、これを使用できます:

http://java.sun.com/javase/6/docs/api/java/awt/Canvas.html

そして、そのオブジェクトをフレームに追加します。

于 2008-12-22T21:06:03.603 に答える