Добавление MouseListener на панель - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь добавить действия мыши к моей панели. Вот что должна делать программа:

Напишите программу, которая позволяет пользователю указывать треугольник тремя нажатиями мыши. После первого нажатия мыши нарисуйте маленькую точку. После второго нажатия мыши нарисуйте линию, соединяющую первые две точки. После третьего нажатия мыши нарисуйте весь треугольник. Четвертое нажатие мыши стирает старый треугольник и начинает новый.

Ответы [ 5 ]

0 голосов
/ 30 апреля 2018

cam, учитывая то, что вы делаете, я запрыгнул на свою «рабочую машину» и взял этот код. Он рисует прямоугольник поверх изображения, и этот прямоугольник отображается только после того, как вы отпустите кнопку мыши (это незавершенная работа, выполняемая в свободное время для вещей, которые могут понравиться моему работодателю). Но так как вы ожидаете рисования и т. Д., Вот оно.

Использует JDialog, потому что я хотел, чтобы он был модальным; не позволяйте этому беспокоить вас.

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.GroupLayout;
import javax.swing.JDialog;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.WindowConstants;

public class RectSelectGUI extends JDialog implements MouseListener, ActionListener, WindowListener {
                private static final long serialVersionUID = 1L;
                public int overheadWd;
                public int overheadHt;
                public ImageJPanel imagePanel;
                private JMenu jMenuSelection;
                private JMenuBar jMenuBar1;
                private Dimension mouseDownLoc;
                private String errorString;

                public RectSelectGUI(String imgFileName) {
                                initComponents(imgFileName);
                }

                private void initComponents(String imgFileName) {

                                imagePanel = new ImageJPanel(imgFileName);
                                jMenuBar1 = new JMenuBar();
                                jMenuSelection = new JMenu();
        JMenuItem jMenuItemSave = new JMenuItem();
        jMenuItemSave.setActionCommand("Save");
        jMenuItemSave.addActionListener(this);
        jMenuItemSave.setText("Save");
        jMenuSelection.add(jMenuItemSave);
        JMenuItem jMenuItemCancel = new JMenuItem();
        jMenuItemCancel.setActionCommand("Cancel");
        jMenuItemCancel.addActionListener(this);
        jMenuItemCancel.setText("Cancel");
        jMenuSelection.add(jMenuItemCancel);

                                mouseDownLoc = new Dimension();
                                errorString = "No selection";

                                imagePanel.addMouseListener(this);

                                this.setModal(true);
                                this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
                                this.addWindowListener(this);

                                GroupLayout jPanel1Layout = new GroupLayout(imagePanel);
                                imagePanel.setLayout(jPanel1Layout);
                                jPanel1Layout.setHorizontalGroup(
                                                                jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING).addGap(0, 524, Short.MAX_VALUE));
                                jPanel1Layout.setVerticalGroup(
                                                                jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING).addGap(0, 370, Short.MAX_VALUE));

                                jMenuSelection.setText("Selection");
                                jMenuBar1.add(jMenuSelection);

                                setJMenuBar(jMenuBar1);

                                GroupLayout layout = new GroupLayout(getContentPane());
                                getContentPane().setLayout(layout);
                                layout.setHorizontalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                                                                .addGroup(layout.createSequentialGroup().addContainerGap()
                                                                                                .addComponent(imagePanel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                                                                                .addContainerGap()));
                                layout.setVerticalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                                                                .addGroup(layout.createSequentialGroup().addContainerGap()
                                                                                                .addComponent(imagePanel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                                                                                .addContainerGap()));

                                pack();

                                overheadWd = this.getWidth() - imagePanel.getWidth();
                                overheadHt = this.getHeight() - imagePanel.getHeight();

                }

                public String getSelectionString() {
                                if (errorString.isEmpty()) {
                                                double rectWd = (double) imagePanel.rectWd;
                                                double rectHt = (double) imagePanel.rectHt;
                                                double rectX = (double) imagePanel.rectX;
                                                double rectY = (double) imagePanel.rectY;
                                                if (Math.abs(RectSelect.displayFactor - 1.0) > 0.001) {
                                                                System.out.println("Adjusting by displayFactor (" + RectSelect.displayFactor + ")");
                                                                rectWd /= RectSelect.displayFactor;
                                                                rectHt /= RectSelect.displayFactor;
                                                                rectX /= RectSelect.displayFactor;
                                                                rectY /= RectSelect.displayFactor;
                                                }
                                                return Math.round(rectWd) + "x" + Math.round(rectHt) + "+" + Math.round(rectX) + "+" + Math.round(rectY);
                                } else {
                                                return "ERROR: " + errorString;
                                }
                }


                @Override
                public void mouseClicked(MouseEvent e) {
                                // TODO Auto-generated method stub

                }

                @Override
                public void mousePressed(MouseEvent evt) {
                                mouseDownLoc.setSize(evt.getX(), evt.getY());
                }

                @Override
                public void mouseReleased(MouseEvent evt) {
                                Dimension mouseUpLoc = new Dimension(evt.getX(), evt.getY());
                                if (mouseDownLoc.width < mouseUpLoc.width) {
                                                imagePanel.rectX = mouseDownLoc.width;
                                                imagePanel.rectWd = mouseUpLoc.width - mouseDownLoc.width;
                                } else {
                                                imagePanel.rectX = mouseUpLoc.width;
                                                imagePanel.rectWd = mouseDownLoc.width - mouseUpLoc.width;
                                }
                                if (mouseDownLoc.height < mouseUpLoc.height) {
                                                imagePanel.rectY = mouseDownLoc.height;
                                                imagePanel.rectHt = mouseUpLoc.height - mouseDownLoc.height;
                                } else {
                                                imagePanel.rectY = mouseUpLoc.height;
                                                imagePanel.rectHt = mouseDownLoc.height - mouseUpLoc.height;
                                }
                                imagePanel.haveNewRect = true;
                                imagePanel.repaint();
                                errorString = "";
                }

                @Override
                public void actionPerformed(ActionEvent evt) {
                                String cmd = evt.getActionCommand();
                                switch (cmd) {
                                case "Save":
                                                break;
                                case "Cancel":
                                                errorString = "Cancelled";
                                                break;
                                default:
                                                System.out.println("Unknown action command " + cmd);
                                }
                                this.setVisible(false);
                }

                @Override
                public void windowClosing(WindowEvent e) {
                                errorString = "Cancelled";
                                this.setVisible(false);
                }

                @Override
                public void mouseEntered(MouseEvent e) {
                                // TODO Auto-generated method stub

                }

                @Override
                public void mouseExited(MouseEvent e) {
                                // TODO Auto-generated method stub

                }

                @Override
                public void windowOpened(WindowEvent e) {
                                try {
                                                Thread.sleep(100);
                                } catch (InterruptedException e1) {
                                }
                                this.repaint();
                }

                @Override
                public void windowClosed(WindowEvent e) {
                                // TODO Auto-generated method stub

                }

                @Override
                public void windowIconified(WindowEvent e) {
                                // TODO Auto-generated method stub

                }

                @Override
                public void windowDeiconified(WindowEvent e) {
                                // TODO Auto-generated method stub

                }

                @Override
                public void windowActivated(WindowEvent e) {
                }

                @Override
                public void windowDeactivated(WindowEvent e) {
                                // TODO Auto-generated method stub

                }

}


