Это происходит потому, что в предыдущей версии кода мы создали все поля ввода сразу и просто разместили их на экране. Компьютер не «догадывается» сам, что для первой формулы нужны только X и Y, а для второй — другие переменные. Ему нужно **явно написать инструкцию**: «Если выбрана кнопка 1 — скрой лишние поля, покажи нужные». В Java Swing (библиотеке, которую вы изучаете) это делается через **слушателей событий** (`ActionListener`). Вот **исправленный и улучшенный код**. ### Что изменилось: 1. Я разделил поля ввода на две разные панели: `panelFormula1` (для X, Y) и `panelFormula2` (для N, R, a, b, c). 2. Использовал менеджер компоновки `CardLayout`. Это как колода карт: в одном месте лежат две панели, но в любой момент времени видна только одна из них (верхняя). 3. Добавил обработчик событий `ActionListener` на радио-кнопки. При клике он «перелистывает» карту на нужную панель. ### Полный код (Lab8Variant4.java) ```java import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Lab8Variant4 extends JFrame { // Элементы интерфейса объявляем классом выше, чтобы видеть их во всех методах private JRadioButton radioFormula1, radioFormula2; private JTextField txtX, txtY; // Поля для формулы 1 private JTextField txtN, txtR, txtA, txtB, txtC; // Поля для формулы 2 private JLabel lblResult; private JButton btnCalculate; // Панели и Layout для переключения private JPanel mainInputPanel; private CardLayout cardLayout; public Lab8Variant4() { // Настройка главного окна setTitle("Лабораторная работа №8 - Вариант 4"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(500, 400); setLocationRelativeTo(null); setLayout(new BorderLayout()); // --- 1. ВЕРХНЯЯ ПАНЕЛЬ (ВЫБОР) --- JPanel panelNorth = new JPanel(); panelNorth.setBorder(BorderFactory.createTitledBorder("Выберите формулу")); radioFormula1 = new JRadioButton("Формула 1 (ряд)"); radioFormula2 = new JRadioButton("Формула 2 (сумма)"); ButtonGroup group = new ButtonGroup(); group.add(radioFormula1); group.add(radioFormula2); radioFormula1.setSelected(true); // По умолчанию первая panelNorth.add(radioFormula1); panelNorth.add(radioFormula2); add(panelNorth, BorderLayout.NORTH); // --- 2. ЦЕНТРАЛЬНАЯ ПАНЕЛЬ (ПОЛЯ ВВОДА) --- // Используем CardLayout для смены "экранов" ввода cardLayout = new CardLayout(); mainInputPanel = new JPanel(cardLayout); mainInputPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // -- Экран 1: Поля для формулы 1 (X, Y) -- JPanel panelF1 = new JPanel(new GridLayout(3, 2, 10, 10)); txtX = new JTextField("0"); txtY = new JTextField("0"); panelF1.add(new JLabel("X:")); panelF1.add(txtX); panelF1.add(new JLabel("Y:")); panelF1.add(txtY); // Заполняем пустотой, чтобы было красиво, или оставляем как есть panelF1.add(new JLabel("")); panelF1.add(new JLabel("")); // -- Экран 2: Поля для формулы 2 (N, R, a, b, c) -- JPanel panelF2 = new JPanel(new GridLayout(5, 2, 10, 10)); txtN = new JTextField("0"); txtR = new JTextField("0"); txtA = new JTextField("0"); txtB = new JTextField("0"); txtC = new JTextField("1"); panelF2.add(new JLabel("N (целое):")); panelF2.add(txtN); panelF2.add(new JLabel("R (целое):")); panelF2.add(txtR); panelF2.add(new JLabel("a:")); panelF2.add(txtA); panelF2.add(new JLabel("b:")); panelF2.add(txtB); panelF2.add(new JLabel("c (не 0):")); panelF2.add(txtC); // Добавляем обе панели в "колоду" (mainInputPanel) mainInputPanel.add(panelF1, "Formula1"); mainInputPanel.add(panelF2, "Formula2"); add(mainInputPanel, BorderLayout.CENTER); // --- 3. НИЖНЯЯ ПАНЕЛЬ (КНОПКА И РЕЗУЛЬТАТ) --- JPanel panelSouth = new JPanel(new GridLayout(2, 1)); btnCalculate = new JButton("Считать"); lblResult = new JLabel("Результат Z: ", SwingConstants.CENTER); lblResult.setFont(new Font("Arial", Font.BOLD, 14)); panelSouth.add(btnCalculate); panelSouth.add(lblResult); add(panelSouth, BorderLayout.SOUTH); // --- ЛОГИКА И СОБЫТИЯ --- // Обработчик переключения радио-кнопок ActionListener radioListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (radioFormula1.isSelected()) { // Показать панель с именем "Formula1" cardLayout.show(mainInputPanel, "Formula1"); } else { // Показать панель с именем "Formula2" cardLayout.show(mainInputPanel, "Formula2"); } } }; // Назначаем этот обработчик кнопкам radioFormula1.addActionListener(radioListener); radioFormula2.addActionListener(radioListener); // Обработчик кнопки "Считать" btnCalculate.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { calculate(); } }); } private void calculate() { try { double z = 0; if (radioFormula1.isSelected()) { // --- СЧИТАЕМ ПО ФОРМУЛЕ 1 --- double x = Double.parseDouble(txtX.getText()); double y = Double.parseDouble(txtY.getText()); z = (y / 2.0) + (Math.pow(y, 2) / 6.0) - (Math.pow(x, 3) / 24.0) + (Math.pow(y, 4) / 120.0); } else { // --- СЧИТАЕМ ПО ФОРМУЛЕ 2 --- int n = Integer.parseInt(txtN.getText()); int r = Integer.parseInt(txtR.getText()); double a = Double.parseDouble(txtA.getText()); double b = Double.parseDouble(txtB.getText()); double c = Double.parseDouble(txtC.getText()); if (c == 0) { JOptionPane.showMessageDialog(this, "Параметр 'c' не может быть 0", "Ошибка", JOptionPane.ERROR_MESSAGE); return; } for (int i = 1; i <= n; i++) { for (int j = 1; j <= r; j++) { double numerator = a * i + b * j; double denominator = c * Math.pow(i, j); z += numerator / denominator; } } } lblResult.setText(String.format("Результат Z: %.4f", z)); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(this, "Проверьте корректность введенных чисел!", "Ошибка ввода", JOptionPane.ERROR_MESSAGE); } } public static void main(String[] args) { SwingUtilities.invokeLater(() -> new Lab8Variant4().setVisible(true)); } } ```