簡體   English   中英

Graphics2D和JComponent

[英]Graphics2D and JComponent

我沒有太多使用Swing / G2D,所以請耐心等待。 我有以下類,它是我的GUI上的一個組件(意味着要繪制的Canvas類型):

import javax.swing.*;
import java.awt.*;

public class DrawPanel extends JComponent{
public void paintComponent(Graphics g){
    Graphics2D g2 = (Graphics2D) g;

    g2.setPaint(Color.black);
    g2.fillRect(0, 0, getWidth(), getHeight());

    BrushStroke bs = new BrushStroke();     
    add(bs);
}
}

我一直在嘗試將以下內容添加到上面的JComponent:

import javax.swing.*;
import java.awt.*;

public class BrushStroke extends JComponent{
public void paintComponent(Graphics g){
    Graphics2D g2 = (Graphics2D) g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                                RenderingHints.VALUE_ANTIALIAS_ON);

    g2.setPaint(Color.red);
    g2.fillOval(0, 0, 10, 10);          
}
}

BrushStroke不會顯示在DrawPanel上。

我一直在尋找答案,我看的每個例子似乎都是矛盾的。

如果有人嘗試過我,那么非常感謝幫助。 此外,如果我采取完全錯誤的方法,請說。

  1. 在任何繪畫方法中,都不應該向面板添加組件。 只要Swing確定需要繪制組件,就會調用繪制方法。 因此,您將多次將組件添加到面板。

  2. 當您進行自定義繪制時,您負責覆蓋getPreferredSize()方法以提供組件的大小。 這樣布局管理器可以正確定位組件。 如果你不這樣做,那么首選大小是0,所以沒有什么可畫的。

閱讀自定義繪畫的Swing教程中的部分以獲取更多信息和示例。

JComponent.add方法上, 文檔說:

注意:如果已將組件添加到已顯示的容器中,則必須在該容器上調用validate以顯示新組件。 如果要添加多個組件,則可以在添加所有組件后僅調用一次驗證來提高效率。

您應該在向其添加元素后刷新DrawPanel。 注意不要在painComponent方法中執行它,最終會進行無限遞歸。

請執行以下操作:

DrawPanel drawPanel = new DrawPanel();
drawPanel.add(new BrushStroke());
drawPanel.repaint();

編輯這是一個完全有效的解決方案(擴展JPanels而不是JComponent)

public static void main(String[] args){
   JFrame frame = new JFrame();
   DrawPanel drawPanel = new DrawPanel();
   drawPanel.add(new BrushStroke());
   frame.getContentPane().add(drawPanel);
   frame.pack();
   frame.setVisible(true);
}
class DrawPanel extends JPanel{
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setPaint(Color.black);
        g2.fillRect(0, 0, getWidth(), getHeight());
    }
    @Override
    public  Dimension getPreferredSize(){
        return new Dimension(100, 100);
    }
}
class BrushStroke extends JPanel{
    public void paintComponent(Graphics g){
        this.setOpaque(false);
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setPaint(Color.red);
        g2.fillOval(0, 0, 10, 10); 
    }
    @Override
    public  Dimension getPreferredSize(){
        return new Dimension(10, 10);
    }
}

輸出結果如下:

在此輸入圖像描述

暫無
暫無

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

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