Java / Swing проблема с PaintComponent - PullRequest
0 голосов
/ 06 апреля 2010

Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь заставить paintComponent рисовать круг только тогда, когда мышь щелкают, перетаскивают, а затем отпускают. Однако внутри моего класса paintPanel мне нужно инициализировать созданный мной объект (например, MoveCircle myCircle = new MoveCircle (0,0,0,0);), просто создав объект MoveCircle myCircle; выдает ошибку, пока я полностью не инициализирую объект значением.

Что я ищу: Что считается лучшей практикой для этой проблемы. Я не хочу рисовать что-либо ненужное до того, как оно понадобится.

Как я знаю, как это исправить: логические значения внутри paintComponent, поэтому он не будет отображаться, пока что-то не будет на самом деле.

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

public class drawCircle extends JFrame{
    private JPanel myPanel = new paintPanel();

    public drawCircle(){
        add(myPanel);
    }

    private class paintPanel extends JPanel{
        private int x1, y1, x2, y2;
        movedText myText = new movedText(0,0,0,0);
        movedCircle myCircle = new movedCircle(0,0,0,0);

        public paintPanel(){
            addMouseListener(new MouseAdapter(){
                public void mousePressed(MouseEvent e){
                    x1 = e.getX();
                    y1 = e.getY();
                    myCircle = new movedCircle(x1, y1, 0, 0);
                    repaint();
                }
                public void mouseReleased(MouseEvent e){
                    x2 = e.getX();
                    y2 = e.getY();
                    myCircle = new movedCircle(x1, y1, x2, y2);
                    repaint();
                }
            });

            addMouseMotionListener(new MouseMotionAdapter(){
                public void mouseDragged(MouseEvent e){
                    x2 = e.getX();
                    y2 = e.getY();
                    myText = new movedText(x1, y1, x2, y2);
                    myCircle = new movedCircle(x1, y1, x2, y2);
                    repaint();
                }
                public void mouseMoved(MouseEvent e){
                    x1 = e.getX();
                    y1 = e.getY();
                    x2 = 0;
                    y2 = 0;

                    myText = new movedText(x1, y1, x2, y2);
                    repaint();
                }
            });
        }

        protected void paintComponent(Graphics g){
            super.paintComponent(g);
            //draw oval after mouse released
            myText.paintText(g);
            myCircle.paintCircle(g);
        }
    }

    class movedCircle{
        private int x1, y1, x2, y2;

        public movedCircle(int x1, int y1, int x2, int y2){
            this.x1 = x1;
            this.y1 = y1;
            this.x2 = x2;
            this.y2 = y2;
        }

        public void paintCircle(Graphics g){
            g.drawOval(x1, y1, x2 - x1, y2 - y1);
        }
    }
    class movedText{
        private int x1, y1, x2, y2;

        public movedText(int x1, int y1, int x2, int y2){
            this.x1 = x1;
            this.y1 = y1;
            this.x2 = x2;
            this.y2 = y2;
        }

        public void paintText(Graphics g){
            g.drawString("x1: "+x1+" y1: "+y1+" x2: "+x2+" y2: "+y2, x1, y1);
        }
    }

    class RedSquare{
        private int xPos = 50;
        private int yPos = 50;
        private int width = 20;
        private int height = 20;

        public void setX(int xPos){ 
            this.xPos = xPos;
        }

        public int getX(){
            return xPos;
        }

        public void setY(int yPos){
            this.yPos = yPos;
        }

        public int getY(){
            return yPos;
        }

        public int getWidth(){
            return width;
        } 

        public int getHeight(){
            return height;
        }

        public void paintSquare(Graphics g){
            g.setColor(Color.RED);
            g.fillRect(xPos,yPos,width,height);
            g.setColor(Color.BLACK);
            g.drawRect(xPos,yPos,width,height);  
        }
    }

    public static void main(String[] args){
        JFrame frame = new drawCircle();

        frame.setTitle("Is in ellipse? Demo");
        frame.setSize(400, 400);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

Ответы [ 2 ]

0 голосов
/ 06 апреля 2010

Не уверен, что я пропустил точку, но если вы не хотите рисовать что-либо, пока оно не будет инициализировано, не делайте этого! Можете ли вы не просто проверить, был ли он создан, а не создать новый экземпляр, который не находится в пригодном для использования состоянии после завершения работы конструктора? например,

super.paintComponent(g);
myText.paintText(g);
if (myCircle != null) {
    myCircle.paintCircle(g);
}
0 голосов
/ 06 апреля 2010

Я бы пошел с if с, но вопрос в том, где.

  1. Вы можете добавить их к paintPanel.paintComponent()
  2. вы можете добавить их к movedCircle.paint() и ничего не рисовать, если его координаты фиктивные (например, <0). То же самое с <code>movedText

В качестве альтернативы, расположите свои фигуры в разумном месте начала.

(Есть еще одно решение: подкласс movedCircle с nullMovedCircle, который ничего не рисует, и сначала создать его в paintPanel. Однако создание нового класса для такого небольшого изменения поведения кажется излишним для меня.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...