簡體   English   中英

Java 使用 Graphics 在 JFrame 上顯示形狀

[英]Java using Graphics to display shapes on a 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);
}

}

raum Panel 是占據框架的,所以框架的背景與JPanel 的背景顏色相同。 所以你必須在繪制其他形狀之前繪制背景。

JPanel raum = new JPanel()
{
    public void paint(Graphics g)
    {
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(Color.BLACK);
        g2.fillRect(0, 0, this.getWidth(), this.getHeight());

        g2.setPaint(Color.WHITE);

        g2.drawLine(500,500,500,800);
    }

};

有許多問題會導致您在未來遇到無窮無盡的問題。

顯而易見的一個事實是面板的背景顏色非常接近WHITE ,因此很難看到線條。 您可以更改面板或線條的背景顏色,它應該可以解決當前的問題。

您確實需要查看在 AWT 和 Swing執行自定義繪畫繪畫,以更好地了解繪畫在 Swing 中的工作原理。

通常建議覆蓋paintComponent並避免覆蓋paint paint做了很多工作,除非你願意承擔所有的工作量,否則最好避免它。

作為一般規則,您還應該在進行任何自定義繪畫之前調用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();
        }

    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM