为什么以下代码仅适用于GridLayout?

时间:2015-01-14 07:17:51

标签: java swing graphics layout-manager grid-layout

当我添加BorderLayoutFlowLayout时,我无法在Canvas上绘制任何类型的图片。虽然它与GridLayout一起工作正常,但界面不太好。 即使我尝试使用setBounds,我也会获得与边框和流布局相同的结果。谁能就这个问题给我一些建议?

//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();
  }
}

2 个答案:

答案 0 :(得分:1)

class Mycanvas1 extends Canvas

AFAIR a Canvas的默认大小为0x0像素。 @Override getPreferredSize()方法返回可能会被布局尊重的合理值。

这就是我的意思,使用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();
    }
}

答案 1 :(得分:0)

如果你不让Canvas有一个大小,那么这可能会导致问题,具体取决于Layout

FlowLayout没有调整其子组件的大小,只是让他们确定自己的大小(Canvas默认为0,0)并将它们放在Container的左侧空格中正确然后从上到下。

BorderLayout调整子组件的大小,但您需要使用BorderLayout约束:NORTH等。默认约束为CENTER但是添加两个组件是错误的相同的BorderLayout的逻辑空间。

GridLayout调整其组件的大小,使每个组件具有相同的大小(矩形),将它们放置在逻辑网格中等等。逻辑网格填充其{{1}的所有空间主持人。

因此,在组件中添加Container方法,返回" natural"你的绘画大小。这将使您的组件表现得更加正常。