有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java试图在加载时在自己身上绘制一个窗口

这比我想象的要困难得多。我只是在学习画图的功能。我想要的是一个程序启动一个包含(比如)矩形的窗口。该矩形的大小将根据窗口的大小进行缩放(即,如果窗口为1000px,且矩形设置为90%,则矩形将为900px)。我已经计算出如何居中并确定它的大小,但是通过使用存根,我发现使用对象。getWidth()和height等每次都返回0,这完全是大小调整的数学运算

在考虑了一段时间之后,我假设这是因为它试图从一个仍在构建的对象获得宽度和高度。按照我自己的逻辑,只要在构造函数的构建部分之后进行计算,就应该可以了,但唉,我似乎错了

我尝试创建单独的类来创建一个框架和一个绘制图形的类。绘图对象接受JFrame作为构造函数的一部分,并尝试在其上绘图。我分别实例化了每一个对象,首先是frame,然后是drawing对象(将frame对象发送给它),但这似乎也不起作用

有什么建议吗

编辑:

按照安德鲁的建议。这是要添加到窗口的面板对象

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

public class MyDrawing extends JPanel
{

    public MyDrawing() throws HeadlessException
    {
        this.setVisible(true);
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponents(g);
        //set scaling
        int usrScale = 90;
        int scaleRef = (100 - usrScale) / 2;
        int xStart = this.getWidth() * (scaleRef / 100);
        int yStart = this.getHeight() * (scaleRef / 100);
        int width = (usrScale / 100) * this.getWidth();
        int height = (usrScale / 100) * this.getHeight(); 

        //draw square outline
        g.setColor(Color.green);
        g.fillRect(xStart, yStart, width, height);
    }
}

这是添加jpanel对象的窗口:

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

public class DrawThis extends JFrame
{
    MyDrawing drawing;

    public DrawThis() throws HeadlessException
    {
        drawing = new MyDrawing();
        this.add(drawing);
    }
}

那发射器呢

package scaling_test;

public class ScaleTest
{
    public static void main(String[] args)
    {
        DrawThis program = new DrawThis();
        program.setBounds(250, 250, 800, 600);
        program.setVisible(true);
    }
}

更新的面板(仍不工作):

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

public class MyDrawing extends JPanel
{

    public MyDrawing() throws HeadlessException
    {
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponents(g);

        //set scaling
        int usrScale = 90;
        int scaleRef = (100 - usrScale) / 2;
        int xStart = this.getWidth() * scaleRef / 100;
        int yStart = this.getHeight() * scaleRef / 100;

        int width = usrScale * this.getWidth() / 100;
        int height = usrScale * this.getHeight() / 100;

        //draw square outline
        g.setColor(Color.green);
        g.fillRect(xStart, yStart, width, height);
    }
}

共 (3) 个答案

  1. # 1 楼答案

    在添加到JFrameJPanelpaintComponent(Graphics)方法中进行计算。只有当组件在屏幕上“实现”后,才会调用paintComponent()方法

  2. # 2 楼答案

    不查看代码有点棘手,但一个选项是设置PreferredSize(x,y);在JFrame上,然后调用pack();之后,你可以检查窗户大小

  3. # 3 楼答案

    为什么要使用getGraphics(…)方法时,该组件(…)方法是否传递给图形对象?另外,你应该调用super。paintComponent(g)作为方法中的第一个语句。我不知道你为什么评论它

    阅读Swing教程中关于Custom Painting的部分,了解工作示例

    如果您需要更多帮助,请发布SSCCE,这样我们就不会一直猜测您的实际代码是什么样子

    编辑:

    是否添加了任何显示语句来查看drawRect(…)中使用的值方法有意义吗?不要以为你的数学公式是正确的。首先,您需要了解整数计算的工作原理:

    //        int width = (usrScale / 100) * this.getWidth();
    //        int height = (usrScale / 100) * this.getHeight();
            int width = usrScale * this.getWidth() / 100;
            int height = usrScale * this.getHeight() / 100;
    

    在注释掉的代码中(usrScale/100)=0,因为该值在乘法完成之前被转换为整数