calling a java method to draw graphics
Remove test_string from FrameTest class. Set test_string directly using set method. See example:
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test {
public static void main(String[] args) {
FrameTest1 test_frame = new FrameTest1();
test_frame.setContentString("I WANT TO DRAW THIS STRING");
}
}
class FrameTest1 extends JFrame {
private static final long serialVersionUID = 1L;
Painting painting = new Painting();
public FrameTest1() {
JFrame gui = new JFrame();
gui.setTitle("Test Title");
gui.setSize(400, 400);
gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container pane = gui.getContentPane();
pane.setLayout(new GridLayout(1, 1));
pane.add(painting);
gui.setVisible(true);
}
public void setContentString(String value) {
painting.test_string = value;
}
}
class Painting extends JPanel {
private static final long serialVersionUID = 1L;
String test_string;
public Painting() {
setBackground(Color.WHITE);
this.test_string = "TEMP STRING FROM PANEL";
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
g.drawString(test_string, 20, 20);
}
}
Here you are assigning a a string to test_string
in FrameTest
which is not updating the variable of the same name in Painting
:
test_frame.test_string = "I WANT TO DRAW THIS STRING";
Why not add an update method to FrameTest
as you have a reference to this:
public void setTestString(String test_string) {
painting.setTestString(test_string);
}
and call:
FrameTest test_frame = new FrameTest();
test_frame.setTestString("I WANT TO DRAW THIS STRING");
Note: Java uses CamelCase, e.g. testString
You can pass the text you want to draw to the Painting class via constructor and pass the painting to FrameSet the same way as well.
To learn more read about java constructors and parameters read this: http://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html
I've modified your code to do what you needed, I haven't tested it though.
import java.awt.*;
import javax.swing.*;
public class Test {
public static void main(String[] args) {
Painting painting = new Painting("I WANT TO DRAW THIS STRING");
FrameTest test_frame = new FrameTest(painting);
}
}
class FrameTest extends JFrame{
private static final long serialVersionUID = 1L;
String test_string;
public FrameTest(painting){
super();
this.test_string = "TEMP STRING FROM FRAME";
JFrame gui = new JFrame();
gui.setTitle("Test Title");
gui.setSize(400,400);
gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container pane = gui.getContentPane();
pane.setLayout(new GridLayout(1,1));
pane.add(painting);
gui.setVisible(true);
}
}
class Painting extends JPanel{
private static final long serialVersionUID = 1L;
String test_string;
public Painting(String test_string){
super();
this.test_string = test_string;
setBackground(Color.WHITE);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
g.drawString(test_string, 20, 20);
}
}
For example, setting a String variable to be printed, or the coordinates of a rectangle.
Create a BufferedImage
in main(String[])
, have a method to Painting.setImage(Image)
, display the image in a JLabel
.
This is more versatile in that it could accept an image of a string, or an image of an ellipse, or an image of a string over part of an ellipse over a gradient BG..
Displaying many images
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.util.Random;
public class ImageViewer {
JPanel gui;
/** Displays the image. */
JLabel imageCanvas;
/** Set the image as icon of the image canvas (display it). */
public void setImage(Image image) {
imageCanvas.setIcon(new ImageIcon(image));
}
public void initComponents() {
if (gui==null) {
gui = new JPanel(new BorderLayout());
gui.setBorder(new EmptyBorder(5,5,5,5));
imageCanvas = new JLabel();
JPanel imageCenter = new JPanel(new GridBagLayout());
imageCenter.add(imageCanvas);
JScrollPane imageScroll = new JScrollPane(imageCenter);
imageScroll.setPreferredSize(new Dimension(300,100));
gui.add(imageScroll, BorderLayout.CENTER);
}
}
public Container getGui() {
initComponents();
return gui;
}
public static Image getRandomImage(Random random) {
int w = 100 + random.nextInt(400);
int h = 50 + random.nextInt(200);
BufferedImage bi = new BufferedImage(
w,h,BufferedImage.TYPE_INT_RGB);
return bi;
}
public static void main(String[] args) throws Exception {
Runnable r = new Runnable() {
@Override
public void run() {
JFrame f = new JFrame("Image Viewer");
// TODO Fix kludge to kill the Timer
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final ImageViewer viewer = new ImageViewer();
f.setContentPane(viewer.getGui());
f.pack();
f.setLocationByPlatform(true);
f.setVisible(true);
ActionListener animate = new ActionListener() {
Random random = new Random();
@Override
public void actionPerformed(ActionEvent arg0) {
viewer.setImage(getRandomImage(random));
}
};
Timer timer = new Timer(1500,animate);
timer.start();
}
};
SwingUtilities.invokeLater(r);
}
}