Как объединить paintComponent (Graphics g) с MouseListener и MouseMotionListener

Итак, я пытаюсь совместить использование paintComponent(), а также использование MouseListener и MouseActionListener, но я получаю много ошибок при запуске, и это не работает, как я этого хочу. В частности, в этом коде я хочу, чтобы программа, когда вы нажимаете, перетаскиваете и отпускаете кнопку, получала координаты нажатия, затем координаты отпускания, затем измеряла размер фигуры и рисовала указанную форму. с помощью JComboBox. У меня также есть выбор цвета с помощью кнопки внизу JFrame. Я хочу знать, как я могу запустить метод paintComponent(), чтобы он не запускался автоматически, чтобы я мог дать ему спецификации до того, как он будет рисовать, и заставить его рисовать по требованию. Кроме того, я хочу знать, есть ли другой способ сделать это, и я совершенно не прав в отношении того, как я к этому подхожу. Надеюсь, объяснение не было слишком запутанным :). Любая помощь велика, спасибо!

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

@SuppressWarnings({"unchecked", "rawtypes"})
public class GraphicGUI extends JPanel implements ActionListener  {

    HandlerClass handler = new HandlerClass();

    public int x1, x2, y1, y2, width, height;
    public String event;
    public JButton colorChooserButton;
    public Color color = (Color.WHITE);
    public JComboBox shapeBox;
    public JLabel eventLabel;


    public GraphicGUI(){
        shapeBox = new JComboBox();
        eventLabel = new JLabel();
        colorChooserButton = new JButton("Choose a color");
        colorChooserButton.addActionListener(this);

        shapeBox.addItem("Oval");
        shapeBox.addItem("Rectangle");
        shapeBox.addItem("Line");

        super.addMouseListener(handler);
        super.addMouseMotionListener(handler);
    }

    public void actionPerformed(ActionEvent arg0){
        if(arg0.getSource().equals(colorChooserButton)){
            color = JColorChooser.showDialog(null, "Pick Your Color", color);
            if(color==null){
                color = (Color.BLACK);
            }
        }
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        this.setBackground(Color.white);
        if(shapeBox.getSelectedItem() == "Oval")
            if(event.equals("released")){
                width = x1-x2;
                height = y1-y2;
                g.setColor(color);
                g.fillOval(x1, y1, width, height);
            }
    }

    private class HandlerClass implements MouseListener, MouseMotionListener{

            //Mouse Events
            public void mouseClicked(MouseEvent arg0){
                event = "click";
            }
            public void mousePressed(MouseEvent arg0){
                event = "pressed";
                x1 = arg0.getX();
                y1 = arg0.getY();
                eventLabel.setText(String.format("Mouse pressed at %d, %d", x1, y1));
            }
            public void mouseReleased(MouseEvent arg0){
                event = "released";
                x2 = arg0.getX();
                y2 = arg0.getY();
                eventLabel.setText(String.format("Mouse released at %d, %d", x2, y2));
            }
            public void mouseEntered(MouseEvent arg0){
            }
            public void mouseExited(MouseEvent arg0){
            }

            //Mouse Motion Events
            public void mouseDragged(MouseEvent arg0){
            }
            public void mouseMoved(MouseEvent arg0){
            }

    }
}

person Mattis    schedule 23.04.2013    source источник
comment
Вы должны сказать более точно, что делает ваш код прямо сейчас, т.е. он падает, рисует что-то и т. д.   -  person fstamour    schedule 24.04.2013


Ответы (1)


Вы должны получить, чтобы нарисовать форму, чтобы начать.

public void paintComponent(Graphics g){
    //Draw the oval
    g.setColor(color);
    g.fillOval(x1, y1, width, height);
}

public void mouseReleased(MouseEvent arg0){
    event = "released";
    x2 = arg0.getX();
    y2 = arg0.getY();       
    if( x2 > x1 ) {
        width = x2-x1;
    } else {
        width = x1-x2;
    }       
    if( y2 > y1 ) {
        height = y2-y1;
    } else {
        height = y1-y2;
    }
    eventLabel.setText(String.format("Mouse released at %d, %d", x2, y2));  
}

Затем (если вы хотите добавить больше фигур) вам нужен способ добавить форму (да), таким образом, вы можете иметь список форм и перебирать этот список.

И вы действительно должны (должны) инициализировать все ваши переменные.

Спросите, хотите ли вы получить более подробную информацию. :)

person fstamour    schedule 23.04.2013
comment
Да, проблема в том, как мне вызвать метод paintComponent, потому что, когда я пытаюсь выполнить g.SetColor() или g.fillOval(), g выдает ошибку, потому что это пустая переменная (не существует ), так что я не могу просто так это назвать :/ - person Mattis; 24.04.2013
comment
Я сделал еще одну правку. Я думаю, что проблема у вас была в том, что когда-то у вас было отрицательное измерение. - person fstamour; 24.04.2013
comment
это работает в теории, но когда вы запускаете программу, как она есть, она не сможет нарисовать овал, потому что метод paintComponent() запускается до события MouseEvent, и событие не запускает его, поэтому вот где Я застрял :/ - person Mattis; 24.04.2013
comment
Попробуйте добавить repaint() в mouseReleased() - person fstamour; 24.04.2013