簡體   English   中英

如何在重繪時調整JComponent的大小?

[英]how to resize a JComponent on repaint?

我有一個擴展jpanel的主類,一個內部類Brick,它使用圖形參數在屏幕上繪制矩形,當面板尺寸更改時,我試圖使這些矩形可調整大小,這些方法是在paintComponent()方法中繪制的。寬度和高度是用相同的方法分配的,我每30毫米調用一次paintComponent()磚塊寬度是面板寬度的百分比,所以我試圖將舊磚塊寬度保存為變量,並通過將磚塊的x坐標增加新舊磚塊寬度之間的差異,但這是行不通的

我有以下代碼:

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.
       }

}

謝謝你的幫助

“當面板尺寸更改時,我試圖使這些矩形可調整大小”

將面板作為參數傳遞給Brick構造函數,然后使用面板的getWidth()getHeight()方法繪制積木。 例如

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

getWidth()getHeight()將根據面板的當前大小來調整磚的大小。 您可以通過將面板尺寸除以每列/行的磚數來確定尺寸。 您可能需要稍微重組代碼。 現在,所有這些都假設磚塊處於網格狀結構中

不要paintComponent方法內設置組件狀態。 如果您想(出於某些奇怪的原因)想要調整面板的大小,請使用timer方法。

將其移交給布局管理器以管理組件的位置和大小。 不要手動設置。

帶有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