Java JFrame绘图

Java JFrame绘图,java,swing,graphics,jframe,paint,Java,Swing,Graphics,Jframe,Paint,我目前正在使用JFrame并试图绘制一个矩形,但我不知道如何执行代码paint(Graphics g),如何获取Graphics对象 package com.raggaer.frame; import java.awt.Dimension; import java.awt.Graphics; import javax.swing.JFrame; public class Frame { private JFrame frame; public Frame() {

我目前正在使用
JFrame
并试图绘制一个矩形,但我不知道如何执行代码
paint(Graphics g)
,如何获取
Graphics
对象

package com.raggaer.frame;

import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JFrame;

public class Frame {

    private JFrame frame;

    public Frame() {

        this.frame = new JFrame("Java Snake");
        this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.frame.setSize(new Dimension(500, 500));

        // DRAW??

        this.frame.setVisible(true);

    }

    public void paint(Graphics g) {

        g.drawRect(10, 10, 200, 200);
    }
}

只需调用
frame.repaint()
(应该自动调用一次)即可重新绘制图形。无需提供自己的
图形
对象

请注意,您应该将
JPanel
paintComponent(Graphics)
一起使用。这将使事件的处理变得更加容易,特别是对于像snake这样的游戏


下面是一个关于堆栈溢出的小代码示例:

我用Java 8制作了一个:

import javax.swing.*;
import java.awt.*;

/**
 * @author Obicere
 */
public class PaintExample {

    public PaintExample() {

        final JFrame frame = new JFrame("Paint Example");
        final MyPanel panel = new MyPanel();

        frame.add(panel);

        frame.pack();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(final String[] args) {
        SwingUtilities.invokeLater(PaintExample::new);
    }


    public class MyPanel extends JPanel {

        @Override
        public void paintComponent(final Graphics g) {
            super.paintComponent(g);

            g.setColor(Color.YELLOW);
            g.fillOval(0, 0, 50, 50);
            g.setColor(Color.BLACK);
            g.drawOval(0, 0, 50, 50);

            g.drawLine(20, 10, 20, 20);
            g.drawLine(30, 10, 30, 20);

            g.drawArc(15, 15, 20, 20, 180, 180);


            g.drawString("Drawing with swing!", 10, 100);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }

    }
}


应您的要求,我还修改了程序,以便根据请求显示对象:

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.LinkedList;

/**
 * @author Obicere
 */
public class PaintExample {


    public PaintExample() {
        final JFrame frame = new JFrame("Paint Example");
        final MyPanel panel = new MyPanel();

        frame.add(panel);

        frame.pack();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(final String[] args) {
        SwingUtilities.invokeLater(PaintExample::new);
    }


    public class MyPanel extends JPanel {

        private final LinkedList<SmileyFace> faces;

        public MyPanel() {
            faces = new LinkedList<>();
            addMouseListener(new MouseAdapter() {
                @Override
                public void mousePressed(MouseEvent e) {
                    faces.add(new SmileyFace(e.getX(), e.getY()));
                    MyPanel.this.repaint(); // Refresh the display on the screen
                }
            });
        }

        @Override
        public void paintComponent(final Graphics g) {
            super.paintComponent(g);
            faces.stream().forEach((e) -> e.render(g));
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }

    }

    public class SmileyFace {

        private final int x;
        private final int y;

        public SmileyFace(final int x, final int y) {
            this.x = x;
            this.y = y;
        }

        public void render(final Graphics g) {

            g.setColor(Color.YELLOW);
            g.fillOval(x, y, 50, 50);
            g.setColor(Color.BLACK);
            g.drawOval(x, y, 50, 50);

            g.drawLine(x + 20, y + 10, x + 20, y + 20);
            g.drawLine(x + 30, y + 10, x + 30, y + 20);

            g.drawArc(x + 15, y + 15, 20, 20, 180, 180);
        }

    }

}
import javax.swing.*;
导入java.awt.*;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.util.LinkedList;
/**
*@author Obicere
*/
公共类绘画示例{
公共绘画范例(){
最终JFrame=新JFrame(“绘制示例”);
最终MyPanel面板=新MyPanel();
框架。添加(面板);
frame.pack();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
公共静态void main(最终字符串[]args){
调用器(PaintExample::new);
}
公共类MyPanel扩展了JPanel{
私人最终链接列表面;
公共事务委员会(){
faces=新的LinkedList();
addMouseListener(新的MouseAdapter(){
@凌驾
公共无效鼠标按下(MouseEvent e){
添加(新的笑脸(e.getX(),e.getY());
MyPanel.this.repaint();//刷新屏幕上的显示
}
});
}
@凌驾
公共组件(最终图形g){
超级组件(g);
faces.stream().forEach((e)->e.render(g));
}
@凌驾
公共维度getPreferredSize(){
返回新维度(400400);
}
}
公共类笑脸{
私人最终int x;
私人终审法院;
公众笑脸(最终整型x,最终整型y){
这个.x=x;
这个。y=y;
}
公共空间渲染(最终图形g){
g、 setColor(颜色为黄色);
g、 椭圆形(x,y,50,50);
g、 设置颜色(颜色为黑色);
g、 牵引椭圆(x,y,50,50);
g、 抽绳(x+20,y+10,x+20,y+20);
g、 抽绳(x+30,y+10,x+30,y+20);
g、 牵引弧(x+15,y+15,20,20,180,180);
}
}
}

只需调用
frame.repaint()
(应自动调用一次)即可重新绘制图形。无需提供自己的
图形
对象

请注意,您应该将
JPanel
paintComponent(Graphics)
一起使用。这将使事件的处理变得更加容易,特别是对于像snake这样的游戏


下面是一个关于堆栈溢出的小代码示例:

我用Java 8制作了一个:

import javax.swing.*;
import java.awt.*;

/**
 * @author Obicere
 */
public class PaintExample {

    public PaintExample() {

        final JFrame frame = new JFrame("Paint Example");
        final MyPanel panel = new MyPanel();

        frame.add(panel);

        frame.pack();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(final String[] args) {
        SwingUtilities.invokeLater(PaintExample::new);
    }


    public class MyPanel extends JPanel {

        @Override
        public void paintComponent(final Graphics g) {
            super.paintComponent(g);

            g.setColor(Color.YELLOW);
            g.fillOval(0, 0, 50, 50);
            g.setColor(Color.BLACK);
            g.drawOval(0, 0, 50, 50);

            g.drawLine(20, 10, 20, 20);
            g.drawLine(30, 10, 30, 20);

            g.drawArc(15, 15, 20, 20, 180, 180);


            g.drawString("Drawing with swing!", 10, 100);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }

    }
}


应您的要求,我还修改了程序,以便根据请求显示对象:

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.LinkedList;

/**
 * @author Obicere
 */
public class PaintExample {


    public PaintExample() {
        final JFrame frame = new JFrame("Paint Example");
        final MyPanel panel = new MyPanel();

        frame.add(panel);

        frame.pack();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(final String[] args) {
        SwingUtilities.invokeLater(PaintExample::new);
    }


    public class MyPanel extends JPanel {

        private final LinkedList<SmileyFace> faces;

        public MyPanel() {
            faces = new LinkedList<>();
            addMouseListener(new MouseAdapter() {
                @Override
                public void mousePressed(MouseEvent e) {
                    faces.add(new SmileyFace(e.getX(), e.getY()));
                    MyPanel.this.repaint(); // Refresh the display on the screen
                }
            });
        }

        @Override
        public void paintComponent(final Graphics g) {
            super.paintComponent(g);
            faces.stream().forEach((e) -> e.render(g));
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }

    }

    public class SmileyFace {

        private final int x;
        private final int y;

        public SmileyFace(final int x, final int y) {
            this.x = x;
            this.y = y;
        }

        public void render(final Graphics g) {

            g.setColor(Color.YELLOW);
            g.fillOval(x, y, 50, 50);
            g.setColor(Color.BLACK);
            g.drawOval(x, y, 50, 50);

            g.drawLine(x + 20, y + 10, x + 20, y + 20);
            g.drawLine(x + 30, y + 10, x + 30, y + 20);

            g.drawArc(x + 15, y + 15, 20, 20, 180, 180);
        }

    }

}
import javax.swing.*;
导入java.awt.*;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.util.LinkedList;
/**
*@author Obicere
*/
公共类绘画示例{
公共绘画范例(){
最终JFrame=新JFrame(“绘制示例”);
最终MyPanel面板=新MyPanel();
框架。添加(面板);
frame.pack();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
公共静态void main(最终字符串[]args){
调用器(PaintExample::new);
}
公共类MyPanel扩展了JPanel{
私人最终链接列表面;
公共事务委员会(){
faces=新的LinkedList();
addMouseListener(新的MouseAdapter(){
@凌驾
公共无效鼠标按下(MouseEvent e){
添加(新的笑脸(e.getX(),e.getY());
MyPanel.this.repaint();//刷新屏幕上的显示
}
});
}
@凌驾
公共组件(最终图形g){
超级组件(g);
faces.stream().forEach((e)->e.render(g));
}
@凌驾
公共维度getPreferredSize(){
返回新维度(400400);
}
}
公共类笑脸{
私人最终int x;
私人终审法院;
公众笑脸(最终整型x,最终整型y){
这个.x=x;
这个。y=y;
}
公共空间渲染(最终图形g){
g、 setColor(颜色为黄色);
g、 椭圆形(x,y,50,50);
g、 设置颜色(颜色为黑色);
g、 牵引椭圆(x,y,50,50);
g、 抽绳(x+20,y+10,x+20,y+20);
g、 抽绳(x+30,y+10,x+30,y+20);
g、 牵引弧(x+15,y+15,20,20,180,180);
}
}
}

并且不要忘记调用
super.paintComponent
(覆盖
paintComponent
是否有一种方法可以将我的图形存储在变量上,以便我以后可以修改它们?比如存储g.drawString(“score”…)来更新it@AlvaroCarvajalNakosmai您希望避免工件(调用
super.paintComponent的唯一原因)(g) 
)。最好的方法是将要绘制的内容存储为变量,然后在
paintComponent(Graphics)
中,将它们绘制到屏幕上。别忘了调用
super.paintCompon