Yeah I did that, and that's perfectly ok, for now this is just a bare bones version of something
Printable View
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.
I don't see that happen. Can you take a screen shot and attach it?Quote:
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.
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!
Code 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(); 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); } }
Attachment 1402
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.Quote:
I'm not using an arrayList at the moment mainly because I'm really not sure how to implement it,
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:
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.
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.
Call super.paintComponent(g)Quote:
How and where did you clear it?
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.Quote:
I did post my code in post #30?
maybe your BlankArea is different?
Here are the two files I'm using as of right now
MouseMotionEventDemo.java
Code 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
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; /* * 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.
Well what's different about your code and mine?
I make BlankArea an inner class.
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.
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.