You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何跨两类编辑面板实现图形绘制?内存管理程序无输出求助

嘿,我来帮你解决这两个技术问题:

问题1:如何从两个不同的类中编辑面板以使用Graphics(图形)功能?

在Swing体系里,Graphics绘制的核心逻辑是在JComponent的paintComponent方法中完成绘制。要从其他类控制面板的图形内容,关键是把「数据存储」和「绘制逻辑」分离,通过触发重绘来更新界面。这里给你两种实用方案:

方案1:自定义绘制组件,暴露数据接口

创建一个专门负责绘制的JComponent子类,把需要绘制的数据(比如内存块、进程大小)作为成员变量。其他类修改这些数据后,调用repaint()就能触发面板重新绘制。

示例代码:

首先是自定义绘制面板:

import java.awt.Graphics;
import javax.swing.JComponent;

public class MemoryDrawPanel extends JComponent {
    // 存储需要绘制的内存块和进程数据
    public int[] blockSizes;
    public int[] processSizes;

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        // 避免空指针,先判断数据是否有效
        if (blockSizes == null || processSizes == null) return;

        // 绘制内存块(示例逻辑,可按需调整样式)
        int yOffset = 30;
        for (int idx = 0; idx < blockSizes.length; idx++) {
            int blockSize = blockSizes[idx];
            if (blockSize <= 0) continue; // 跳过已分配完的块

            // 绘制块的矩形边框
            g.drawRect(50, yOffset, blockSize * 6, 40);
            // 绘制块的大小文本
            g.drawString("Block " + idx + ": " + blockSize, 55, yOffset + 25);
            yOffset += 50;
        }

        // 绘制进程(同理可扩展样式)
        yOffset = 30;
        for (int idx = 0; idx < processSizes.length; idx++) {
            int procSize = processSizes[idx];
            if (procSize <= 0) continue;

            g.setColor(java.awt.Color.BLUE);
            g.drawRect(400, yOffset, procSize * 6, 40);
            g.drawString("Process " + idx + ": " + procSize, 405, yOffset + 25);
            g.setColor(java.awt.Color.BLACK);
            yOffset += 50;
        }
    }
}

然后在你的主窗口类bar中集成这个面板,并给其他类提供更新入口:

import javax.swing.JFrame;

public class bar extends javax.swing.JFrame {
    public int[] blocksize = new int[100];
    public int[] prosize = new int[100];
    public int i = 0, l = 0;
    private MemoryDrawPanel drawPanel; // 绘制面板实例

    public bar() {
        initComponents(); // 保留你原有的GUI初始化代码
        // 添加绘制面板到窗口
        drawPanel = new MemoryDrawPanel();
        add(drawPanel);
        setSize(800, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    // 给其他类调用的方法:更新数据并刷新界面
    public void refreshMemoryView() {
        drawPanel.blockSizes = this.blocksize;
        drawPanel.processSizes = this.prosize;
        drawPanel.repaint(); // 触发重绘
    }
}

这样,当另一个类(比如你的算法类)修改了bar类中的blocksize或prosize后,只需要调用barInstance.refreshMemoryView()就能更新图形显示了。

方案2:观察者模式(适合复杂场景)

如果你的项目涉及多个类触发界面更新,可以用观察者模式:让绘制面板作为观察者,当数据变化时自动收到通知并刷新。不过对于你的内存管理系统,方案1已经足够简单实用。


问题2:内存管理算法类没有输出,编译无错误

编译通过但无输出,通常是方法未被调用、数据传递失败或输出逻辑分支未触发,按以下步骤排查:

1. 确认算法类的核心方法是否被调用

先检查你有没有在主类中实例化算法类,并且调用它的核心方法。比如:

// 假设你的算法类叫MemoryAllocator
public class MemoryAllocator {
    private int[] blocks;
    private int[] processes;

    public MemoryAllocator(int[] blocks, int[] processes) {
        this.blocks = blocks;
        this.processes = processes;
    }

    public void firstFit() {
        // 首次适配算法逻辑
        boolean anyAllocated = false;
        for (int pIdx = 0; pIdx < processes.length; pIdx++) {
            int procSize = processes[pIdx];
            if (procSize <= 0) continue; // 跳过已分配的进程

            for (int bIdx = 0; bIdx < blocks.length; bIdx++) {
                if (blocks[bIdx] >= procSize) {
                    // 分配成功,输出日志
                    System.out.println("进程" + pIdx + "(大小" + procSize + ")分配到块" + bIdx);
                    blocks[bIdx] -= procSize;
                    processes[pIdx] = 0;
                    anyAllocated = true;
                    break;
                }
            }
        }
        if (!anyAllocated) {
            System.out.println("没有进程被分配到内存块");
        }
    }
}

然后在主类bar中,比如按钮点击事件里触发算法:

// 假设你有一个按钮触发算法执行
private void runAlgorithmBtnActionPerformed(java.awt.event.ActionEvent evt) {
    // 实例化算法类,传入当前的块和进程数据
    MemoryAllocator allocator = new MemoryAllocator(blocksize, prosize);
    allocator.firstFit(); // 调用首次适配算法
    refreshMemoryView(); // 更新图形界面
    System.out.println("算法执行完成!"); // 先确认方法被执行
}

2. 检查数据是否正确传递

在算法类的构造方法里打印输入数据,确认数据是否正确接收:

public MemoryAllocator(int[] blocks, int[] processes) {
    this.blocks = blocks;
    this.processes = processes;
    // 打印数据确认
    System.out.println("接收的内存块:" + java.util.Arrays.toString(blocks));
    System.out.println("接收的进程:" + java.util.Arrays.toString(processes));
}

如果打印的是全0或默认值,说明主类里的blocksize和prosize还没被正确初始化或赋值。

3. 检查GUI输出是否被添加到窗口

如果你的算法类是要在GUI上输出结果(而非控制台),要确保输出组件(比如JTextArea、JLabel)已经被添加到窗口容器中,并且数据已经设置到组件上。


内容的提问来源于stack exchange,提问作者SBR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:22:31