调用java方法来绘制graphics
我试图画出一些简单的graphics框架。 我也想能够调整我从我的主要方法绘制。 例如,设置要打印的stringvariables或矩形的坐标。
我似乎遇到的问题是,我可以设置类variables之前调用paintComponent
方法。 我怎样才能改变这个代码,以便能够设置JPanel
/ JFrame
variables之前,它画到屏幕?
谢谢
import java.awt.*; import javax.swing.*; public class Test { public static void main(String[] args) { FrameTest test_frame = new FrameTest(); test_frame.test_string = "I WANT TO DRAW THIS STRING"; } } class FrameTest extends JFrame{ private static final long serialVersionUID = 1L; String test_string; public FrameTest(){ 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); Painting painting = new Painting(); 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(){ 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); } }
从FrameTest类中删除test_string。 直接使用set方法设置test_string。 看例子:
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); } }
在这里你正在给test_string
中的FrameTest
分配一个string,它不会更新Painting
同名variables:
test_frame.test_string = "I WANT TO DRAW THIS STRING";
为什么不给FrameTest
添加一个更新方法,因为你有一个参考:
public void setTestString(String test_string) { painting.setTestString(test_string); }
并致电:
FrameTest test_frame = new FrameTest(); test_frame.setTestString("I WANT TO DRAW THIS STRING");
注意:Java使用CamelCase,例如testString
您可以通过构造函数将要绘制的文本传递给Painting类,并将绘画以相同的方式传递给FrameSet。
要了解更多关于Java构造函数和参数的信息,请阅读: http : //docs.oracle.com/javase/tutorial/java/javaOO/constructors.html
我已经修改了你的代码来做你需要的东西,但是我还没有testing过。
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); } }
例如,设置要打印的stringvariables或矩形的坐标。
在main(String[])
创build一个BufferedImage
,有一个方法到Painting.setImage(Image)
,在JLabel
显示图像。
这是更通用的,因为它可以接受一个string的图像,或者一个椭圆的图像,或者在梯度BG上接受一个椭圆的一部分的string的图像。
显示许多图像
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); } }