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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 12:49:32  来源:igfitidea点击:

calling a java method to draw graphics

javaswinggraphics

提问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 paintComponentmethod is called before I can set class variables. How would I change this code to be able to set up the JPanel/JFramevariables 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_stringin FrameTestwhich is not updating the variable of the same name in Painting:

在这里,你要分配AA串test_stringFrameTest未更新相同名称的变量Painting

test_frame.test_string = "I WANT TO DRAW THIS STRING";

Why not add an update method to FrameTestas 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 BufferedImagein main(String[]), have a method to Painting.setImage(Image), display the image in a JLabel.

创建一个BufferedImagein 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

显示许多图像

Many (OK 3) images

Many (OK 3) 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);
    }
}