簡體   English   中英

我如何讓 paincomponent 從其他方法或類中提取東西

[英]How do i ask paincomponent to draw things from other methods or classes

我想請 TestGraphics class 中的paintcomponent 畫一條線,我這樣做的方式只是給我一個 NullPointer 異常,如果你能告訴我我該怎么做,我將不勝感激

測試圖形 class:


import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JPanel;

@SuppressWarnings("serial")
public class TestGraphics extends JPanel {
    
    
    public JPanel panel = new JPanel() {
        public void paintComponent (Graphics g) {
            
            super.paintComponent(g);
            
            Graphics2D g2d = (Graphics2D) g;
            g2d.drawLine(120, 234, 23, 43);
            
        }
    };
    
}

主class:


import javax.swing.*;

public class Main {
    
    static int width = 600;
    static int height = 800;

    public static void main(String[] args) {
        
        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        TestGraphics p = new TestGraphics();
        
        // draw Line
        p.panel.getGraphics().drawLine(123, 23, 43, 21);
        
        
        frame.add(p.panel);
        
        
        frame.setSize(height, width);
        frame.setVisible(true);
        
        
        
    }
    
}

你只需要添加一個新的TestGraphics object,而不是調用“p.panel.getGraphics().drawLine(123,23,43,21);”。 以下是簡單的修復:

TestGraphics.java

import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JPanel;

@SuppressWarnings("serial")
public class TestGraphics extends JPanel {
    
        public void paintComponent (Graphics g) {
            
            super.paintComponent(g);
            
            Graphics2D g2d = (Graphics2D) g;
            g2d.drawLine(120, 234, 23, 43);
            
        }
  
    }

和 Main.java

import javax.swing.*;

public class Main {
    
    static int width = 600;
    static int height = 800;

    public static void main(String[] args) {
        
        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        TestGraphics p = new TestGraphics();
        
        // draw Line
        frame.add(p);
        frame.setSize(height, width);
        frame.setVisible(true);
           
    }
   
}

這是一個小例子: https://repl.it/repls/ExtrovertedSoulfulClients

要立即解決問題,您需要刪除該行

        p.panel.getGraphics().drawLine(123, 23, 43, 21);

因為您不允許在paintComponent() drawLine() ) 。

改變

        frame.add(p.panel);

        frame.add(p);

public class TestGraphics extends JPanel {
    
    
    public JPanel panel = new JPanel() {
        public void paintComponent (Graphics g) {
            
            super.paintComponent(g);
            
            Graphics2D g2d = (Graphics2D) g;
            g2d.drawLine(120, 234, 23, 43);
            
        }
    };
    
}

public class TestGraphics extends JPanel {
    public void paintComponent (Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.drawLine(120, 234, 23, 43);
    }
}

由於TestGraphics已經擴展了JPanel ,您可以將p實例直接添加到JFrame並直接覆蓋paintComponent()而不是創建匿名JPanel class。

來自評論:

最終我將為線條、矩形、三角形等創建構造函數。我想給paintcomponent一些x和y值來繪制所述線條、矩形和三角形

更具體地說,您應該創建代表這些幾何對象中的每一個的類。 每個 class 都應該有一個void paint(Graphics g)方法。 實際上,您應該考慮使用可以從面板的paintComponent(). Your調用的此方法創建接口或抽象class GeometricObject paintComponent(). Your GraphicsTest class can keep a List 並on each of them from its and call paint(g)。

這里有很多東西要學習:抽象類、接口、列表和循環,僅舉幾例。 祝你好運!

暫無
暫無

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

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