gpt4 book ai didi

java - 有没有办法从同一个类中的另一个方法在 JPanel 上绘制形状?

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

我正在开发一个 GUI,在其中我可以在不同位置重复绘制一些 2D 形状。目前,我有一个 createGUI() 方法,它创建基本布局和面板,然后调用 content_panel 的构造函数在 content_panel 中创建 2D 形状。

但是,我想使用另一种方法在主 JPanel 中创建形状。 Java中有没有一种方法,可以让我在main.c中调用两个方法?第一个方法 createGUI() 创建包括 JFrames 和 JPanel 的 GUI。第二种方法 createShapes() 在一个特定的 JPanel - content_panel 中创建形状。我想重复调用此 createShapes() 方法并传递不同的参数以查看不同位置的形状。

如果您需要更多信息或问题不清楚,请告诉我。谢谢

代码:

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

public class Board{

public static void main(String[] args)
{
createGUI();
drawShapes();
}

//This method creates the basic GUI
private static void createGUI()
{
//Creating the JFrame main window
JFrame mainFrame = new JFrame();
mainFrame.setSize(800, 500);
mainFrame.setTitle("Particle Filter");
mainFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
mainFrame.setLocation(100, 100);
mainFrame.getContentPane().setLayout(new BoxLayout(mainFrame.getContentPane(), BoxLayout.X_AXIS));

//creates two panels content and sidebar. Sidebar has null layout
JPanel content = new JPanel();
content.setPreferredSize(new Dimension(700,500));
content.setBackground(Color.LIGHT_GRAY);
mainFrame.getContentPane().add(content);
JPanel sidebar = new JPanel();
sidebar.setBackground(Color.LIGHT_GRAY);
sidebar.setPreferredSize(new Dimension(100,500));
mainFrame.getContentPane().add(sidebar);
sidebar.setLayout(null);

//creates three buttons in sidebar
JButton start_button = new JButton("START");
start_button.setBounds(10, 75, 77, 23);
sidebar.add(start_button);
JButton stop_button = new JButton("STOP");
stop_button.setBounds(10, 109, 77, 23);
sidebar.add(stop_button);
JButton reset_button = new JButton("RESET");
reset_button.setBounds(10, 381, 77, 23);
sidebar.add(reset_button);

//calls the content_Walls class and sends the number of ovals to be generated
int n=1000; // n denotes the number of ovals
content.add( new Content_Walls(n));
mainFrame.setVisible(true);

}

private static void drawShapes()
{

}

}
class Content_Walls extends JPanel
{


ArrayList<Integer> list;

Content_Walls(int n)
{
setPreferredSize(new Dimension(680,450));
setBackground(Color.WHITE);
list = new ArrayList<Integer>(Collections.nCopies(n, 0));
}

public void paintComponent(Graphics g)
{
int x=0,y=0;
super.paintComponent(g);

createObstacles(g,150,225,100,40);
createObstacles(g,500,300,40,100);

for(int i=0;i<list.size();i++)
{
x=randomInteger(11,670); // bounds of x between which the particles should be generated
y=randomInteger(11,440); // bounds of y between which the particles should be generated

int radius = 4;

x=x-(radius/2);
y=y-(radius/2);
g.fillOval(x, y, radius, radius);
}

private void createObstacles(Graphics g, int x, int y, int width, int height)
{
g.setColor(Color.BLACK);
g.fillRect(x, y, width, height);
}


private static int randomInteger(int min, int max)
{
Random rand = new Random();
int randomNum = rand.nextInt((max - min) + 1) + min;
return randomNum;
}
}

最佳答案

您的代码存在各种各样的问题。

  1. 您正在主线程而不是事件调度线程上创建 Swing 组件。搜索有关此问题的帮助。

  2. 拥有 Board 子类 JFrame 并在构造函数或实例方法而不是静态方法中进行 GUI 初始化。

  3. drawShapes() 设为实例方法。

  4. 创建 JPanel 时,将其引用存储在实例变量中(例如 myPanel)。如果您修复#2,这将更容易做到,并且不会那么困惑。

  5. 如果执行 #2 和 #3,只需将引用传递给 drawShapes() 方法。

  6. 如果所有逻辑都在 paintComponent() 方法中,则甚至可能不需要
  7. drawShapes()。调用 myPanel.repaint() 来调用 paintComponent() 方法。

关于java - 有没有办法从同一个类中的另一个方法在 JPanel 上绘制形状?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24963807/

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