Frage

Ich habe die Punkte am Ende der GenerateButton Klasse, aber jetzt, da ich habe meine öffentliche double [] [] Matrix mit allen Punkten in, wo tun sie beginne ich Zeichnung ???

meine 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);
     }
}

meine 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]);
                }
            }
        }
    }
}
War es hilfreich?

Lösung

Ich bin nicht ganz sicher, was Sie fragen. Normalerweise Sie alle Zeichnungsfunktionalität in der paint () Methode setzen. Sie mögen jedoch im Allgemeinen aus dem AWT Dispatch Thread jede langen laufende Arbeit zu halten, die der gleiche Thread ist, dass Ihre Tasten actionPerformed () -Methode wird aufgerufen, auf. Um Ihr Programm reagiert, zu halten, können Sie es zu einem Swingworker delegieren möchten.

Wenn Ihre App nicht angezeigt werden, ist es wahrscheinlich, weil Sie nicht pack () und show () (in dieser Reihenfolge) bei der Initialisierung Ihres JPanel des genannt haben. Im Allgemeinen sollten Sie dies als das letzte, was in Ihrer Methode init () tun. Hinzufügen von Komponenten danach oder das Ändern Ihrer Komponenten Zustand irgendwo, sondern in dem AWT-Thread danach kann AWT verursachen bei Ihnen zu wütend und eine Ausnahme aus.

Wenn Sie fragen, wie die Punkte sich zu ziehen, sollten Sie in Graphics.drawPolyline aussehen () und die damit verbundenen Methoden, die Sie aus Ihrer Farbe () -Methode aufrufen sollte.

Wenn Sie sich fragen, wie sie ziehen aus dem Tastenhandler, nicht wahr. Sie rufen repaint () und lassen Sie das Objekt selbst auf seine eigene Zeit neu streichen. Auch in Ihrem Fall würde ich nicht die Mühe subclasing JButton. Nur Action implementieren. In dir () Methode init, erstellen nur zwei Tasten und Ihre Zuhörer mit ihnen registrieren. Das bedeutet auch, dass Sie müssen nicht ihre Konstrukteure außer Kraft setzen.

Auch Maske, die Sie während Ihrer init () Methode einreichen: es nie referenziert wird und weder ist BPanel. Außerdem würde ich einen separaten X- und Y-Array verwenden, anstatt zu versuchen, sie zu einer einzigen Matrix zu kombinieren. Sie müssen keine Matrix erklären öffentlich sein, da die inneren Klassen bereits es trotzdem sehen können. In der Tat kann man (und wahrscheinlich sollte) erklären alle Felder privat. Sie haben auch viel zu viele magische Zahlen herum schwimmen und Sie Schaukel viel zu viel kämpfen: lass es einfach tun es Aufgabe all deine Sachen zu legen. Sie sollten auch versuchen, das kleinste mögliche Problem zeigen, dass Sie uns Ihr Problem beantworten kann. Diese eine Art von Strömungen des ganzen Ort und sind schwer zu folgen

Oh, und der wahre Grund, warum Ihre Linien nicht gezogen werden: Sie rufen Ihre JPanel neu streichen und nicht die JFrame, die Sie wollen auf zeichnen. Wenn Sie nur repaint () aufrufen, statt points.repaint () die JFrame kümmert sich der Zeichnung und alle seine Kinder.

Andere Tipps

Sie sollten eine neue Komponente erstellen und die Punkte dort zeichnen, nicht in dem Rahmen selbst ein.

Lesen Sie diese:

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

Und dann können Sie diese verwenden:

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

Und fügen Sie das Objekt mit dem Rahmen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top