为什么我的矩形在 java 图形 2d 中这么小

Why my rectangle shape is so small in java graphics 2d

所以我是 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);
        
    }
    
}

这是我的矩形 class:

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);
}

在这里,试试这个

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()

正如评论所说,您应该将 panelrectangle 的首选大小设置为您想要的大小,然后打包框架,如:

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

否则您的 LayoutManager(未指定时默认为 FlowLayout)将按其需要的方式处理您的矩形。所以另一种方法是学习 Layout Managers,并使用你想要的。

作为旁注,我想对您的代码提出一些建议。请记住,,因此请将您的代码放在 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) 应该在添加组件后调用。