import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JPanel;

public class ImageJPanel extends JPanel {
                private static final long serialVersionUID = 1L;
                public Image localImage;
                private int origWd;
                private int origHt;
                private int displayWd;
                private int displayHt;
                public int rectX;
                public int rectY;
                public int rectWd;
                public int rectHt;
                public boolean haveNewRect;
                private Toolkit toolkit;

                ImageJPanel(String imageFileName) {
                                toolkit = Toolkit.getDefaultToolkit();
                                localImage = toolkit.getImage(imageFileName);
                }

                protected void paintComponent(Graphics g1D) {
                                Graphics2D g;
                                g = (Graphics2D) g1D;
                                // Draw the image using the Graphics object provided
                                g.drawImage(localImage, 0, 0, getDisplayWd(), getDisplayHt(), null);
                                /*
                                * Optional label.
                                Font font = new Font("SansSerif", Font.BOLD, 24);
                                g1D.setFont(font);
                                FontMetrics metrics = g1D.getFontMetrics();
                                int ht = metrics.getHeight();
                                int wd = metrics.stringWidth(this.imageFileName);
                                g.setColor(Color.LIGHT_GRAY);
                                g.fillRect(this.getWidth() - wd - 10, this.getHeight() - ht, wd + 10, ht);
                                g1D.setColor(new Color(55, 11, 160));
                                g1D.drawString(this.imageFileName, this.getWidth() - wd - 10, this.getHeight() - ht + 20);
                    */

                                // Draw a selection rectangle if requested.
                                if (haveNewRect) {
                                                g.drawRect(rectX, rectY, rectWd, rectHt);
                                                haveNewRect = false;
                                }
                }

                public int getDisplayWd() {
                                return displayWd;
                }

