首页 > 解决方案 > 使用 Graphics 在 JFrame 上显示形状

问题描述

我正在学习如何用 Java 编写图形用户界面。我非常了解一些基础知识,但在这个程序中,我试图在黑色背景的 JFrame 上绘图,但是一旦我运行程序,JFrame 只会在白色背景上显示一条白线。如果有人知道如何解决此问题,我将不胜感激,我一直在尝试自己,但似乎无法弄清楚。

感谢您的关注。我期待着回复。

public class test1 {
public static void main (String[] args)
{
    JFrame frame = new JFrame();
    frame.setSize(1835,1019);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    frame.setResizable(false);
    frame.getContentPane().setBackground(Color.BLACK);

    
    JPanel raum = new JPanel()
    {
        public void paint(Graphics g)
        {
            Graphics2D g2 = (Graphics2D) g;
            g2.setPaint(Color.WHITE);
            
            g2.drawLine(500,500,500,800);
        }
        
    };
    frame.add(raum);
}
}

标签: javaswingjframegraphics2d

解决方案


有许多问题将导致您在未来遇到无穷无尽的问题。

显而易见的一点是,面板的背景颜色非常接近WHITE,因此很难看到线条。您可以更改面板或线条的背景颜色,它应该可以解决眼前的问题。

您确实需要查看Performing Custom PaintingPainting in AWT and Swing以更好地了解在 Swing 中绘画的工作原理。

一般建议覆盖paintComponent和避免覆盖paintpaint做了很多工作,除非你愿意接管它的所有工作量,否则你最好避免它。

作为一般规则,您还应该super.paintXxx在进行任何自定义绘画之前调用该方法。同样,绘画通常是一个复杂的工作流程,最好让父类完成它的工作。

组件还应该向父容器提供尺寸提示,然后父容器可以(通过)更好地决定LayoutManager所有组件的布局方式。因为不同的平台(甚至具有不同设置的相同平台)可以生成不同大小的窗口装饰,所以最好管理“内容”的大小而不是“窗口”的大小。同样,这将为您节省未来的头痛。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main {

    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setBackground(Color.BLACK);
        }

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

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setPaint(Color.WHITE);
            g2d.drawLine(500, 500, 500, 800);
            g2d.dispose();
        }

    }
}

推荐阅读