当前位置: 首页 > 知识库问答 >
问题:

为什么我的矩形形状在Java图形2D中如此小

晏修诚
2023-03-14

所以我是新的Java图形,我正在创建一个程序,将显示一个矩形。但当我运行我的程序时,它只显示为一个小盒子,而不是矩形。我真的不知道为什么会这样。

下面是我的代码:

import javax.swing.*;

public class GraphicsEditor{

    
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        
        Rectangle rectangle = new Rectangle();
        
        frame.setSize(1280, 720);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        frame.setVisible(true);
        frame.add(panel);
        panel.add(rectangle);
        
    }
    
}

这是我的矩形类:

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

public class Rectangle extends JPanel implements Shape {
    
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2D = (Graphics2D) g;
        g2D.fillRect(0, 0, 200, 130);
    }

}

这是我的形状界面:

import java.awt.*;

public interface Shape {
    void paintComponent(Graphics g);
}

共有2个答案

武骁
2023-03-14

如注释所述,您应该将面板矩形的首选大小设置为所需大小,然后打包框架,如下所示:

panel.setPreferredSize(new Dimension(500,500));
rectangle.setPreferredSize(new Dimension(500,500));
frame.pack();

否则,您的LayoutManager(如果未指定,它默认为flowLayout)将按照它想要的方式处理您的矩形。因此,另一种方法是学习布局管理器,并使用您想要的布局管理器。

作为附带说明,我想对您的代码提出一些建议。请记住,Swing不是线程安全的,因此将代码放在invokelater()调用中,例如:

SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
            JFrame frame = new JFrame();
            JPanel panel = new JPanel();

            Rectangle rectangle = new Rectangle();

            frame.setSize(1280, 720);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            panel.setPreferredSize(new Dimension(500,500));
            rectangle.setPreferredSize(new Dimension(500,500));

            frame.add(panel);
            panel.add(rectangle);
            frame.pack();
            frame.setVisible(true);
    }
});

此外,应该在添加组件之后调用frame.setVisible(true)

徐鑫鹏
2023-03-14

来,试试这个

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;

public class GraphicsEditor {
    
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        Rectangle rectangle = new Rectangle();
        
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(rectangle);
        frame.pack();
        // center frame on screen
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        
    }
    
    
}
class Rectangle extends JPanel {
    
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2D = (Graphics2D) g;
        g2D.fillRect(0, 0, 200, 130);
    }
    
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(500, 500);
    }
}

几件事。

  • 您不需要接口。
  • 与组件不同,仅仅绘制图片不会影响布局管理器,因此面板将减小到默认大小,而不考虑任何绘制。
  • 因此需要重写JPanel中的getPreferredSize()
 类似资料:
  • 问题内容: 我正在尝试使Java 2D图形“ hello world”运行起来,并发现它异常困难(即,我正在搜索“ java hello world example”的变体,然后变成空白)。有人能帮我举一个最小的世界范例吗? 编辑 不过,这是一个不错的起点,“ Java教程:执行自定义绘画” 。 问题答案: 要在Swing中绘制矩形,您应该: 首先,永远不要直接在JFrame或其他顶级窗口中绘制。

  • 在上一章中,我们已经看到了JavaFX的基本应用,我们学习了如何创建一个空窗口以及如何在JavaFX的XY平面上绘制一条线。 除了线,我们还可以绘制其他几个2D形状。 2D形状 通常,2D形状是可以在XY平面上绘制的几何图形,包括直线,矩形,圆形等。 使用JavaFX库,您可以绘制 - 预定义的形状,如直线,矩形,圆,椭圆,多边形,折线,立方曲线,四边形曲线,圆弧。 路径元素,如MoveTO路径元

  • 主要内容:JOGL 正方形示例,JOGL 三角形示例在上一节中,我们已经学习了如何在 JOGL 中绘制基本线条。使用相同的方法,我们还可以绘制各种类型的形状,例如正方形、矩形、三角形等。 JOGL 正方形示例 在这个例子中,我们将绘制四个不同的边,使它们都连接在一个正方形的点上。 输出结果如下: JOGL 三角形示例 在这个例子中,我们将绘制三个不同的边,它们都连接在一个三角形形状的点上。 输出结果如下: 因此,任何类型的图形都可以通过连接特定形状

  • 问题内容: 下学期,我们有一个团队中的Java应用程序模块。该模块的要求是制作游戏。在圣诞节假期里,我一直在做一些练习,但是我想不出绘制图形的最佳方法。 我正在使用Java Graphics2D对象在屏幕上绘制形状,并每秒调用30次,但这非常闪烁。有没有更好的方法来绘制Java中的高性能2D图形? 问题答案: 您想要做的是创建一个带有BufferStrategy的canvas组件并对其进行渲染,下

  • 虽然我明白绘制函数的目的是绘制到某个表面,但我不明白为什么它不简单地返回pyplay。表面对象,您可以稍后在需要时将其烧毁到表面。到目前为止,当我只想创建一个表面并稍后将其绘制到其他地方时,这非常不方便。 有没有什么方法可以让类似的函数返回曲面对象,而不是执行额外的步骤并直接绘制到另一个曲面?