I am trying to draw a grid of rectangles and I want to be able to draw them off the screen in all directions and then be able to scroll this, changing which are actually in the screen without having to redraw every frame.
Related
I’m writing code for drawing in a JPanel as if it’s a canvas, where I can create shapes by clicking inside the panel. When I click, it places the dots where I want them to go, however if I scroll and then click, it places the dots where the mouse would be if I hadn’t scrolled. I assume this is because the mouse coordinates don’t change, so I’m guessing I need to add the number of pixels I’ve scrolled (horizontally and vertically). Is there a command I can use to refer to these values?
It's been a while since I've worked with Swing, but I believe you want to call:
JScrollPane sp = ...
Point viewPosition = sp.getViewport().getViewPosition();
The viewPosition.x and .y will return the offset in pixels from the top left corner.
I am working on a program that allows the user to draw a on the canvas and the coordinates of what they drew are printed onto the screen.
My question is, If the mouse draws a line on the screen how do you print the coordinates for that line to the screen.
My idea on how to do that:
Create a JFrame,
Add JPanel and a new Layout,
Add JTextArea or similar,
Decide how frequently you want to add new coordinates (as you can't do anything continuously),
Run a Runnable which will append the text in the JTextArea or similar with current coordinates.
I am working with Java 2D graphics and having an issue.
I have a JPanel onto which I draw some images and also moving images with a Timer into the circles.
*Initially I draw the interface in paint() method. and upon button click I read data from file and then calling a function to display those images and strings in a timed controlled function.
* The issue is, My Drawing screen showing overlapping images, If I call repaint(), the screen start flicking.
I need help with adding the basic drawing as an image in the background Panel and then runtime drawing onto another overlapped but transparent panel so if I call repaint() screen behaves normally and no flickering occurs. I am attaching screenshots of the scenario.
Could anybody suggest how to add two panel so one serves a background and other works like runtime drawing onto background image panel?
I'm hope that there is swing.JPanel not awt.Panel, then to use paintComponent instead of paint
there are four ways
add any drawString or subImage/Image inside paintComponent(), prepare those Objects as local variable, inside paintComponent() only use value from these variables or loop inside prepared arrays of Objects
add JLabels (transparent, non_opaque by defaulr) with Icons/ImageIcons with text to JLabel, required to add grid of JLabels to JPanel, and on runtime to setIcon/setText to desired JLabel(s)
put JLabels to GlassPane, with rest to see in point 2nd
put JLabels to JLayer, with rest to see in point 2nd
I'm trying to make something like Battleships.
By this time I've managed to random spawn and draw them on canvas.
But there's another problem: in the game user will touch the cell and that cell will be painted as yellow (if hit) or draw a dot (if miss).
As far as I see, everything that displays on canvas must be writted in onDraw() method.
The question is: how can I make screen refresh with new data when user touches the screen?
Now the screen looks like this:
This time the ships are visible for debug
I want to create a number of straight lines connecting small circle shapes. then I want to change the color and width of the lines from within my program. I was thinking of using Canvas to do this but there does not seem to be a way to access individual shapes drawn on canvas to change their attributes after they are drawn. What would be an easy way to implement this?
First of all, what version of Java and which UI toolkit? AWT's Canvas is very dumb, it will not even "remember" what you have painted; when you minimize and restore the window, it will send a paint() event because it wants to be repainted.
The easiest way (if you are using AWT and stuck to Canvas) is to have a List of your shapes (either one list for all or one for circles and one for lines, or whatever you like) and make your paint method draw all of them. Then update the objects in your list. When you are done updating, call repaint() on your canvas and it will call paint() for you again.
You don't paint shapes onto a Canvas if you're using Graphics and Graphics2D functions like drawRect, drawPolygon, drawOval, etc. Once they're drawn, they don't exist as shapes anymore. You just have an image with filled-in pixels.
As mihi said, you may have to keep track of the shapes you're trying to draw, then regenerate your image if it changes. Perhaps you could also "unpaint" a shape you're trying to change by painting over it in the background color and repainting the changed shape.