首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java Graphics尝试绘制矩形

Java Graphics尝试绘制矩形
EN

Stack Overflow用户
提问于 2018-07-26 05:13:51
回答 2查看 278关注 0票数 1

我的目标是创建一个包含矩形的类,然后使用它并在其他类中更改它。我试着写这段代码并创建一个Rect rect = new Rect();对象,但是当我启动程序时,矩形并没有显示出来。我也试着用window.add(rect);添加它,但遇到了同样的问题,我确定我做错了什么,但我真的不知道是什么。

我尝试的另一件事是从其他类Rect.drawRect(g);调用方法,但它要求“参数”,如果我像在方法drawRect中那样添加参数g,它会显示"g无法解析为变量“。

我希望有人能解释并告诉我我做错了什么,如果知道如何制作矩形或圆形,然后在其他类中使用它,可能还会改变它的颜色和大小,那就太好了,我只在一个类中发现了如何做。

代码语言:javascript
复制
import javax.swing.JFrame;

public class Main extends Rect{

    public static void main(String[] args ) {

        JFrame window = new JFrame("test");
        window.setSize(1000, 800);
        window.setVisible(true);
        window.setResizable(false);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Rect rect = new Rect();
    }   
}

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

public class Rect extends JPanel{

    public void drawRect(Graphics g){
        g.setColor(Color.RED);
        g.fillRect(100, 100, 200, 200); 
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-26 07:19:16

最重要的是,您需要编写一些代码来完成绘制。这是通过在你的Rect类中重写paintComponent方法来完成的,有点像这样:

代码语言:javascript
复制
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.RED);
        g.fillRect(100, 100, 200, 200); 
    }

您的第二个问题是,您希望能够从其他类中更改矩形的颜色和大小。举个简单的例子,这可以通过在Rect类中添加一些静态值来轻松实现:

代码语言:javascript
复制
    public static Color myColor = Color.RED;
    public static int myX = 100;
    public static int myY = 100;
    public static int myWidth = 200;
    public static int myHeight = 200;

现在更新您的paint方法以使用静态值:

代码语言:javascript
复制
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(myColor);
        g.fillRect(myX, myY, myWidth, myHeight); 
    }

现在,无论何时何地使用Rect面板,它都会根据静态值显示矩形。

例如,下面是一个简单的工作程序,请注意它是如何使用以下内容的:

代码语言:javascript
复制
    //create Rect
    Rect rect = new Rect();
    //set the size of the new panel
    rect.setPreferredSize(new Dimension(800, 600));
    //add the rect to your JFrame
    window.add(rect);
    //now you can change the color for all Rect instances
    //Note how I use Rect instead of rect, however, both will work.
    Rect.myColor = Color.BLUE;
    //And dont forget to repaint it if you want to see the changes immediatly
    rect.repaint();

完整示例,main类:

代码语言:javascript
复制
import javax.swing.JFrame;
import java.awt.Color;

public class Main{

    //Note how we don't need to extend the Rect class (It just adds confusion)
    public static void main(String[] args ) {

        JFrame window = new JFrame("test");
        window.setSize(1000, 800);
        window.setVisible(true);
        window.setResizable(false);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //create Rect
        Rect rect = new Rect();
        //set the size of the new panel
        rect.setPreferredSize(new Dimension(800, 600));
        //add the rect to your JFrame
        window.add(rect);


        //now you can change the color for all Rect instances
        //Note how I use Rect instead of rect, however both will work.
        Rect.myColor = Color.BLUE;
        //And dont forget to update it
        rect.repaint();
    }
}

和Rect类:

代码语言:javascript
复制
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

public class Rect extends JPanel{
    public static Color myColor = Color.RED;
    public static int myX = 10;
    public static int myY = 10;
    public static int myWidth = 200;
    public static int myHeight = 200;

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(myColor);
        g.fillRect(myX, myY, myWidth, myHeight); 
    }
}

注意,如果您不想每次更改颜色/大小时都调用Rect.repaint(),那么只需创建一个更改每个值并包含repaint()的新方法,例如:

代码语言:javascript
复制
public void changeWidth(int width){
    myWidth  = width;
    repaint();
}
票数 0
EN

Stack Overflow用户

发布于 2018-07-26 05:48:20

UDP:您需要重写void paintComponent(Graphics g)而不是void drawRect(Graphics g),并在方法内部调用super.paintComponent(g)。然后你就可以使用window.add(rect);了。感谢@FredK更正

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51527748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档