简体   繁体   English

如何在重绘时调整JComponent的大小?

[英]how to resize a JComponent on repaint?

I have a main class that extends jpanel,and an inner class Brick that uses a graphics parameter to draw rectangle on screen,i am trying to make these rectangle resizeable when the panel size change these Bricks are drawn in the method paintComponent() also their width and height are assigned in the same method,I call paintComponent() every 30millis brick width is a percentage of the panel width so i'm trying to save the old brick width in a variable and increasing the x coordinate of the brick by the difference between the old and new brick width but it wouldn't work 我有一个扩展jpanel的主类,一个内部类Brick,它使用图形参数在屏幕上绘制矩形,当面板尺寸更改时,我试图使这些矩形可调整大小,这些方法是在paintComponent()方法中绘制的。宽度和高度是用相同的方法分配的,我每30毫米调用一次paintComponent()砖块宽度是面板宽度的百分比,所以我试图将旧砖块宽度保存为变量,并通过将砖块的x坐标增加新旧砖块宽度之间的差异,但这是行不通的

I have the following code: 我有以下代码:

int width,height,brickHeight,brickWidth,tempBWidth,diffrence;
ArrayList<Brick> listOfBricks = new ArrayList<Panel.Brick>();
Timer timer = new Timer(30,this);
boolean bricksFilled,resized;

public Panel() {
    setBackground(Color.BLACK);
    setVisible(true);
    timer.start();
}   //end constructor Panel().

protected void paintComponent(Graphics g) {
    width = getWidth(); height = getHeight();
    setSize(width,height);
    tempBWidth = brickWidth;
    brickHeight = height/20; brickWidth = width/10;
    if(width != 0 && tempBWidth != brickWidth) { diffrence = brickWidth - tempBWidth; }
    super.paintComponent(g);
    if(bricksFilled == false) { fillListOfBricks(); }
    drawBricks(listOfBricks, g);
    diffrence = 0;
}   //end method paintComponent().

public void actionPerformed(ActionEvent event) {
    repaint();
}   //end method actionPerformed().

void fillListOfBricks() {
    for (int row = 0;row < height/2;row += brickHeight+1 ) {
        for (int column = 0;column < width;column += brickWidth+1) {
            if(brickWidth != 0){ 
                listOfBricks.add(new Brick(column,row,true,brickWidth,brickHeight));
                bricksFilled = true;
            }   //end if.
        }   //end inner loop.
    }   //end outer loop.
}   //end method fillListOfBricks().

void drawBricks(ArrayList<Brick> listOfBricks,Graphics g) {
    for (Brick brick:listOfBricks) {
        if(listOfBricks.isEmpty() == false) {
            if (brick.visible) {
                    brick.draw(g);
            }   //end inner if.
        }   //end outer if.
    }   //end loop.
}   //end method drawBricks().

class Brick {
    int x,y;
    int width,height,xDiff,yDiff;
    boolean visible;
    Color randomColor;
    Brick(int x,int y,boolean visible,int width,int height) {
        this.x = x; this.y = y; this.visible = visible;
        this.width = width; this.height = height;
        this.randomColor = getRandomColor();
    }   //end constructor Brick().

    void draw(Graphics g) {  
        if(this.visible) {
            System.out.println(diffrence);
            g.setColor(this.randomColor);
            System.out.println(x+"             "+diffrence);
            g.fillRect(x+diffrence, y, brickWidth,brickHeight);
            g.setColor(Color.WHITE);
            g.drawRect(x-1, y-1, brickWidth+1, brickHeight+1);
        }   // end if block.
    }   //end method draw().

    Color getRandomColor() {
        int R = (int)(255*(Math.random()));
        int G = (int)(255*(Math.random()));
        int B = (int)(255*(Math.random()));
        return new Color(R,G,B);
    }   //end Method getRandomColor.
       }

} }

thanks for your help 谢谢你的帮助

"i am trying to make these rectangle resizeable when the panel size change" “当面板尺寸更改时,我试图使这些矩形可调整大小”

Pass the panel as a parameter to the Brick constructor, and then use the panel's getWidth() and getHeight() methods to draw your bricks. 将面板作为参数传递给Brick构造函数,然后使用面板的getWidth()getHeight()方法绘制积木。 For example 例如

class Brick {
    private JComponent panel;

    public Brick(JComponent panel, ....) {
        this.panel = panel;
    }

    public void draw(Graphics g) {
        int height = (int)(panel.getHeight() / BRICK_ROWS);
        int width = (int)(panel.getWidth() / BRICK_COLS);
        g.fillRect(x, y, width, height);
    }
}

The getWidth() and getHeight() will size your bricks according to the current size the panel. getWidth()getHeight()将根据面板的当前大小来调整砖的大小。 You can determine the size by dividing the panel size by the number of bricks per column/row. 您可以通过将面板尺寸除以每列/行的砖数来确定尺寸。 You will probably have to restructure your code a bit. 您可能需要稍微重组代码。 Now this is all assuming the bricks are in a grid like structure 现在,所有这些都假设砖块处于网格状结构中

Also Don't set the component state inside the paintComponent method. 不要paintComponent方法内设置组件状态。 If you want to (some weird reason) want to resize the panel, do it in the timer method. 如果您想(出于某些奇怪的原因)想要调整面板的大小,请使用timer方法。

Handover it to layout manager to manage the position and size of components. 将其移交给布局管理器以管理组件的位置和大小。 Don't set it manually. 不要手动设置。

Sample code with GridLayout 带有GridLayout示例代码

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Maze {
    private JFrame frame = null;

    private Color[] colors = new Color[] { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW };

    public Maze(int length) {

        frame = new JFrame();

        JPanel panel = new JPanel(new GridLayout(length, length, 5, 5));           

        for (int i = 0; i < length; i++) {
            for (int j = 0; j < length; j++) {
                JPanel p2 = new JPanel();
                p2.setBackground(colors[(int) (Math.random() * colors.length)]);

                panel.add(p2);
            }
        }

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Maze Game");
        frame.setContentPane(panel);
        frame.pack();
        frame.setVisible(true);
    }

}

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM