grid panel 滚动条位置不变

本文详细介绍了如何在GridPanel的listeners中加入滚动监听事件,包括beforeRefresh和refresh两个关键函数,确保滚动行为的一致性和流畅性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在grid panel 的listeners中加入下面的事件监听

listeners : {
beforerefresh : function(v) {
v.scrollTop = v.scroller.dom.scrollTop;
v.scrollHeight = v.scroller.dom.scrollHeight;
},
refresh : function(v) {
v.scroller.dom.scrollTop = v.scrollTop + (v.scrollTop == 0 ? 0: v.scroller.dom.scrollHeight - v.scrollHeight);
}
}

def load_excel(self, filename, menu_label,selected_label_text): self.la = menu_label self.workbook = xl.load_workbook(filename) self.sheet_names = self.workbook.sheetnames self.selected_label.config(text=selected_label_text) # 更新选中标签文本 # 清空左侧面板 for widget in self.panel_left.winfo_children(): widget.destroy() # 添加工作表按钮 for i, sheet_name in enumerate(self.sheet_names): button = tk.Button(self.panel_left, text=sheet_name, command=lambda name=sheet_name: self.show_sheet(name)) button.grid(row=i, column=0, sticky="ew", padx=1, pady=1) # 添加一个标记,表示该按钮未被使用 button.used = False # 绑定鼠标进入事件 button.bind("<Enter>", lambda event, button=button: button.configure(bg="lightgray")) # 绑定鼠标离开事件 button.bind("<Leave>", lambda event, button=button: button.configure(bg="SystemButtonFace")) # 绑定按钮的点击事件 button.bind("<Button-1>", lambda event, button=button: mark_used(button)) def mark_used(button): if not button.used: # 将按钮的标记设置为“已使用” button.used = True # 更改按钮的背景颜色 button.configure(bg="green") # 取消按钮的绑定事件 button.unbind("<Button-1>") # 绑定鼠标离开事件,使按钮的背景颜色保持不变 button.bind("<Leave>", lambda event, button=button: button.configure(bg="green")) for child in button.master.winfo_children(): # 绑定按钮的点击事件 child.bind("<Button-1>", lambda event, button=child: mark_used(button))修改這段代碼,如果讀取的excel的工作表有很多,在這個左側面板沒有完全顯示,而且還很密集,該怎麽解決
05-27
优化下面的代码,解决图框显示不完全的问题,其余不需要优化,给我完整的代码:classdef TDMApp8888 < matlab.apps.AppBase % Properties corresponding to app components properties (Access = public) UIFigure matlab.ui.Figure SignalConfigPanel matlab.ui.container.Panel NumSignalsEditField matlab.ui.control.NumericEditField NumSignalsLabel matlab.ui.control.Label SignalTypeDropDown matlab.ui.control.DropDown SignalTypeLabel matlab.ui.control.Label FrequencyEditField matlab.ui.control.NumericEditField FrequencyLabel matlab.ui.control.Label AddSignalButton matlab.ui.control.Button RemoveSignalButton matlab.ui.control.Button SignalsListBox matlab.ui.control.ListBox SignalsListLabel matlab.ui.control.Label StrategyPanel matlab.ui.container.Panel FixedRadioButton matlab.ui.control.RadioButton PriorityRadioButton matlab.ui.control.RadioButton StrategyButtonGroup matlab.ui.container.ButtonGroup TotalSlotsEditField matlab.ui.control.NumericEditField TotalSlotsLabel matlab.ui.control.Label SimulationPanel matlab.ui.container.Panel RunSimulationButton matlab.ui.control.Button RunFeedbackButton matlab.ui.control.Button RunAnalysisButton matlab.ui.control.Button ResultsTabGroup matlab.ui.container.TabGroup SignalsTab matlab.ui.container.Tab OriginalAxes matlab.ui.control.UIAxes TDMAxes matlab.ui.control.UIAxes DemuxAxes matlab.ui.control.UIAxes SyncedAxes matlab.ui.control.UIAxes PerformanceTab matlab.ui.container.Tab BERAxes matlab.ui.control.UIAxes ParametersTab matlab.ui.container.Tab ParametersTextArea matlab.ui.control.TextArea StatusLabel matlab.ui.control.Label ProgressBar matlab.ui.control.Lamp SNREditField matlab.ui.control.NumericEditField SNRLabel matlab.ui.control.Label IterationsEditField matlab.ui.control.NumericEditField IterationsLabel matlab.ui.control.Label DurationEditField matlab.ui.control.NumericEditField DurationLabel matlab.ui.control.Label SamplingRateEditField matlab.ui.control.NumericEditField SamplingRateLabel matlab.ui.control.Label % 新增编码配置控件 EncodingPanel matlab.ui.container.Panel EncodingTypeDropDown matlab.ui.control.DropDown EncodingTypeLabel matlab.ui.control.Label QuantBitsEditField matlab.ui.control.NumericEditField QuantBitsLabel matlab.ui.control.Label StepSizeEditField matlab.ui.control.NumericEditField StepSizeLabel matlab.ui.control.Label FrameConfigPanel matlab.ui.container.Panel FrameHeaderEditField matlab.ui.control.EditField FrameHeaderLabel matlab.ui.control.Label CRCCheckBox matlab.ui.control.CheckBox end properties (Access = private) signals % 存储信号配置的cell数组 params % 系统参数结构体 tdmSystem % TDMSystem实例 controller % TDMFeedbackController实例 analyzer % TDMPerformanceAnalyzer实例 end methods (Access = private) function updateParams(app) % 更新系统参数 app.params = struct(); app.params.fs = app.SamplingRateEditField.Value; app.params.duration = app.DurationEditField.Value; app.params.numSignals = numel(app.signals); app.params.snrDb = app.SNREditField.Value; app.params.iterations = app.IterationsEditField.Value; app.params.totalSlots = app.TotalSlotsEditField.Value; % 新增编码参数 app.params.encodingType = app.EncodingTypeDropDown.Value; app.params.quantBits = app.QuantBitsEditField.Value; app.params.stepSize = app.StepSizeEditField.Value; app.params.frameHeader = app.FrameHeaderEditField.Value; app.params.useCRC = app.CRCCheckBox.Value; % 设置时隙分配策略 if app.FixedRadioButton.Value app.params.strategy = 'fixed'; else app.params.strategy = 'priority'; end % 设置时钟漂移 app.params.clockDrift = zeros(1, app.params.numSignals); if app.params.numSignals > 0 app.params.clockDrift(1) = 0.001; end if app.params.numSignals > 1 app.params.clockDrift(2) = 0.002; end if app.params.numSignals > 2 app.params.clockDrift(3:end) = -0.001; end end function generateSignals(app) % 生成信号数据 t = 0:1/app.params.fs:app.params.duration-1/app.params.fs; app.tdmSystem.originalSignals = zeros(app.params.numSignals, length(t)); app.tdmSystem.signalInfo = cell(app.params.numSignals, 1); for i = 1:app.params.numSignals sigConfig = app.signals{i}; switch sigConfig.type case '正弦波' freq = sigConfig.frequency; app.tdmSystem.originalSignals(i, :) = sin(2*pi*freq*t); app.tdmSystem.signalInfo{i} = sprintf('正弦波 (%dHz)', freq); case '方波' freq = sigConfig.frequency; app.tdmSystem.originalSignals(i, :) = square(2*pi*freq*t); app.tdmSystem.signalInfo{i} = sprintf('方波 (%dHz)', freq); case '随机噪声' app.tdmSystem.originalSignals(i, :) = randn(1, length(t)); app.tdmSystem.signalInfo{i} = '随机噪声'; case '锯齿波' freq = sigConfig.frequency; app.tdmSystem.originalSignals(i, :) = sawtooth(2*pi*freq*t); app.tdmSystem.signalInfo{i} = sprintf('锯齿波 (%dHz)', freq); case '脉冲信号' freq = sigConfig.frequency; duty = 0.3; % 占空比 app.tdmSystem.originalSignals(i, :) = pulstran(t, 0:1/freq:app.params.duration, ... 'rectpuls', duty/freq); app.tdmSystem.signalInfo{i} = sprintf('脉冲信号 (%dHz)', freq); end end % 设置编码参数 app.tdmSystem.encodingParams = struct(... 'type', app.params.encodingType, ... 'quantBits', app.params.quantBits, ... 'stepSize', app.params.stepSize); % 设置帧配置 app.tdmSystem.frameConfig = struct(... 'header', app.params.frameHeader, ... 'useCRC', app.params.useCRC); end function updateParametersDisplay(app) % 更新参数显示 paramText = sprintf('系统参数:\n'); paramText = [paramText sprintf('采样频率: %d Hz\n', app.params.fs)]; paramText = [paramText sprintf('信号持续时间: %.2f 秒\n', app.params.duration)]; paramText = [paramText sprintf('信号源数量: %d\n', app.params.numSignals)]; paramText = [paramText sprintf('信噪比: %d dB\n', app.params.snrDb)]; paramText = [paramText sprintf('时隙分配策略: %s\n', app.params.strategy)]; paramText = [paramText sprintf('总时隙数量: %d\n', app.params.totalSlots)]; paramText = [paramText sprintf('仿真迭代次数: %d\n', app.params.iterations)]; % 新增编码参数 paramText = [paramText sprintf('\n编码配置:\n')]; paramText = [paramText sprintf(' 编码类型: %s\n', app.params.encodingType)]; paramText = [paramText sprintf(' 量化位数: %d bits\n', app.params.quantBits)]; paramText = [paramText sprintf(' 步长: %.4f\n', app.params.stepSize)]; % 新增帧配置 paramText = [paramText sprintf('\n帧配置:\n')]; paramText = [paramText sprintf(' 帧头: %s\n', app.params.frameHeader)]; paramText = [paramText sprintf(' CRC校验: %s\n', ifelse(app.params.useCRC, '启用', '禁用'))]; % 添加信号信息 paramText = [paramText sprintf('\n信号配置:\n')]; for i = 1:app.params.numSignals sig = app.signals{i}; paramText = [paramText sprintf('信号 %d: %s (频率: %d Hz)\n', i, sig.type, sig.frequency)]; end app.ParametersTextArea.Value = paramText; end function plotSignals(app) % 绘制原始信号 t = 0:1/app.params.fs:app.params.duration-1/app.params.fs; cla(app.OriginalAxes); hold(app.OriginalAxes, 'on'); colors = lines(app.params.numSignals); for i = 1:app.params.numSignals plot(app.OriginalAxes, t, app.tdmSystem.originalSignals(i, :), ... 'Color', colors(i, :), 'DisplayName', app.tdmSystem.signalInfo{i}); end hold(app.OriginalAxes, 'off'); legend(app.OriginalAxes, 'Location', 'best'); title(app.OriginalAxes, '原始信号'); xlabel(app.OriginalAxes, '时间 (s)'); ylabel(app.OriginalAxes, '幅度'); grid(app.OriginalAxes, 'on'); % 绘制TDM信号 cla(app.TDMAxes); plot(app.TDMAxes, t, app.tdmSystem.tdmSignal); title(app.TDMAxes, ['TDM复用信号 (' app.params.strategy '策略)']); xlabel(app.TDMAxes, '时间 (s)'); ylabel(app.TDMAxes, '幅度'); grid(app.TDMAxes, 'on'); % 绘制解复用信号 cla(app.DemuxAxes); hold(app.DemuxAxes, 'on'); for i = 1:app.params.numSignals plot(app.DemuxAxes, t, app.tdmSystem.demuxSignals(i, :), ... 'Color', colors(i, :), 'DisplayName', ['信号 ' num2str(i)]); end hold(app.DemuxAxes, 'off'); legend(app.DemuxAxes, 'Location', 'best'); title(app.DemuxAxes, '解复用信号'); xlabel(app.DemuxAxes, '时间 (s)'); ylabel(app.DemuxAxes, '幅度'); grid(app.DemuxAxes, 'on'); % 绘制同步后信号 cla(app.SyncedAxes); hold(app.SyncedAxes, 'on'); for i = 1:app.params.numSignals plot(app.SyncedAxes, t, app.tdmSystem.syncedSignals(i, :), ... 'Color', colors(i, :), 'DisplayName', app.tdmSystem.signalInfo{i}); end hold(app.SyncedAxes, 'off'); legend(app.SyncedAxes, 'Location', 'best'); title(app.SyncedAxes, '同步后信号'); xlabel(app.SyncedAxes, '时间 (s)'); ylabel(app.SyncedAxes, '幅度'); grid(app.SyncedAxes, 'on'); % 绘制误码率和信噪比 cla(app.BERAxes); yyaxis(app.BERAxes, 'left'); bar(app.BERAxes, 1:app.params.numSignals, app.tdmSystem.ber, 0.6, 'FaceColor', [0.2 0.6 0.8]); ylabel(app.BERAxes, '均方误差 (MSE)'); yyaxis(app.BERAxes, 'right'); plot(app.BERAxes, 1:app.params.numSignals, app.tdmSystem.performance.snr, 'o-', 'LineWidth', 2, 'MarkerSize', 8); ylabel(app.BERAxes, 'SNR (dB)'); title(app.BERAxes, '信号质量分析'); xlabel(app.BERAxes, '信号编号'); grid(app.BERAxes, 'on'); xticks(app.BERAxes, 1:app.params.numSignals); legend(app.BERAxes, {'MSE', 'SNR'}, 'Location', 'best'); end end % Callbacks that handle component events methods (Access = private) % Code that executes after component creation function startupFcn(app) % 初始化参数 app.signals = {}; app.params = struct(); app.StatusLabel.Text = '准备就绪'; app.ProgressBar.Color = 'green'; % 设置默认参数 app.SamplingRateEditField.Value = 1000; app.DurationEditField.Value = 1; app.SNREditField.Value = 20; app.IterationsEditField.Value = 5; app.TotalSlotsEditField.Value = 50; app.NumSignalsEditField.Value = 0; app.PriorityRadioButton.Value = true; % 新增编码参数默认值 app.EncodingTypeDropDown.Value = 'PCM'; app.QuantBitsEditField.Value = 8; app.StepSizeEditField.Value = 0.05; app.FrameHeaderEditField.Value = 'A5A5'; app.CRCCheckBox.Value = true; % 更新参数显示 updateParams(app); updateParametersDisplay(app); end % Button pushed function: AddSignalButton function AddSignalButtonPushed(app, ~) % 添加新信号 signalType = app.SignalTypeDropDown.Value; frequency = app.FrequencyEditField.Value; if frequency <= 0 uialert(app.UIFigure, '频率必须大于0', '无效参数'); return; end newSignal = struct(... 'type', signalType, ... 'frequency', frequency); app.signals{end+1} = newSignal; app.NumSignalsEditField.Value = numel(app.signals); % 更新信号列表 signalList = cell(1, numel(app.signals)); for i = 1:numel(app.signals) sig = app.signals{i}; signalList{i} = sprintf('信号 %d: %s (%d Hz)', i, sig.type, sig.frequency); end app.SignalsListBox.Items = signalList; % 更新参数 updateParams(app); updateParametersDisplay(app); app.StatusLabel.Text = sprintf('已添加信号: %s (%d Hz)', signalType, frequency); end % Button pushed function: RemoveSignalButton function RemoveSignalButtonPushed(app, ~) % 移除选中的信号 selectedIdx = app.SignalsListBox.Value; if isempty(selectedIdx) || selectedIdx > numel(app.signals) uialert(app.UIFigure, '请选择要删除的信号', '无选择'); return; end % 移除信号 removedSig = app.signals{selectedIdx}; app.signals(selectedIdx) = []; % 更新信号列表 app.NumSignalsEditField.Value = numel(app.signals); signalList = cell(1, numel(app.signals)); for i = 1:numel(app.signals) sig = app.signals{i}; signalList{i} = sprintf('信号 %d: %s (%d Hz)', i, sig.type, sig.frequency); end app.SignalsListBox.Items = signalList; % 如果没有信号,清除选择 if isempty(app.signals) app.SignalsListBox.Value = []; else app.SignalsListBox.Value = min(selectedIdx, numel(app.signals)); end % 更新参数 updateParams(app); updateParametersDisplay(app); app.StatusLabel.Text = sprintf('已移除信号: %s (%d Hz)', removedSig.type, removedSig.frequency); end % Value changed function: NumSignalsEditField function NumSignalsEditFieldValueChanged(app, ~) % 信号数量变化时更新 updateParams(app); updateParametersDisplay(app); end % Value changed function: SamplingRateEditField function SamplingRateEditFieldValueChanged(app, ~) updateParams(app); updateParametersDisplay(app); end % Value changed function: DurationEditField function DurationEditFieldValueChanged(app, ~) updateParams(app); updateParametersDisplay(app); end % Value changed function: SNREditField function SNREditFieldValueChanged(app, ~) updateParams(app); updateParametersDisplay(app); end % Value changed function: IterationsEditField function IterationsEditFieldValueChanged(app, ~) updateParams(app); updateParametersDisplay(app); end % Value changed function: TotalSlotsEditField function TotalSlotsEditFieldValueChanged(app, ~) updateParams(app); updateParametersDisplay(app); end % Selection changed function: StrategyButtonGroup function StrategyButtonGroupSelectionChanged(app, ~) updateParams(app); updateParametersDisplay(app); end % 新增编码参数变化回调 function EncodingTypeDropDownValueChanged(app, ~) updateParams(app); updateParametersDisplay(app); end function QuantBitsEditFieldValueChanged(app, ~) updateParams(app); updateParametersDisplay(app); end function StepSizeEditFieldValueChanged(app, ~) updateParams(app); updateParametersDisplay(app); end function FrameHeaderEditFieldValueChanged(app, ~) updateParams(app); updateParametersDisplay(app); end function CRCCheckBoxValueChanged(app, ~) updateParams(app); updateParametersDisplay(app); end % Button pushed function: RunSimulationButton function RunSimulationButtonPushed(app, ~) % 运行基础仿真 app.StatusLabel.Text = '运行基础仿真...'; app.ProgressBar.Color = 'yellow'; drawnow; try % 更新参数 updateParams(app); % 检查信号配置 if app.params.numSignals == 0 uialert(app.UIFigure, '请至少添加一个信号', '无信号'); app.ProgressBar.Color = 'red'; return; end % 检查信号数量是否足够 if app.params.numSignals < 3 uialert(app.UIFigure, '至少需要3路信号进行TDM仿真', '信号不足'); app.ProgressBar.Color = 'red'; return; end % 创建TDM系统 app.tdmSystem = TDMSystem(app.params); % 生成信号 generateSignals(app); % 运行仿真 app.tdmSystem = app.tdmSystem.runSimulation(); % 显示结果 plotSignals(app); updateParametersDisplay(app); app.StatusLabel.Text = '基础仿真完成!'; app.ProgressBar.Color = 'green'; catch ME app.StatusLabel.Text = ['错误: ' ME.message]; app.ProgressBar.Color = 'red'; uialert(app.UIFigure, ME.message, '仿真错误'); end end % Button pushed function: RunFeedbackButton function RunFeedbackButtonPushed(app, ~) % 运行反馈控制仿真 app.StatusLabel.Text = '运行反馈控制仿真...'; app.ProgressBar.Color = 'yellow'; drawnow; try % 更新参数 updateParams(app); % 检查信号配置 if app.params.numSignals == 0 uialert(app.UIFigure, '请至少添加一个信号', '无信号'); app.ProgressBar.Color = 'red'; return; end % 检查信号数量是否足够 if app.params.numSignals < 3 uialert(app.UIFigure, '至少需要3路信号进行TDM仿真', '信号不足'); app.ProgressBar.Color = 'red'; return; end % 创建反馈控制器 app.controller = TDMFeedbackController(app.params); % 生成信号 generateSignals(app); % 运行反馈仿真 app.controller = app.controller.runFeedbackSimulation(); % 显示结果(简化版) app.tdmSystem = app.controller; % 用于显示基本结果 plotSignals(app); updateParametersDisplay(app); app.StatusLabel.Text = '反馈控制仿真完成!'; app.ProgressBar.Color = 'green'; % 显示反馈控制结果 visualizeFeedbackResults(app.controller); catch ME app.StatusLabel.Text = ['错误: ' ME.message]; app.ProgressBar.Color = 'red'; uialert(app.UIFigure, ME.message, '仿真错误'); end end % Button pushed function: RunAnalysisButton function RunAnalysisButtonPushed(app, ~) % 运行性能分析 app.StatusLabel.Text = '运行性能分析...'; app.ProgressBar.Color = 'yellow'; drawnow; try % 更新参数 updateParams(app); % 检查信号配置 if app.params.numSignals == 0 uialert(app.UIFigure, '请至少添加一个信号', '无信号'); app.ProgressBar.Color = 'red'; return; end % 检查信号数量是否足够 if app.params.numSignals < 3 uialert(app.UIFigure, '至少需要3路信号进行TDM仿真', '信号不足'); app.ProgressBar.Color = 'red'; return; end % 创建性能分析器 app.analyzer = TDMPerformanceAnalyzer(app.params); % 生成信号 generateSignals(app); % 运行性能分析 app.analyzer = app.analyzer.runPerformanceAnalysis(); % 显示结果(简化版) app.tdmSystem = app.analyzer; % 用于显示基本结果 plotSignals(app); updateParametersDisplay(app); app.StatusLabel.Text = '性能分析完成!'; app.ProgressBar.Color = 'green'; catch ME app.StatusLabel.Text = ['错误: ' ME.message]; app.ProgressBar.Color = 'red'; uialert(app.UIFigure, ME.message, '仿真错误'); end end end % App initialization and construction methods (Access = private) % Create UIFigure and components function createComponents(app) % Create UIFigure app.UIFigure = uifigure; app.UIFigure.Position = [100 100 1200 900]; app.UIFigure.Name = 'TDM通信系统仿真'; app.UIFigure.Scrollable = 'on'; % Create SignalConfigPanel app.SignalConfigPanel = uipanel(app.UIFigure); app.SignalConfigPanel.Title = '信号配置'; app.SignalConfigPanel.Position = [20 700 360 210]; % Create NumSignalsLabel app.NumSignalsLabel = uilabel(app.SignalConfigPanel); app.NumSignalsLabel.Position = [20 160 80 22]; app.NumSignalsLabel.Text = '信号数量:'; % Create NumSignalsEditField app.NumSignalsEditField = uieditfield(app.SignalConfigPanel, 'numeric'); app.NumSignalsEditField.Position = [110 160 60 22]; app.NumSignalsEditField.Value = 0; app.NumSignalsEditField.ValueChangedFcn = createCallbackFcn(app, @NumSignalsEditFieldValueChanged, true); % Create SignalTypeLabel app.SignalTypeLabel = uilabel(app.SignalConfigPanel); app.SignalTypeLabel.Position = [20 130 80 22]; app.SignalTypeLabel.Text = '信号类型:'; % Create SignalTypeDropDown app.SignalTypeDropDown = uidropdown(app.SignalConfigPanel); app.SignalTypeDropDown.Position = [110 130 100 22]; app.SignalTypeDropDown.Items = {'正弦波', '方波', '随机噪声', '锯齿波', '脉冲信号'}; % Create FrequencyLabel app.FrequencyLabel = uilabel(app.SignalConfigPanel); app.FrequencyLabel.Position = [20 100 80 22]; app.FrequencyLabel.Text = '频率 (Hz):'; % Create FrequencyEditField app.FrequencyEditField = uieditfield(app.SignalConfigPanel, 'numeric'); app.FrequencyEditField.Position = [110 100 60 22]; app.FrequencyEditField.Value = 50; % Create AddSignalButton app.AddSignalButton = uibutton(app.SignalConfigPanel, 'push'); app.AddSignalButton.ButtonPushedFcn = createCallbackFcn(app, @AddSignalButtonPushed, true); app.AddSignalButton.Position = [220 130 100 22]; app.AddSignalButton.Text = '添加信号'; % Create RemoveSignalButton app.RemoveSignalButton = uibutton(app.SignalConfigPanel, 'push'); app.RemoveSignalButton.ButtonPushedFcn = createCallbackFcn(app, @RemoveSignalButtonPushed, true); app.RemoveSignalButton.Position = [220 100 100 22]; app.RemoveSignalButton.Text = '移除信号'; % Create SignalsListLabel app.SignalsListLabel = uilabel(app.SignalConfigPanel); app.SignalsListLabel.Position = [20 70 80 22]; app.SignalsListLabel.Text = '信号列表:'; % Create SignalsListBox app.SignalsListBox = uilistbox(app.SignalConfigPanel); app.SignalsListBox.Position = [20 20 300 50]; app.SignalsListBox.Items = {}; % 新增编码配置面板 app.EncodingPanel = uipanel(app.UIFigure); app.EncodingPanel.Title = '编码配置'; app.EncodingPanel.Position = [20 560 360 130]; % 编码类型 app.EncodingTypeLabel = uilabel(app.EncodingPanel); app.EncodingTypeLabel.Position = [20 80 80 22]; app.EncodingTypeLabel.Text = '编码类型:'; app.EncodingTypeDropDown = uidropdown(app.EncodingPanel); app.EncodingTypeDropDown.Position = [110 80 100 22]; app.EncodingTypeDropDown.Items = {'PCM', 'DPCM', 'DM'}; app.EncodingTypeDropDown.Value = 'PCM'; app.EncodingTypeDropDown.ValueChangedFcn = createCallbackFcn(app, @EncodingTypeDropDownValueChanged, true); % 量化位数 app.QuantBitsLabel = uilabel(app.EncodingPanel); app.QuantBitsLabel.Position = [20 50 80 22]; app.QuantBitsLabel.Text = '量化位数:'; app.QuantBitsEditField = uieditfield(app.EncodingPanel, 'numeric'); app.QuantBitsEditField.Position = [110 50 60 22]; app.QuantBitsEditField.Value = 8; app.QuantBitsEditField.ValueChangedFcn = createCallbackFcn(app, @QuantBitsEditFieldValueChanged, true); % 步长 app.StepSizeLabel = uilabel(app.EncodingPanel); app.StepSizeLabel.Position = [20 20 80 22]; app.StepSizeLabel.Text = '步长:'; app.StepSizeEditField = uieditfield(app.EncodingPanel, 'numeric'); app.StepSizeEditField.Position = [110 20 60 22]; app.StepSizeEditField.Value = 0.05; app.StepSizeEditField.ValueChangedFcn = createCallbackFcn(app, @StepSizeEditFieldValueChanged, true); % 新增帧配置面板 app.FrameConfigPanel = uipanel(app.UIFigure); app.FrameConfigPanel.Title = '帧配置'; app.FrameConfigPanel.Position = [20 460 360 90]; % 帧头 app.FrameHeaderLabel = uillabel(app.FrameConfigPanel); app.FrameHeaderLabel.Position = [20 50 80 22]; app.FrameHeaderLabel.Text = '帧头:'; app.FrameHeaderEditField = uieditfield(app.FrameConfigPanel, 'text'); app.FrameHeaderEditField.Position = [110 50 100 22]; app.FrameHeaderEditField.Value = 'A5A5'; app.FrameHeaderEditField.ValueChangedFcn = createCallbackFcn(app, @FrameHeaderEditFieldValueChanged, true); % CRC校验 app.CRCCheckBox = uicheckbox(app.FrameConfigPanel); app.CRCCheckBox.Text = '启用CRC校验'; app.CRCCheckBox.Position = [20 20 120 22]; app.CRCCheckBox.Value = true; app.CRCCheckBox.ValueChangedFcn = createCallbackFcn(app, @CRCCheckBoxValueChanged, true); % Create StrategyPanel app.StrategyPanel = uipanel(app.UIFigure); app.StrategyPanel.Title = '时隙分配策略'; app.StrategyPanel.Position = [400 700 250 210]; % Create StrategyButtonGroup app.StrategyButtonGroup = uibuttongroup(app.StrategyPanel); app.StrategyButtonGroup.SelectionChangedFcn = createCallbackFcn(app, @StrategyButtonGroupSelectionChanged, true); app.StrategyButtonGroup.Position = [20 100 200 80]; app.StrategyButtonGroup.Title = '选择策略'; % Create FixedRadioButton app.FixedRadioButton = uiradiobutton(app.StrategyButtonGroup); app.FixedRadioButton.Text = '固定分配'; app.FixedRadioButton.Position = [11 35 75 22]; % Create PriorityRadioButton app.PriorityRadioButton = uiradiobutton(app.StrategyButtonGroup); app.PriorityRadioButton.Text = '优先级分配'; app.PriorityRadioButton.Position = [11 10 100 22]; app.PriorityRadioButton.Value = true; % Create TotalSlotsLabel app.TotalSlotsLabel = uilabel(app.StrategyPanel); app.TotalSlotsLabel.Position = [20 60 80 22]; app.TotalSlotsLabel.Text = '总时隙数:'; % Create TotalSlotsEditField app.TotalSlotsEditField = uieditfield(app.StrategyPanel, 'numeric'); app.TotalSlotsEditField.ValueChangedFcn = createCallbackFcn(app, @TotalSlotsEditFieldValueChanged, true); app.TotalSlotsEditField.Position = [110 60 60 22]; app.TotalSlotsEditField.Value = 50; % Create SimulationPanel app.SimulationPanel = uipanel(app.UIFigure); app.SimulationPanel.Title = '仿真控制'; app.SimulationPanel.Position = [670 700 250 210]; % Create RunSimulationButton app.RunSimulationButton = uibutton(app.SimulationPanel, 'push'); app.RunSimulationButton.ButtonPushedFcn = createCallbackFcn(app, @RunSimulationButtonPushed, true); app.RunSimulationButton.Position = [30 150 190 30]; app.RunSimulationButton.Text = '运行系统仿真'; % Create RunFeedbackButton app.RunFeedbackButton = uibutton(app.SimulationPanel, 'push'); app.RunFeedbackButton.ButtonPushedFcn = createCallbackFcn(app, @RunFeedbackButtonPushed, true); app.RunFeedbackButton.Position = [30 100 190 30]; app.RunFeedbackButton.Text = '运行反馈控制'; % Create RunAnalysisButton app.RunAnalysisButton = uibutton(app.SimulationPanel, 'push'); app.RunAnalysisButton.ButtonPushedFcn = createCallbackFcn(app, @RunAnalysisButtonPushed, true); app.RunAnalysisButton.Position = [30 50 190 30]; app.RunAnalysisButton.Text = '运行性能分析'; % Create ResultsTabGroup app.ResultsTabGroup = uitabgroup(app.UIFigure); app.ResultsTabGroup.Position = [20 20 1150 420]; % Create SignalsTab app.SignalsTab = uitab(app.ResultsTabGroup); app.SignalsTab.Title = '信号可视化'; % Create OriginalAxes app.OriginalAxes = uiaxes(app.SignalsTab); title(app.OriginalAxes, '原始信号') xlabel(app.OriginalAxes, '时间 (s)') ylabel(app.OriginalAxes, '幅度') app.OriginalAxes.Position = [20 220 530 180]; % Create TDMAxes app.TDMAxes = uiaxes(app.SignalsTab); title(app.TDMAxes, 'TDM复用信号') xlabel(app.TDMAxes, '时间 (s)') ylabel(app.TDMAxes, '幅度') app.TDMAxes.Position = [20 20 530 180]; % Create DemuxAxes app.DemuxAxes = uiaxes(app.SignalsTab); title(app.DemuxAxes, '解复用信号') xlabel(app.DemuxAxes, '时间 (s)') ylabel(app.DemuxAxes, '幅度') app.DemuxAxes.Position = [580 220 530 180]; % Create SyncedAxes app.SyncedAxes = uiaxes(app.SignalsTab); title(app.SyncedAxes, '同步后信号') xlabel(app.SyncedAxes, '时间 (s)') ylabel(app.SyncedAxes, '幅度') app.SyncedAxes.Position = [580 20 530 180]; % Create PerformanceTab app.PerformanceTab = uitab(app.ResultsTabGroup); app.PerformanceTab.Title = '性能分析'; % Create BERAxes app.BERAxes = uiaxes(app.PerformanceTab); title(app.BERAxes, '信号质量分析') xlabel(app.BERAxes, '信号编号') app.BERAxes.Position = [50 50 1000 300]; yyaxis(app.BERAxes, 'left'); ylabel(app.BERAxes, 'MSE'); yyaxis(app.BERAxes, 'right'); ylabel(app.BERAxes, 'SNR (dB)'); % Create ParametersTab app.ParametersTab = uitab(app.ResultsTabGroup); app.ParametersTab.Title = '系统参数'; % Create ParametersTextArea app.ParametersTextArea = uitextarea(app.ParametersTab); app.ParametersTextArea.Position = [20 50 1100 340]; app.ParametersTextArea.Value = {'系统参数将在此显示'}; % Create StatusLabel app.StatusLabel = uilabel(app.UIFigure); app.StatusLabel.HorizontalAlignment = 'right'; app.StatusLabel.Position = [100 900 800 22]; app.StatusLabel.Text = '准备就绪'; % Create ProgressBar app.ProgressBar = uilamp(app.UIFigure); app.ProgressBar.Position = [930 900 20 20]; app.ProgressBar.Color = [0.47 0.67 0.19]; % Create SNRLabel app.SNRLabel = uilabel(app.UIFigure); app.SNRLabel.Position = [950 560 80 22]; app.SNRLabel.Text = '信噪比 (dB):'; % Create SNREditField app.SNREditField = uieditfield(app.UIFigure, 'numeric'); app.SNREditField.ValueChangedFcn = createCallbackFcn(app, @SNREditFieldValueChanged, true); app.SNREditField.Position = [1040 560 60 22]; app.SNREditField.Value = 20; % Create IterationsLabel app.IterationsLabel = uilabel(app.UIFigure); app.IterationsLabel.Position = [950 530 80 22]; app.IterationsLabel.Text = '迭代次数:'; % Create IterationsEditField app.IterationsEditField = uieditfield(app.UIFigure, 'numeric'); app.IterationsEditField.ValueChangedFcn = createCallbackFcn(app, @IterationsEditFieldValueChanged, true); app.IterationsEditField.Position = [1040 530 60 22]; app.IterationsEditField.Value = 5; % Create DurationLabel app.DurationLabel = uilabel(app.UIFigure); app.DurationLabel.Position = [950 500 80 22]; app.DurationLabel.Text = '持续时间 (s):'; % Create DurationEditField app.DurationEditField = uieditfield(app.UIFigure, 'numeric'); app.DurationEditField.ValueChangedFcn = createCallbackFcn(app, @DurationEditFieldValueChanged, true); app.DurationEditField.Position = [1040 500 60 22]; app.DurationEditField.Value = 1; % Create SamplingRateLabel app.SamplingRateLabel = uilabel(app.UIFigure); app.SamplingRateLabel.Position = [950 470 80 22]; app.SamplingRateLabel.Text = '采样率 (Hz):'; % Create SamplingRateEditField app.SamplingRateEditField = uieditfield(app.UIFigure, 'numeric'); app.SamplingRateEditField.ValueChangedFcn = createCallbackFcn(app, @SamplingRateEditFieldValueChanged, true); app.SamplingRateEditField.Position = [1040 470 60 22]; app.SamplingRateEditField.Value = 1000; end end methods (Access = public) % Construct app function app = TDMApp8888 % Create and configure components createComponents(app) % Register the app with App Designer registerApp(app, app.UIFigure) % Execute the startup function runStartupFcn(app, @startupFcn) if nargout == 0 clear app end end % Code that executes before app deletion function delete(app) % Delete UIFigure when app is deleted delete(app.UIFigure) end end end % 辅助函数 function out = ifelse(condition, true_val, false_val) if condition out = true_val; else out = false_val; end end
最新发布
06-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值