-
Add drawing function MouseMotionEventListener program?
Posting this again since my original post accidentally got removed!
So I'm using these 2 pre-written demo-files:
Java Tutorials Sample Code
Java Tutorials Sample Code
if you go to this webpage you'll see an image of what the applet does: How to Write a Mouse-Motion Listener (The Java™ Tutorials > Creating a GUI With JFC/Swing > Writing Event Listeners)
What I'm trying to do is just add the ability to draw when the mouse is clicked (dragged), nothing fancy, just a black line. Maybe add a reset button or something, but I've had no luck!
I don't need any sort of super deep help, I just want to be able to draw on the yellow space :(
-
Re: Add drawing function MouseMotionEventListener program?
Please post your code and ask questions about your problems.
-
Re: Add drawing function MouseMotionEventListener program?
Quote:
Originally Posted by
Norm
Please post your code and ask questions about your problems.
I posted the code in the links, I took out my code because it was basic java stuff, using Graphics G and drawLine using the previous X,Y coords and the current ones
-
Re: Add drawing function MouseMotionEventListener program?
Post the code here that you are having problems with. No links. Also post the full text of any error messages you are having problems with.
Or if you are still trying to design the program, ask some specific questions about the problems you are having.
-
Re: Add drawing function MouseMotionEventListener program?
Should I post the full code of both java files? One just sets the blank area for the applet and the other does all the dirty work
-
Re: Add drawing function MouseMotionEventListener program?
Post the code you are working on.
-
Re: Add drawing function MouseMotionEventListener program?
void eventOutput(String eventDescription, MouseEvent e) {
textArea.append(eventDescription
+ " (" + e.getX() + "," + e.getY() + ")"
+ " detected on "
+ e.getComponent().getClass().getName()
+ NEWLINE);
lastX = e.getX();
lastY = e.getY();
textArea.setCaretPosition(textArea.getDocument().g etLength());
}
public void mouseMoved(MouseEvent e) {
eventOutput("Mouse moved", e);
}
public void mouseDragged(MouseEvent e) {
eventOutput("Mouse dragged", e);
}
private class MyListener extends MouseInputAdapter {
public void mousePressed(MouseEvent e) {
repaint();
}
}
public void paint(Graphics g, MouseEvent e){
g.setColor(Color.black);
drawCoordinates(g,e);
}
private void drawCoordinates(Graphics g, MouseEvent e){
g.drawLine(lastX, lastY, e.getX(), e.getY());
}
}
This is the code I'm working on, no errors, just no output. Like I said I'm a Java newbie.
I can't figure out exactly what I have to do to get this thing to draw properly
-
Re: Add drawing function MouseMotionEventListener program?
You need to post a complete program if you want anyone to help with the testing.
What code calls the paint() method in the code? That method does not override the Component class's paint method and will not be called by the java program. See the API doc for the correct signature for the method's definition.
Use the @Override notation on a line before the definition of any methods that you are trying to override to have the compiler check that the override is valid.
Also be sure to wrap your code with
[code=java]
<YOUR CODE HERE>
[/code]
to get highlighting and preserve formatting.
This tutorial might help: http://docs.oracle.com/javase/tutori...ing/index.html
-
Re: Add drawing function MouseMotionEventListener program?
Code java:
package events;
/*
* MouseMotionEventDemo.java
*
*/
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.*;
import javax.swing.event.MouseInputAdapter;
public class MouseMotionEventDemo extends JPanel
implements MouseMotionListener {
BlankArea blankArea;
JTextArea textArea;
int lastX=0, lastY=0;
static final String NEWLINE = System.getProperty("line.separator");
public static void main(String[] args) {
/* Use an appropriate Look and Feel */
try {
//UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
//UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
} catch (UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
} catch (IllegalAccessException ex) {
ex.printStackTrace();
} catch (InstantiationException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
/* Turn off metal's use of bold fonts */
UIManager.put("swing.boldMetal", Boolean.FALSE);
//Schedule a job for the event dispatch thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("MouseMotionEventDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create and set up the content pane.
JComponent newContentPane = new MouseMotionEventDemo();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public MouseMotionEventDemo() {
super(new GridLayout(0,1));
blankArea = new BlankArea(Color.YELLOW);
add(blankArea);
textArea = new JTextArea();
textArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(textArea,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scrollPane.setPreferredSize(new Dimension(200, 75));
add(scrollPane);
//Register for mouse events on blankArea and panel.
blankArea.addMouseMotionListener(this);
addMouseMotionListener(this);
setPreferredSize(new Dimension(450, 450));
setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
}
void eventOutput(String eventDescription, MouseEvent e) {
textArea.append(eventDescription
+ " (" + e.getX() + "," + e.getY() + ")"
+ " detected on "
+ e.getComponent().getClass().getName()
+ NEWLINE);
lastX = e.getX();
lastY = e.getY();
textArea.setCaretPosition(textArea.getDocument().getLength());
}
public void mouseMoved(MouseEvent e) {
eventOutput("Mouse moved", e);
}
public void mouseDragged(MouseEvent e) {
eventOutput("Mouse dragged", e);
}
private class MyListener extends MouseInputAdapter {
public void mousePressed(MouseEvent e) {
repaint();
}
}
public void paint(Graphics g, MouseEvent e){
g.setColor(Color.black);
drawCoordinates(g,e);
}
private void drawCoordinates(Graphics g, MouseEvent e){
g.drawLine(lastX, lastY, e.getX(), e.getY());
repaint();
}
}
There's the complete code; like I said I'm not very good with java so I honestly barely know where to start. I've looked up tons of stuff on paint() and Graphics g and such, and I've gotten it to work by itself (just a simple whiteboard app), but I cannot seem to get it to work here. I think the problem is I just don't know where exactly to put things
-
Re: Add drawing function MouseMotionEventListener program?
I'm pretty sure my paint and drawCoordinates functions are completely wrong, I was just trying things to get it to work
EDIT: heres the BlankArea.Java code, this is needed also
Code java:
package events;
/*
* BlankArea.java is used by:
* MouseEventDemo.java.
* MouseMotionEventDemo.java
*/
import javax.swing.*;
import java.awt.Dimension;
import java.awt.Color;
import java.awt.Event;
import java.awt.Graphics;
public class BlankArea extends JLabel {
Dimension minSize = new Dimension(100, 50);
public BlankArea(Color color) {
setBackground(color);
setOpaque(true);
setBorder(BorderFactory.createLineBorder(Color.black));
}
}
-
Re: Add drawing function MouseMotionEventListener program?
Did you read all of my last post? There is a link to the tutorial you should read.
If you have questions about the rest of my last post you need to ask. Otherwise I assume you understand what I said and are going to change your program to fix the problems I pointed out.
-
Re: Add drawing function MouseMotionEventListener program?
I read that and am working through it, this is what I have so far and I'm getting an error on "frame.add(new MyPanel());"
The error is "non-static variable this cannot be referenced from a static context"
Code java:
package events;
/*
* MouseMotionEventDemo.java
*
*/
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.*;
import javax.swing.event.MouseInputAdapter;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
public class MouseMotionEventDemo extends JPanel
implements MouseMotionListener {
BlankArea blankArea;
JTextArea textArea;
int lastX=0, lastY=0;
static final String NEWLINE = System.getProperty("line.separator");
public static void main(String[] args) {
/* Use an appropriate Look and Feel */
try {
//UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
//UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
} catch (UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
} catch (IllegalAccessException ex) {
ex.printStackTrace();
} catch (InstantiationException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
/* Turn off metal's use of bold fonts */
UIManager.put("swing.boldMetal", Boolean.FALSE);
//Schedule a job for the event dispatch thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("MouseMotionEventDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create and set up the content pane.
JComponent newContentPane = new MouseMotionEventDemo();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
//Display the window.
frame.pack();
frame.add(new MyPanel());
frame.setVisible(true);
}
public MouseMotionEventDemo() {
super(new GridLayout(0,1));
blankArea = new BlankArea(Color.YELLOW);
add(blankArea);
textArea = new JTextArea();
textArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(textArea,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scrollPane.setPreferredSize(new Dimension(200, 75));
add(scrollPane);
//Register for mouse events on blankArea and panel.
blankArea.addMouseMotionListener(this);
addMouseMotionListener(this);
setPreferredSize(new Dimension(450, 450));
setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
}
void eventOutput(String eventDescription, MouseEvent e) {
textArea.append(eventDescription
+ " (" + e.getX() + "," + e.getY() + ")"
+ " detected on "
+ e.getComponent().getClass().getName()
+ NEWLINE);
lastX = e.getX();
lastY = e.getY();
textArea.setCaretPosition(textArea.getDocument().getLength());
}
public void mouseMoved(MouseEvent e) {
eventOutput("Mouse moved", e);
}
public void mouseDragged(MouseEvent e) {
eventOutput("Mouse dragged", e);
}
private class MyListener extends MouseInputAdapter {
public void mousePressed(MouseEvent e) {
repaint();
}
}
class MyPanel extends JPanel {
public MyPanel() {
setBorder(BorderFactory.createLineBorder(Color.black));
}
public Dimension getPreferredSize() {
return new Dimension(450,450);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString("Custom Panellll", 10, 20);
}
}
}
the code Im having issues with is in the createAndShowGUI function
-
Re: Add drawing function MouseMotionEventListener program?
Quote:
"non-static variable this cannot be referenced from a static context"
Can you post the full text of the error message that shows where it happens?
The error happens when code in a static method (like main()) tries to access a variable in a class without creating an instance of the class first. If there is no instance of the class, the variable does not exist yet.
-
Re: Add drawing function MouseMotionEventListener program?
The error is "C:\Users\Chris\Desktop\events-MouseEventDemoProject\events-MouseEventDemoProject\src\events\MouseMotionEventD emo.java:102: error: non-static variable this cannot be referenced from a static context
frame.add(new MyPanel()); "
-
Re: Add drawing function MouseMotionEventListener program?
The MyPanel class only exists when there is an instance of the MouseMotionEventDemo class.
Either move its definition outside the MouseMotionEventDemo class's definition or make it static.
-
Re: Add drawing function MouseMotionEventListener program?
Yup that solved the error! But now that it runs, the text that i have it drawing doesn't show up?
Code java:
/*
* Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of Oracle or the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package events;
/*
* MouseMotionEventDemo.java
*
*/
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.*;
import javax.swing.event.MouseInputAdapter;
import java.awt.Color;
import java.awt.Graphics;
import java.util.HashSet;
import java.util.Set;
import javax.swing.JPanel;
class MyPanel extends JPanel {
public MyPanel() {
setBorder(BorderFactory.createLineBorder(Color.black));
}
@Override
public Dimension getPreferredSize() {
return new Dimension(450,450);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.black);
g.drawString("Custom Panellll", 100, 200);
}
}
public class MouseMotionEventDemo extends JPanel
implements MouseMotionListener {
BlankArea blankArea;
JTextArea textArea;
static final String NEWLINE = System.getProperty("line.separator");
public static void main(String[] args) {
/* Use an appropriate Look and Feel */
try {
//UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
//UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
} catch (UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
} catch (IllegalAccessException ex) {
ex.printStackTrace();
} catch (InstantiationException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
/* Turn off metal's use of bold fonts */
UIManager.put("swing.boldMetal", Boolean.FALSE);
//Schedule a job for the event dispatch thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("MouseMotionEventDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create and set up the content pane.
JComponent newContentPane = new MouseMotionEventDemo();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public MouseMotionEventDemo() {
super(new GridLayout(0,1));
blankArea = new BlankArea(Color.YELLOW);
add(blankArea);
textArea = new JTextArea();
textArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(textArea,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scrollPane.setPreferredSize(new Dimension(200, 75));
add(scrollPane);
//Register for mouse events on blankArea and panel.
blankArea.addMouseMotionListener(this);
addMouseMotionListener(this);
setPreferredSize(new Dimension(450, 450));
setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
}
void eventOutput(String eventDescription, MouseEvent e) {
textArea.append(eventDescription
+ " (" + e.getX() + "," + e.getY() + ")"
+ " detected on "
+ e.getComponent().getClass().getName()
+ NEWLINE);
textArea.setCaretPosition(textArea.getDocument().getLength());
}
public void mouseMoved(MouseEvent e) {
eventOutput("Mouse moved", e);
}
public void mouseDragged(MouseEvent e) {
eventOutput("Mouse dragged", e);
}
private class MyListener extends MouseInputAdapter {
@Override
public void mousePressed(MouseEvent e) {
repaint();
}
}
}
as you can see i moved the MyPanel class above the MouseMotionEventDemo class.
-
Re: Add drawing function MouseMotionEventListener program?
Quote:
the text that i have it drawing doesn't show up?
What text and where is it being drawn?
-
Re: Add drawing function MouseMotionEventListener program?
in the public void paintComponent I have the drawString try to draw "Custom Panellll" at 100,200
-
1 Attachment(s)
Re: Add drawing function MouseMotionEventListener program?
That's strange. It worked for the code posted in post#12.
What did you change besides moving the location of the MyPanel class definition?
-
Re: Add drawing function MouseMotionEventListener program?
Edit: nevermind I recopied the code from post 12 and it works just like you showed, but Id like the text to be IN the area above the box that shows the coords
-
1 Attachment(s)
Re: Add drawing function MouseMotionEventListener program?
Attachment 1400
so here i'd want it to be in the yellow area
-
Re: Add drawing function MouseMotionEventListener program?
Look at the attached image in post#19. It shows the text being drawn. That from the code in post#12.
Look at the code in post #12 and see what has been changed.
How many versions of the code do you have? It's best to only have one to keep from getting confused.
I created a simple BlankArea class for testing and commented out the yellow bit.
-
Re: Add drawing function MouseMotionEventListener program?
Quote:
Originally Posted by
Norm
Look at the attached image in post#19. It shows the text being drawn. That from the code in post#12.
Look at the code in post #12 and see what has been changed.
How many versions of the code do you have? It's best to only have one to keep from getting confused.
I created a simple BlankArea class for testing and commented out the yellow bit.
I got it to work in post 21 :)
But i'd still like the text to be drawn inside the yellow area
-
Re: Add drawing function MouseMotionEventListener program?
Quote:
i'd want it to be in the yellow area
You need to post the code for the class the defines the yellow area.
The drawString() call in MyPanel works. Have you tried copying that code?
-
Re: Add drawing function MouseMotionEventListener program?
Code java:
public MouseMotionEventDemo() {
super(new GridLayout(0,1));
blankArea = new BlankArea(Color.YELLOW);
add(blankArea);
textArea = new JTextArea();
textArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(textArea,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scrollPane.setPreferredSize(new Dimension(200, 75));
add(scrollPane);
//Register for mouse events on blankArea and panel.
blankArea.addMouseMotionListener(this);
addMouseMotionListener(this);
setPreferredSize(new Dimension(450, 450));
setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
}
thats what creates the yellow area