                public void setDisplayWd(int displayWd) {
                                this.displayWd = displayWd;
                }

                public int getDisplayHt() {
                                return displayHt;
                }

                public void setDisplayHt(int displayHt) {
                                this.displayHt = displayHt;
                }

                public int getOrigWd() {
                                return origWd;
                }

                public void setOrigWd(int origWd) {
                                this.origWd = origWd;
                }

                public int getOrigHt() {
                                return origHt;
                }

                public void setOrigHt(int origHt) {
                                this.origHt = origHt;
                }

}
0 голосов
/ 30 апреля 2018

Вы должны зарегистрировать объект слушателя в Jpanel, используя метод addMouseListener . Больше информации;

0 голосов
/ 30 апреля 2018

Я не вижу нигде, когда вы создаете экземпляр класса MouseListen. Также вам нужно вызвать addMouseListener ().

Вот строки из того, что я написал некоторое время назад:

public class ColorPanel extends JPanel implements MouseListener {

   . . .

ColorPanel(JTextField jTextFieldColor) {
    super();
    this.jTextField = jTextFieldColor;
    addMouseListener(this);
}

@Override
public void mouseClicked(MouseEvent evt) {
    System.out.println("Instance of ColorPanel clicked.");
    jColorChooser = new JColorChooser(this.getBackground());
    this.add(jColorChooser);
    int retval = JOptionPane.showConfirmDialog(null,
            jColorChooser,
            "JOptionPane Example : ",
            JOptionPane.OK_CANCEL_OPTION,
            JOptionPane.PLAIN_MESSAGE);
    if (retval == JOptionPane.OK_OPTION) {
        jTextField.setText(Utils.hexStringFromColor(jColorChooser.getColor()));
    }
}

См. Учебник по https://docs.oracle.com/javase/tutorial/uiswing/events/mouselistener.html.

Кроме того, основываясь на https://docs.oracle.com/javase/tutorial/uiswing/events/eventsandcomponents.html,, вы можете иметь в своем JFrame реализацию MouseListener, что сделает ваш код еще проще. (Вам не понадобится класс MouseListen.)

Быстрый grep, хотя предыдущий код Java, который я написал, подтверждает, что вы могли

public class MyFrame extends JFrame implements MouseListener

так что вы можете посмотреть на это.

0 голосов
/ 30 апреля 2018

Я настоятельно рекомендую начать с прочтения Как написать прослушиватель мыши . Когда вы застряли, эти учебники (и JavaDocs) - лучшее место для начала

«Немедленный» ответ на ваш вопрос: вам нужно зарегистрировать экземпляр MouseListener с вашим компонентом, может быть что-то вроде ...

private JPanel createCenterPanel() {

    panel.addMouseListener(new MouseListen());
    //panel.setLayout(null);


    return panel;
}

Это "ответит" на вашу непосредственную проблему.

Однако вам будет трудно попытаться объединить действия MouseListener с панелью, которая должна нарисовать результаты.

Лучшим решением может быть начать с JPanel, который управляет своим собственным MouseListener

Кроме того, Graphics g = panel.getGraphics() - это не то, как должна выполняться пользовательская роспись. Посмотрите Выполнение заказной живописи для более подробной информации

Так что вместо этого это может выглядеть как ...

public class TrianglePanel extends JPanel {

    private List<Point> points = new ArrayList<>(3);

    public TrianglePanel() {
        addMouseListener(new MouseListen());
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(200, 200);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g); //To change body of generated methods, choose Tools | Templates.

        if (points.size() < 1) {
            return;
        }
        for (int index = 0; index < points.size(); index++) {
            Point nextPoint = points.get(index);
            g.fillOval(nextPoint.x - 2, nextPoint.y - 2, 4, 4);
        }

        Point startPoint = points.get(0);
        Point lastPoint = startPoint;
        for (int index = 1; index < points.size(); index++) {
            Point nextPoint = points.get(index);
            g.drawLine(lastPoint.x, lastPoint.y, nextPoint.x, nextPoint.y);
            lastPoint = nextPoint;
        }
        g.drawLine(lastPoint.x, lastPoint.y, startPoint.x, startPoint.y);
    }

    class MouseListen extends MouseAdapter {

        public void mouseReleased(MouseEvent e) {
            if (points.size() < 3) {
                points.add(e.getPoint());
                repaint();
            }
        }
    }

}
0 голосов
/ 30 апреля 2018

Я не очень знаком с Swing. Как новый программист, я работал только с JavaFX.

Однако вы нигде не упоминаете MouseListener в вашей программе. Вы, вероятно, забыли создать его экземпляр.

...