[英]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上。
我一直在尋找答案,我看的每個例子似乎都是矛盾的。
如果有人嘗試過我,那么非常感謝幫助。 此外,如果我采取完全錯誤的方法,請說。
在任何繪畫方法中,都不應該向面板添加組件。 只要Swing確定需要繪制組件,就會調用繪制方法。 因此,您將多次將組件添加到面板。
當您進行自定義繪制時,您負責覆蓋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.