java 调用java方法绘制图形
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/13460705/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
calling a java method to draw graphics
提问by waspinator
I'm trying out to draw some simple graphics to a frame. I would also like to be able to adjust what I'm drawing from my main method. For example, setting a String variable to be printed, or the coordinates of a rectangle.
我正在尝试将一些简单的图形绘制到框架中。我还希望能够调整我从我的主要方法中绘制的内容。例如,设置要打印的字符串变量,或矩形的坐标。
The problem I seem to be having is that the paintComponent
method is called before I can set class variables. How would I change this code to be able to set up the JPanel
/JFrame
variables BEFORE it draws to screen?
我似乎遇到的问题是该paintComponent
方法在我可以设置类变量之前被调用。我将如何更改此代码以便能够在它绘制到屏幕之前设置JPanel
/JFrame
变量?
Thanks
谢谢
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);
}
}
回答by Reimeus
Here you are assigning a a string to test_string
in FrameTest
which is not updating the variable of the same name in Painting
:
在这里,你要分配AA串test_string
在FrameTest
未更新相同名称的变量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:
为什么不添加一个更新方法,FrameTest
因为您对此有参考:
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
注意:Java 使用 CamelCase,例如 testString
回答by Micha? Ziober
Remove test_string from FrameTest class. Set test_string directly using set method. See example:
从 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);
}
}
回答by Andrew Thompson
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
.
创建一个BufferedImage
in main(String[])
,有一个方法Painting.setImage(Image)
,在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..
这更通用,因为它可以接受字符串的图像,或椭圆的图像,或渐变 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);
}
}
回答by vrepsys
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.
您可以通过构造函数将要绘制的文本传递给 Paint 类,并以相同的方式将绘画传递给 FrameSet。
To learn more read about java constructors and parameters read this: http://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html
要了解有关 Java 构造函数和参数的更多信息,请阅读以下内容: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);
}
}