Yeah I did that, and that's perfectly ok, for now this is just a bare bones version of something
Welcome to the Java Programming Forums
The professional, friendly Java community. 21,500 members and growing!
The Java Programming Forums are a community of Java programmers from all around the World. Our members have a wide range of skills and they all have one thing in common: A passion to learn and code Java. We invite beginner Java programmers right through to Java professionals to post here and share your knowledge. Become a part of the community, help others, expand your knowledge of Java and enjoy talking with like minded people. Registration is quick and best of all free. We look forward to meeting you.
>> REGISTER NOW TO START POSTING
Members have full access to the forums. Advertisements are removed for registered users.
Yeah I did that, and that's perfectly ok, for now this is just a bare bones version of something
But how do i make it so the mouse tracking text doesn't pop up to the drawing area and glitch out?
Its frail and subject to java recreating a clean graphics context which will lose the old lines.
If you don't understand my answer, don't ignore it, ask a question.
I don't see that happen. Can you take a screen shot and attach it?make it so the mouse tracking text doesn't pop up to the drawing area and glitch out?
Call the super method and draw the whole screen from the arraylist.
If you don't understand my answer, don't ignore it, ask a question.
I'm not using an arrayList at the moment mainly because I'm really not sure how to implement it, but here's the code and a screenshot of what's happening!
package events; /* * MouseMotionEventDemo.java * */ import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import javax.swing.*; import java.awt.Color; import java.awt.Graphics; import javax.swing.JPanel; import java.util.*; public class MouseMotionEventDemo extends JPanel implements MouseMotionListener { BlankArea blankArea; JTextArea textArea; int lastX=0, lastY=0, currX=0, currY=0; ArrayList al = new ArrayList(); Object ia[] = al.toArray(); 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.BLUE); 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); record(e.getX(),e.getY()); } @Override public boolean mouseDown(Event e, int x, int y){ return(record(x,y)); } @Override public boolean mouseEnter(Event e, int x, int y) { return(record(x, y)); } public void mouseDragged(MouseEvent e) { eventOutput("Mouse dragged", e); currX = e.getX(); currY = e.getY(); repaint(); } @Override public void paintComponent(Graphics g) { //super.paintComponent(g); g.drawLine(currX, currY, lastX, lastY); record(currX,currY); } protected boolean record(int x, int y){ lastX = x; lastY = y; return(true); } }
Untitled2.jpg
This is with the super.paintComponent call commented out. If i leave it in it just draws between the current and last point and doesn't save, but if i comment it out, it saves and this happens
Time for some reading. The java tutorial, the API doc and what Search finds here or with Google.I'm not using an arrayList at the moment mainly because I'm really not sure how to implement it,
If you don't understand my answer, don't ignore it, ask a question.
Im a bit confused though, why does it work just how I want without super.paintComponent called? besides the whole screen glitching out
Strange that the top component has the text area with scroll bars.
Here's what I get:
If you don't understand my answer, don't ignore it, ask a question.
thats literally exactly what I want to happen lol
I don't know what java does with the graphics between calls to paintComponent().
I've always cleared it to get rid of any left over garbage and to be sure I had control over what was being drawn on the screen.
If you don't understand my answer, don't ignore it, ask a question.
How and where did you clear it?
If you want testers to use the same code as you are using, you need to post it.
If you don't understand my answer, don't ignore it, ask a question.
Call super.paintComponent(g)How and where did you clear it?
If you don't understand my answer, don't ignore it, ask a question.
I did post my code in post #30?
Ah, but then when I call super.painComponent(g) the whole thing doesn't save as i said before, hm.
Post #30 doesn't have a definition for BlankArea. All the testing classes should be together.I did post my code in post #30?
maybe your BlankArea is different?
If you don't understand my answer, don't ignore it, ask a question.
Here are the two files I'm using as of right now
MouseMotionEventDemo.java
package events; /* * MouseMotionEventDemo.java * */ import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import javax.swing.*; import java.awt.Color; import java.awt.Graphics; import javax.swing.JPanel; import java.util.*; public class MouseMotionEventDemo extends JPanel implements MouseMotionListener { BlankArea blankArea; JTextArea textArea; int lastX=0, lastY=0, currX=0, currY=0; ArrayList al = new ArrayList(50000); Object ia[] = al.toArray(); 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.BLUE); 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); record(e.getX(),e.getY()); } @Override public boolean mouseDown(Event e, int x, int y){ return(record(x,y)); } @Override public boolean mouseEnter(Event e, int x, int y) { return(record(x, y)); } public void mouseDragged(MouseEvent e) { eventOutput("Mouse dragged", e); currX = e.getX(); currY = e.getY(); repaint(); } @Override public void paintComponent(Graphics g) { //super.paintComponent(g); g.drawLine(currX, currY, lastX, lastY); record(currX,currY); } protected boolean record(int x, int y){ lastX = x; lastY = y; return(true); } }
and BlankArea.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; /* * BlankArea.java is used by: * MouseEventDemo.java. * MouseMotionEventDemo.java */ import java.awt.Color; import java.awt.Dimension; import javax.swing.*; public class BlankArea extends JLabel { Dimension minSize = new Dimension(100, 50); public BlankArea(Color color) { setBackground(color); setOpaque(false); setBorder(BorderFactory.createLineBorder(Color.black)); } }
I don't get the textArea display at the top.
If you don't understand my answer, don't ignore it, ask a question.
Well what's different about your code and mine?
I make BlankArea an inner class.
If you don't understand my answer, don't ignore it, ask a question.
How did you do that?
nvm I figured it out, but it still gives me that weird textArea thing
Can't your textarea up top not be explained Norm by the fact that super.paintComponent() is commented out?
Move your GUI below the toolbar and see if it inherits that look, or the textarea distorts.
Please use [highlight=Java]//code goes here...[/highlight] tags when posting your code
I haven't experimented with leaving out the call to super.paintComponent(). The current program doesn't misbehave on my 1.6 or 1.7 systems.
Java could be doing weird things on the graphics.
The OP is fighting a bug/feature that doesn't need to be fought.
If you don't understand my answer, don't ignore it, ask a question.