画九个正方形摆动不起作用?
Painting nine squares to swing not working?
我正在尝试使用 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。
编辑
所有组件都在显示,不仅一个在显示,而且当我只展开框架时它们也在显示,它们相距很远,而不是像我希望的那样彼此相邻,我认为这是可行的。不重复。
问题是您正在从组件的 (x, y) 进行自定义绘制。你应该从组件的 (0, 0) 开始绘制。
您正在使用布局管理器将组件放置在网格中,因此您只需让布局管理器确定每个组件的 (x, y) 位置,然后您只需填充组件即可。基于它的大小。
您还应该覆盖组件的 getPreferredSize()
方法,以便布局管理器可以在使用 pack 时确定组件的初始大小。
I want a gap between the frame and the components, they are filling the entire frame
在父面板上使用 EmptyBorder。阅读 How to Use Borders 上的 Swing 教程部分了解更多信息。
更改 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);
}
我正在尝试使用 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。
编辑 所有组件都在显示,不仅一个在显示,而且当我只展开框架时它们也在显示,它们相距很远,而不是像我希望的那样彼此相邻,我认为这是可行的。不重复。
问题是您正在从组件的 (x, y) 进行自定义绘制。你应该从组件的 (0, 0) 开始绘制。
您正在使用布局管理器将组件放置在网格中,因此您只需让布局管理器确定每个组件的 (x, y) 位置,然后您只需填充组件即可。基于它的大小。
您还应该覆盖组件的 getPreferredSize()
方法,以便布局管理器可以在使用 pack 时确定组件的初始大小。
I want a gap between the frame and the components, they are filling the entire frame
在父面板上使用 EmptyBorder。阅读 How to Use Borders 上的 Swing 教程部分了解更多信息。
更改 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);
}