2015-01-14 65 views
0

當我添加BorderLayoutFlowLayout時,我無法在Canvas上繪製任何類型的圖形。雖然它可以很好地與GridLayout但接口不太好。 即使我嘗試setBounds,我也會得到與邊界和流佈局相同的結果。任何人都可以就這個問題給我一些建議嗎?爲什麼下面的代碼只能用於GridLayout?

//Why does the following code not work with FlowLayout?? 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
class Mycanvas1 extends Canvas 
{ 
    int flag=0; 
    public void paint(Graphics g) 
    { 
    if(flag==1) 
    { 
     g.setColor(Color.pink); 
     g.drawRoundRect(30,30,100,100,20,20); 
     g.setColor(Color.blue); 
     g.drawString("Anks",67,75); 
     g.drawOval(100,130,15,15); 
     g.drawOval(50,130,15,15); 
    } 
    } 
} 
class Myf2 implements ActionListener 
{ 
    Mycanvas1 m=new Mycanvas1(); 
    Myf2() 
    { 
    JFrame f=new JFrame("Graphics"); 
    Button b=new Button("Line"); 
    //b.setBounds(400,400,41,41); 
    b.addActionListener(this); 
    f.add(m); 
    f.add(b); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.setSize(400,400); 
    f.setLayout(new GridLayout()); 
    f.setVisible(true); 
    } 
    public void actionPerformed(ActionEvent e) 
    { 
    m.flag=1; 
    m.repaint(); 
    } 
    public static void main(String... s) 
    { 
    new Myf2(); 
    } 
} 
+0

使用合乎邏輯的一致形式縮進代碼行和塊。縮進旨在使代碼的流程更易於遵循! –

+0

作爲提示,在進行自定義繪畫時,首次嘗試擴展「JPanel」。一個'JPanel'是1)Swing。 2)默認雙緩衝。 3)足夠快速的簡單動畫。 - 如果你真的需要高遊戲渲染速度,我強烈建議全屏獨佔模式或遊戲引擎(可能使用FSE模式)。編寫快速的渲染代碼是一門藝術和科學,最好不要由新手來嘗試。 –

回答

0

如果你不要讓Canvas有大小,那麼這可能取決於Layout造成問題。

FlowLayout不調整其子,它只是讓他們確定自己的大小(默認0,0 Canvas),並放置在由左到右,然後從上到下Container的空間。

BorderLayout調整其大小子,但你需要使用BorderLayout約束:NORTH等默認的限制是CENTER,但它是錯誤的在同一BorderLayout的邏輯空間添加兩個組件。

GridLayout調整其組件的大小使每個組件具有相同的大小(矩形),它們被放置在邏輯網格中等。邏輯網格填充其主機的所有空間。

因此,爲您的組件添加一個Dimension getPreferredSize()方法,該方法返回內部繪圖的「自然」大小。這會讓你的組件更加正常。

1
class Mycanvas1 extends Canvas 

AFAIR一個Canvas具有爲0x0像素的默認大小。 @OverridegetPreferredSize()方法返回一個合理的值,可能被佈局尊重。

這是我的意思,使用FlowLayout

enter image description here

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

class Mycanvas1 extends Canvas { 

    int flag = 0; 

    Mycanvas1() { 
     // so we can easily see its bounds 
     setBackground(Color.WHITE); 
    } 

    public void paint(Graphics g) { 
     super.paint(g); // honor the paint chain.. 
     if (flag == 1) { 
      g.setColor(Color.pink); 
      g.drawRoundRect(30, 30, 100, 100, 20, 20); 
      g.setColor(Color.blue); 
      g.drawString("Anks", 67, 75); 
      g.drawOval(100, 130, 15, 15); 
      g.drawOval(50, 130, 15, 15); 
     } 
    } 

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

class Myf2 implements ActionListener { 

    Mycanvas1 m = new Mycanvas1(); 

    Myf2() { 
     JFrame f = new JFrame("Graphics"); 
     // best done before adding components 
     f.setLayout(new FlowLayout()); 
     Button b = new Button("Line"); 
     b.addActionListener(this); 
     f.add(m); 
     f.add(b); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     //f.setSize(400, 400); // no, don't guess, instead.. 
     f.pack(); 
     f.setVisible(true); 
    } 

    public void actionPerformed(ActionEvent e) { 
     m.flag = 1; 
     m.repaint(); 
    } 

    public static void main(String... s) { 
     new Myf2(); 
    } 
} 
+0

那麼爲什麼這與GridLayout一起工作? –

+0

我可以閱讀的郵政編碼,我可能能夠幫助你進一步。 –

+0

Myf2() { JFrame f = new JFrame(「Graphics」); 按鈕b =新建按鈕(「行」); b.setBounds(400,400,41,41); b.addActionListener(this); f.add(m); (b); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setSize(400,400); f.setLayout(null); f.setVisible(true); } –