Domanda

Ho i punti entro la fine della classe GenerateButton ma ora che ho ottenuto la mia matrice public double [] [] con tutti i punti, da dove comincio disegnarli ???

il mio 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);
     }
}

il mio 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]);
                }
            }
        }
    }
}
È stato utile?

Soluzione

Io non sono molto sicuro di cosa esattamente si sta chiedendo. Normalmente, si mette tutte le funzionalità di disegno nel metodo paint (). Tuttavia, in genere si desidera mantenere qualsiasi lavoro lungo scappare del filo spedizione AWT che è lo stesso filo che actionPerformed i pulsanti () viene richiamato il metodo on. Per mantenere il vostro programma di reattivo, si consiglia di delegare ad uno SwingWorker.

Se non viene mostrata la vostra applicazione, è probabile perché non avete chiamato pack () e show () (in questo ordine) durante l'inizializzazione del JPanel. In generale, si dovrebbe fare questo come l'ultima cosa che nel metodo init (). L'aggiunta di componenti in seguito o modificare il tuo stato componenti ovunque, ma nel thread AWT dopo questo può causare AWT per ottenere arrabbiato con te e un'eccezione.

Se ti stai chiedendo come disegnare i punti stessi, si dovrebbe guardare in Graphics.drawPolyline () ei relativi metodi, che si dovrebbe chiamare dall'interno il metodo () vernice.

Se stai chiedendo come disegnare loro dall'interno del gestore di pulsante, non è necessario. Si chiama ridipingere () e lasciare che l'oggetto stesso ridisegna il proprio tempo. Inoltre, nel tuo caso, non vorrei disturbare subclasing JButton. Basta implementare ActionListener. In te metodo init (), basta creare due pulsanti e registrare i vostri ascoltatori con loro. Questo significa anche che non c'è bisogno di ignorare i loro costruttori.

Inoltre, è mascherare metodo di invio durante l'init (): non è mai riferimento e non è né BPanel. Inoltre, userei un X separato e matrice Y piuttosto che cercare di combinare in un'unica matrice. Non è necessario dichiarare matrice per essere pubblico in quanto le classi interne possono già vedere comunque. In realtà, si può (e probabilmente dovrebbe) dichiarare tutti i campi di essere privato. Hai anche troppi numeri magici galleggianti intorno e si stanno combattendo modo swing troppo: basta lasciar fare il suo lavoro, che fissa tutte le tue cose fuori. Si dovrebbe anche provare mostrare il più piccolo possibile problema che ci permetterà di rispondere il problema:. Questo tipo di flussi di tutto il luogo ed è difficile da seguire

Oh, e la vera ragione per cui le linee non sono in fase di elaborazione: si chiama ridisegnare sulle JPanel e non il JFrame che si desidera attingere. Se basta chiamare ridisegnare () al posto di points.repaint () il JFrame si prenderà cura di disegno stesso e tutti i suoi figli.

Altri suggerimenti

È necessario creare un nuovo componente e disegnare i punti lì, non in esso Telaio sé.

Leggere questo:

http://java.sun.com/products/jfc/tsc / articoli / pittura

E quindi è possibile utilizzare questo:

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

E aggiungere l'oggetto alla cornice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top