أين يجب أن أبدأ الرسم؟ (جافا، واجهة المستخدم الرسومية)

StackOverflow https://stackoverflow.com/questions/383995

سؤال

لدي النقاط بحلول نهاية فئة GenerateButton ولكن الآن بعد أن حصلت على مصفوفة مزدوجة [] [] [] [] [] [] [] من خلال كل النقاط، أين أبدأ في رسمها ؟؟

بلدي 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]);
                }
            }
        }
    }
}
هل كانت مفيدة؟

المحلول

أنا لست متأكدا تماما ما تسأله. عادة، يمكنك وضع كل وظيفة الرسم في طريقة الطلاء (). ومع ذلك، فإنك تريد عموما الاحتفاظ بأي تشغيل مدفوع طويل من مؤشر ترابط إرسال AWT وهو نفس مؤشر الترابط الذي يتم الاحتجاج بهذه الطريقة التي يتم الاحتجاز بها. للحفاظ على استجابة البرنامج الخاص بك، قد ترغب في تفويضها إلى SwingWorker.

إذا لم يتم عرض تطبيقك، فمن المحتمل أن تكون قد تسمى حزمة () وإظهار () (في هذا الترتيب) أثناء تهيئة JPanel الخاص بك. بشكل عام، يجب عليك القيام بذلك كآخر شيء في طريقة INIT (). إضافة مكونات بعد ذلك أو تغيير مكوناتك الدولة في أي مكان ولكن في مؤشر ترابط AWT بعد ذلك قد يتسبب ذلك في أن تغضب منك ورمي استثناء.

إذا كنت تسأل كيفية رسم النقاط نفسها، فيجب عليك النظر في الرسومات .Drawpolyline () والأساليب ذات الصلة، والتي يجب عليك الاتصال بها من داخل طريقة الطلاء ().

إذا كنت تسأل كيفية رسمها من داخل معالج الزر، فأنت لا تفعل ذلك. يمكنك استدعاء إعادة رسم () ودع الكائن إعادة رسم نفسه في وقته. أيضا، في حالتك، لن أزعج صفوتون فرعي. مجرد تنفيذ ActionListener. في You Iit () طريقة، ما عليك سوى إنشاء زرين وتسجيل المستمعين معهم. هذا يعني أيضا أنه ليس لديك لتجاوز منشئتهم.

أيضا، يمكنك إخفاء إرسال خلال طريقة INIT () الخاصة بك: لا يشار إليها أبدا ولا BPANEL. أيضا، أود استخدام مجموعة X و Y منفصلة بدلا من محاولة الجمع بينها في مصفوفة واحدة. لا تحتاج إلى إعلان مصفوفة أن تكون عامة لأن الطبقات الداخلية يمكن أن ترى بالفعل على أي حال. في الواقع، يمكنك (وربما يجب) تعلن جميع الحقول أن تكون خاصة. لديك أيضا الكثير من الأرقام السحرية تطفو وأنت تقاتل الطريق المتأرجح أكثر من اللازم: فقط دعها تدع مهمة تضع جميع الأشياء الخاصة بك. يجب أن تحاول أيضا إظهار أصغر مشكلة محتملة تسمح لنا بالإجابة على مشكلتك: هذا النوع من التدفقات من كل مكان ويصعب اتباعه.

أوه، والسبب الحقيقي وراء عدم رسم خطوطك: يمكنك استدعاء إعادة رسم على JPanel وليس JFrame الذي تريد الاستفادة منه. إذا كنت تستدعي Repaint () بدلا من النقاط. Repaint () سيعتني JFrame برسم نفسها وكل أطفالها.

نصائح أخرى

يجب عليك إنشاء مكون جديد ورسم النقاط هناك، وليس في الإطار بنفسه.

اقرا هذا:

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

ثم يمكنك استخدام هذا:

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

وأضف هذا الكائن إلى الإطار.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top