gpt4 book ai didi

java - 如何使用 Java 中的循环向 JFrame 添加多个面板?

转载 作者:行者123 更新时间:2023-12-01 23:45:50 25 4
gpt4 key购买 nike

我有一个名为 DrawRectangles 的类,它采用整数数组。

我想做的是遍历数组中的数字,并为每个数字创建一个新面板,使用数组中的数字作为面板的宽度和 X 位置。

假设我传入了 [2, 4, 6, 8]。我想创建一个新面板,将这些数字添加到 JFrame 中。

所以第一个面板应该从位置 2 开始,宽度为 2。我还有一个随机颜色生成器,它应该为每个面板创建一种新颜色。这是我所拥有的:

public class DrawRectangles {
JFrame frame;
DrawPanel panel;
Random randomGenerator = new Random();
int red = randomGenerator.nextInt(255);
int green = randomGenerator.nextInt(255);
int blue = randomGenerator.nextInt(255);
Color randomColor;
int[] newWidth;

DrawRectangles(int[] width){
this.newWidth = width;
}

public void setUpFrame(){
frame = new JFrame();
frame.setSize(500,100);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
for(int x = 0; x < newWidth.length; x++){
panel = new DrawPanel(newWidth[x]);
frame.add(panel);
}
}
class DrawPanel extends JPanel{
int newWidth;
DrawPanel(int width){
this.newWidth = width;
System.out.println(newWidth);
}
public void paint(Graphics g) {
super.paint(g);
randomColor = new Color(red,green,blue);
g.setColor(randomColor);
g.fillRect(newWidth, 10, newWidth, 30);
}
}
}

最佳答案

您有很多问题...

  • Frame 默认使用 BorderLayout。这将只允许单个组件占据任何一个可用的预定义位置。这意味着只有最后一个 Pane 可见。
  • 您无法控制绘制过程。这意味着每次 randomColor 更改值时,引用它的所有组件也将在下一个绘制周期中用它重新绘制。
  • 您应该使用 paintComponent 而不是 paint

这是一个使用单个 DrawRectangle 组件绘制所有矩形的基本示例。

enter image description here

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class DrawRectangles {

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}

DrawRectangles dr = new DrawRectangles(new int[]{2, 4, 6, 8});
dr.setUpFrame();

}
});
}

JFrame frame;
DrawPanel panel;
Random randomGenerator = new Random();
int[] newWidth;

DrawRectangles(int[] width) {
this.newWidth = width;
}

public void setUpFrame() {
frame = new JFrame();
frame.setSize(500, 100);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DrawPanel panel = new DrawPanel();
for (int x = 0; x < newWidth.length; x++) {
int red = randomGenerator.nextInt(255);
int green = randomGenerator.nextInt(255);
int blue = randomGenerator.nextInt(255);
panel.addRectangle(new Color(red, green, blue), newWidth[x]);
}
frame.setSize(200, 200);
frame.add(panel);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

public class MyRectangle {

private Color color;
private Rectangle rectangle;

public MyRectangle(Color color, int width) {
this.color = color;
rectangle = new Rectangle(width, 10, width, 30);
}

public Color getColor() {
return color;
}

public Rectangle getRectangle() {
return rectangle;
}

public void draw(Graphics2D g2d) {
g2d.setColor(color);
g2d.fill(rectangle);
}
}

public class DrawPanel extends JPanel {

private List<MyRectangle> rectangles;

public DrawPanel() {
rectangles = new ArrayList<>();
}

public void addRectangle(Color color, int width) {
rectangles.add(new MyRectangle(color, width));
}

public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D) g.create();
for (MyRectangle rect : rectangles) {
rect.draw(g2d);
}
g2d.dispose();
}
}
}

您可以使用不同的布局管理器,但是您的 DrawRectangle 组件还必须返回 preferredSize ,以便布局管理器不会以某个尺寸布局组件0x0

关于java - 如何使用 Java 中的循环向 JFrame 添加多个面板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17079199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com