gpt4 book ai didi

java - 难以显示使用 for() 循环和方法添加的 JPanel。 java

转载 作者:行者123 更新时间:2023-12-01 07:32:15 25 4
gpt4 key购买 nike

我修改了我的绘图方法 for 循环,该方法将 JPanels 方 block 绘制到与新添加的 JPanels 有关的所有内容都不再像以前那样位于 for 循环内,而是在它自己的名为 addBlock(.. )。执行此操作后,JPanel 不再显示。

基本上,我尝试使用此程序执行的操作是能够根据需要添加和删除 JPanel(由 60x60 block 表示)。这就是我使用 ArrayList 的原因...这样我所要做的就是随后调用 Paint() 方法,并根据 ArrayList 中的元素数量重新绘制。这是早期阶段,我还是新手,所以我什至不确定是否有更有效的方法。现在我只想显示一些东西。

这是我的代码:

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

class TestApp extends JFrame{
JFrame frame = new JFrame();
ArrayList<JPanel> grid = new ArrayList<JPanel>();

private static int amount = 10;

private void paint()
{
for(int i = 0, x = 0, y = 0; i < amount; i++, x += 62)
{
addBlock(i, x, y);
}
}

//Adds a block
private void addBlock(int index, int x, int y){
int height = 60;
int width = 60;

grid.add(new JPanel());
frame.add(grid.get(index));

(grid.get(index)).setVisible(true);
(grid.get(index)).setBounds(x, y, width, height);
}

//Removes a block
private void removeFrame(int index){
frame.remove(grid.get(index));
grid.remove(index);
}

//Default Constructor (sets up JFrame)
TestApp(){
frame.setLayout(null);
frame.setPreferredSize(new Dimension(600, 300));
frame.setTitle("Test Program");
frame.setBackground(Color.WHITE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setAlwaysOnTop(rootPaneCheckingEnabled);
frame.setResizable(true);
frame.setVisible(true);
}

public static void main(String [] args) {
TestApp program = new TestApp();
program.paint();
}
}

有什么想法或建议吗?

编辑:这是修复和改进的代码。我还没有实现其他建议的事情,因为我还没有做足够的研究。

package my;

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

class TestApp extends JFrame{
JFrame frame = new JFrame();
ArrayList<JButton> grid = new ArrayList<JButton>();

private static int amount = 46;
private static int counter = 0;

private void paintGrid()
{
for(int i = 0, y = 4; i < ((amount / 10) + (amount % 10)); i++, y += 104)
{
for(int j = 0, x = 4; j < 10 && (counter < amount); j++, x += 84)
{
addBlock(counter, x, y);
counter++;
}
}
}

//Adds a block
private void addBlock(int index, int x, int y){
int height = 100;
int width = 80;

grid.add(new JButton());
(grid.get(index)).setBackground(Color.YELLOW);
(grid.get(index)).setBorder(new LineBorder(Color.BLACK));
(grid.get(index)).setVisible(true);
(grid.get(index)).setBounds(x, y, width, height);

frame.add(grid.get(index));
}

//Removes a block
private void removeBlock(int index){
frame.remove(grid.get(index));
grid.remove(index);
}

//Default Constructor (sets up JFrame)
TestApp(){
frame.setLayout(null);
frame.setPreferredSize(new Dimension(850, 600));
frame.setTitle("Test Program");
frame.pack();
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setAlwaysOnTop(rootPaneCheckingEnabled);
frame.setResizable(false);
frame.setVisible(true);
}

public static void main(String [] args) {
TestApp program = new TestApp();
program.paintGrid();
}
}

最佳答案

问题是,你怎么知道面板还没有添加?它们的颜色与父面板相同吗?

尝试更改您的 addBlock 方法以突出显示每个面板...

private void addBlock(int index, int x, int y){
int height = 60;
int width = 60;

JPanel panel = new JPanel()
panel.setBorder(new LineBorder(Color.BLACK));
grid.add(panel);
frame.add(grid.get(index));

(grid.get(index)).setVisible(true);
(grid.get(index)).setBounds(x, y, width, height);
}

一句忠告,虽然 null 布局看起来很有吸引力,但它们最终会花费您更多的时间和精力,而不是一个或多个布局管理器的深思熟虑的应用程序......

ps - 我也会避免使用名为 paint 的方法,因为它们会让其他人永远困惑。

关于java - 难以显示使用 for() 循环和方法添加的 JPanel。 java ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16455226/

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