画九个方块摆动不工作?

时间:2017-11-28 16:30:27

标签: java swing paintcomponent

我正在尝试使用java添加9个不同颜色的正方形,这就是我正在做的事情:

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

public class GUI{
  private JFrame frame;
  private ArrayList<Blocks> squares;

  public static void main(String[] args) {
    new GUI();    
  }

  public GUI(){
    frame = new JFrame("Blocks");
    frame.setLayout(new GridLayout(3,3));

    squares = new ArrayList<Blocks>();
    squares.add(new Blocks(100,200,150,20,10));
    squares.add(new Blocks(120,100,50,100,10));
    squares.add(new Blocks(70,255,0,180,10));
    squares.add(new Blocks(150,150,150,20,70));
    squares.add(new Blocks(100,100,100,100,70));
    squares.add(new Blocks(0,0,0,180,70));
    squares.add(new Blocks(220,200,50,20,130));
    squares.add(new Blocks(110,80,150,100,130));
    squares.add(new Blocks(90,235,195,180,130));

    frame.setBounds(850,300,300,260);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //frame.getContentPane().setLayout(new GridLayout());
    for(int i = 0; i<squares.size(); i++){
      frame.add(squares.get(i));
    }
    frame.setVisible(true);    
  }
}

class Blocks extends JComponent{  
   private JLabel label;
   private int r;
   private int g;
   private int b;
   private int x;
   private int y;

   public Blocks(int r,int g,int b, int x, int y){
     super();          
     this.r = r;
     this.g = g;
     this.b = b;
     this.x = x;
     this.y = y;
 //label = new JLabel(s);
 //setLayout(new BorderLayout());
 //add(label, BorderLayout.CENTER);
 //setLocation(20,10);
 //setSize(80,60);
   }

   public void paintComponent(Graphics G){
     super.paintComponent(G);
     G.setColor(new Color(r,g,b));
     G.fillRect(x,y,80,60);
   }
}

因此只显示一个正方形,但是当我展开框架时,所有正方形都显示出来但它们之间存在巨大的间隙,我试图让它们彼此相邻,正如您可以通过我的x和y值看到的那样,我希望所有这些都在一个300 * 260的框架中彼此相邻,每个方格是80 * 60。

修改 所有组件都显示,不仅有一个显示,但它们只在我展开框架时显示,它们相距很远而不是彼此相邻,因为我想要它们,我认为它们会起作用。不重复。

2 个答案:

答案 0 :(得分:1)

问题是您正在从组件的(x,y)进行自定义绘制。你应该从组件的(0,0)进行绘画。

您正在使用布局管理器将组件放置在网格中,因此您只需让布局管理器确定每个组件的(x,y)位置,然后只需填充组件即可。根据它的大小。

您还应该覆盖组件的getPreferredSize()方法,以便布局管理器可以在使用pack时确定组件的初始大小。

  

我希望框架和组件之间存在间隙,它们正在填充整个框架

在父面板上使用EmptyBorder。有关详细信息,请阅读How to Use Borders上的Swing教程中的部分。

答案 1 :(得分:0)

更改paintComponent():

public void paintComponent(Graphics G) {
    super.paintComponent(G);
    G.setColor(new Color(r, g, b));
    G.fillRect(0, 0, getWidth(), getHeight());
}

如果你想要他们有差距:

public void paintComponent(Graphics G) {
    super.paintComponent(G);
    G.setColor(new Color(r, g, b));
    G.fillRect(0, 0, getWidth() * 9 / 10, getHeight() * 9 / 10);
}