3966

Пакет Swing компонувальники LayoutManager

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторна робота (Пакет Swing – компонувальники (LayoutManager)) Тема роботи: Пакет Swing – компонувальники (LayoutManager). Мета роботи: Дослідити роботу, одного з компонентів пакету Swing, компонувальники (LayoutManager). План ро...

Украинкский

2012-11-10

379.45 KB

5 чел.

8.

Лабораторна робота №8 (Пакет Swing – компонувальники

(LayoutManager))

Тема роботи: Пакет Swing – компонувальники (LayoutManager).

Мета роботи: Дослідити роботу, одного з компонентів пакету Swing, компонувальники

(LayoutManager).

План роботи

1. Ознамитися з LayoutManager.

2. Дослідити роботу компонувальників: FlowLayout, BorderLayout, CardLayout, BoxLayout,

GridLayout.

3. Навчитися добавляти компонувальники до контейнерів.

4. Навчитися задавати параметри компонувальників.

5. Вивчити властивості кожного компонувальника.

Теоретичні відомості

LayoutManager – це об’єкт, котрий визначає розміри та розташування компонентів в

межах контейнера. Хоча компоненти самі визначають свої розміри та вирівнювання, останнє

слово стосовно їх розташування належить компонувальнику контейнера. Задати компонувальник

можна використовуючи конструктор JPanel.

Наприклад:

JPanel panel = new JPanel(new BorderLayout());

Можна задати компонувальник після того як контейнер створено.

Наприклад:

Container contentPane = frame.getContentPane();

contentPane.setLayout(new FlowLayout());

Хоча рекомендується використовувати layout managers, можна створити

контейнер і встановити layout managers null. В цьому випадку ми використовуємо

абсолютне позиціонування, тобто ми повинні безпосередньо задати розміри та

розташування компонентів в межах контейнера. Недолік даного підходу в тому, що

компоненти не будуть коректно вирівняні коли розміри контейнеру змінюються.

Компоновульник FlowLayout.

Компонувальник FlowLayout надає найпростіший спосіб розташування

компонентів. Цей компонувальник є компонувальником по-замовчуванню для JPanel.

На малюнку показано приклад застосування даного компонувальника:

70


Приклад 1.

import javax.swing.*;

import java.awt.*;

public class Lab4 extends JFrame

{

public Lab4()

{

setTitle("FlowLayoutDemo");

Container contentPane = getContentPane();

contentPane.setLayout(new FlowLayout());

contentPane.add(new JButton("Button 1"));

contentPane.add(new JButton("Button 2"));

contentPane.add(new JButton("Button 3"));

contentPane.add(new JButton("Long-Named Button 4"));

contentPane.add(new JButton("5"));

}

public static void main(String[] args)

{

Lab4 lab4 = new Lab4();

lab4.pack();

lab4.setVisible(true);

}

}

Клас FlowLayout має три конструктори:

public FlowLayout()

public FlowLayout(int alignment)

public FlowLayout(int alignment, int horizontalGap, int verticalGap)

Аргумент alignment може бути FlowLayout.LEADING, FlowLayout.CENTER, or

FlowLayout.TRAILING. Якщо аргумент alignment дорівнює FlowLayout.LEADING –

компоненти будуть вирівнюватись по лівому краю, якщо FlowLayout.TRAILING - по

правому, якщо FlowLayout.CENTER – по центру (це значення по-замовчуванню).

Аргументи horizontalGap and verticalGap задають відстань між компонентами в пікселах.

Компонувальник BorderLayout

На малюнку показано розташування кнопок у випадку використання даного

компонувальника:

71


Приклад 2.

import javax.swing.*;

import java.awt.*;

public class Lab4 extends JFrame

{

public Lab4()

{

setTitle("BorderLayoutDemo");

Container contentPane = getContentPane();

contentPane.setLayout(new BorderLayout());

contentPane.add(new JButton("Button 1 - NORTH"), BorderLayout.NORTH);

contentPane.add(new JButton("Button 2 - SOUTH"), BorderLayout.SOUTH);

contentPane.add(new JButton("Button 3 - WEST"), BorderLayout.WEST);

contentPane.add(new JButton("Button 4 - EAST"), BorderLayout.EAST);

contentPane.add(new JButton("Button 5 - CENTER"), BorderLayout.CENTER);

}

public static void main(String[] args)

{

Lab4 lab4 = new Lab4();

lab4.pack();

lab4.setVisible(true);

}

}

72


Компонувальник CardLayout.

Даний компонувальник отримав свою назву по аналогії із колодою карт, коли

тільки верхня карта із цілої колоди є видимою. За власним бажанням ми можемо показати

будь-яку. Як правило до контейнера із CardLayout додаються інші об’єкти типу JPanel.

Приклад 3.

import javax.swing.*;

import java.awt.*;

import java.awt.event.ActionListener;

import java.awt.event.ActionEvent;

public class Lab4 extends JFrame

{

private CardLayout layoutCard;

private JCheckBox chboxSelect;

private JPanel pnlMain;

public Lab4()

{

setTitle("CardLayoutDemo");

Container contentPane = getContentPane();

contentPane.setLayout(new BorderLayout());

chboxSelect = new JCheckBox("Select panel");

chboxSelect.addActionListener(new SelectPanel());

chboxSelect.setSelected(true);

contentPane.add(chboxSelect, BorderLayout.NORTH);

JPanel pnlFlow = new JPanel(new FlowLayout());

JPanel pnlBorder = new JPanel(new BorderLayout());

layoutCard = new CardLayout();

pnlMain = new JPanel(layoutCard);

contentPane.add(pnlMain, BorderLayout.CENTER);

pnlMain.add(pnlFlow, "FlowLayout");

pnlMain.add(pnlBorder, "BorderLayout");

pnlFlow.add(new JButton("Button 1"));

pnlFlow.add(new JButton("Button 2"));

pnlFlow.add(new JButton("Button 3"));

pnlFlow.add(new JButton("Long-Named Button 4"));

pnlFlow.add(new JButton("5"));

pnlBorder.add(new JButton("Button 1 - NORTH"), BorderLayout.NORTH);

73


pnlBorder.add(new JButton("Button 2 - SOUTH"), BorderLayout.SOUTH);

pnlBorder.add(new JButton("Button 3 - WEST"), BorderLayout.WEST);

pnlBorder.add(new JButton("Button 4 - EAST"), BorderLayout.EAST);

pnlBorder.add(new JButton("Button 5 - CENTER"), BorderLayout.CENTER);

}

class SelectPanel implements ActionListener

{

public void actionPerformed(ActionEvent e)

{

if (chboxSelect.isSelected())

layoutCard.show(pnlMain, "FlowLayout");

else

layoutCard.show(pnlMain, "BorderLayout");

}

}

public static void main(String[] args)

{

Lab4 lab4 = new Lab4();

lab4.pack();

lab4.setVisible(true);

}

}

Результат виконання програми

На даному прикладі показані дві панелі, додані до панелі із компонувальником

CardLayout. Для того, щоб показати одну із панель – натисніть селектор (JCheckBox) із

написом “Select panel”.

Коли ми додаємо панелі до контейнера ми повинні задати стрічку, котра

ідентифікує дану панель. В даному прикладі ми додаємо першу панель із стрічкою

"FlowLayout", а другу – із "BorderLayout". Для того, щоб показати одну із панелей,

необхідно передати функції show() як аргумент стрічку, котра ідентифікує панель.

Компонувальник BoxLayout.

Цей компонувальник подібний до FlowLayout, але використовуючи його можна задавати

вісь, вздовж якої будуть додаватись компоненти.

Приклад 4.

import javax.swing.*;

import java.awt.*;

74


public class Lab4 extends JFrame

{

public Lab4()

{

setTitle("CardLayoutDemo");

Container contentPane = getContentPane();

contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));

JButton button1 = new JButton("Button 1");

contentPane.add(button1);

JButton button2 = new JButton("Button 2");

contentPane.add(button2);

JButton button3 = new JButton("Button 3");

contentPane.add(button3);

JButton button4 = new JButton("Long-Named Button 4");

contentPane.add(button4);

JButton button5 = new JButton("5");

contentPane.add(button5);

}

public static void main(String[] args)

{

Lab4 lab4 = new Lab4();

lab4.pack();

lab4.setVisible(true);

}

}

Результат виконання даної програми показано на даному малюнку:

75


В конструкторі BoxLayout(contentPane, BoxLayout.Y_AXIS) в якості аргументу

передається значення BoxLayout.Y_AXIS, тому кнопки розташовані по вертикалі.

Крім того, BoxLayout має ряд особливостей. У випадку використання даного

компонувальника береться до уваги також вирівнювання для кожного компонента, доданого до

контейнера. Ця властивість компонента задається таким чином: button1.setAlignmentX(float x),

Де аргумент x може приймати значення від 0.0 до 1.0. Існує три наперед визначених

можливості:

JButton.CENTER_ALIGNMENT = 0.5

JButton.LEFT_ALIGNMENT = 0.0

JButton.RIGHT_ALIGNMENT = 1.0

На наступному малюнку показано три варіанти вирівнювань:

Наступна особливість – розмір кнопки визначається її максимальною величиною. Якщо ми

задамо максимальний розмір кнопки таким, що її ширина буде більшою, ніж екран – кнопка

займе весь контейнер по ширині.

Компонувальник GridLayout

Компонувальник GridLayout розташовує компоненти у вигляді сітки комірок. Кожен

компонент займає весь простір в межах комірки, причому всі комірки мають одинаковий розмір.

Якщо ми змінимо розмір контейнера – всі комірки теж змінять свої розміри, займаючи весь

вільний простір.

Приклад 5.

import javax.swing.*;

import java.awt.*;

public class Lab5 extends JFrame

{

public Lab5()

{

setTitle("GridLayoutDemo");

Container contentPane = getContentPane();

contentPane.setLayout(new GridLayout(0,2));

JButton button1 = new JButton("Button 1");

76


contentPane.add(button1);

JButton button2 = new JButton("Button 2");

contentPane.add(button2);

JButton button3 = new JButton("Button 3");

contentPane.add(button3);

JButton button4 = new JButton("Long-Named Button 4");

contentPane.add(button4);

JButton button5 = new JButton("5");

contentPane.add(button5);

}

public static void main(String[] args)

{

Lab5 lab5 = new Lab5();

lab5.pack();

lab5.setVisible(true);

}

}

В результаті виконання даної програми ви побачите наступне вікно:

Клас GridLayout має два конструктори:

public GridLayout(int rows, int columns)

public GridLayout(int rows, int columns, int horizontalGap, int verticalGap)

Принаймні один із аргументів rows або columns повинен не дорівнювати нулю; якщо

один із аргументів нуль, як в даному прикладі, тоді кількість рядків визначається кількістю

доданих кнопок, причому кнопки розташовується в дві колонки. Аргументи horizontalGap і

verticalGap дозволяють задати відстань між компонентами в пікселах. По замовчуванню ця

відстань дорівнює нулю. Компонувальник GridBagLayout.

Приклад 6.

import javax.swing.*;

import java.awt.*;

public class Lab5 extends JFrame

{

public Lab5()

77


{

setTitle("GridBagLayoutDemo");

Container pane = getContentPane();

pane.setLayout(new GridBagLayout());

GridBagConstraints c = new GridBagConstraints();

c.fill = GridBagConstraints.HORIZONTAL;

JButton button1 = new JButton("Button 1");

c.weightx = 0.5;

c.gridx = 0;

c.gridy = 0;

pane.add(button1, c);

JButton button2 = new JButton("Button 2");

c.gridx = 1;

c.gridy = 0;

pane.add(button2, c);

JButton button3 = new JButton("Button 3");

c.gridx = 2;

c.gridy = 0;

pane.add(button3, c);

JButton button4 = new JButton("Long-Named Button 4");

c.ipady = 40;

//make this component tall

c.weightx = 0.0;

c.gridwidth = 3;

c.gridx = 0;

c.gridy = 1;

pane.add(button4, c);

JButton button5 = new JButton("5");

c.ipady = 0;

//reset to default

c.weighty = 1.0; //request any extra vertical space

c.anchor = GridBagConstraints.PAGE_END; //bottom of space

c.insets = new Insets(10,0,0,0); //top padding

c.gridx = 1;

//aligned with button 2

c.gridwidth = 2; //2 columns wide

c.gridy = 2;

//third row

pane.add(button5, c);

}

public static void main(String[] args)

{

Lab5 lab5 = new Lab5();

lab5.pack();

lab5.setVisible(true);

78


}

}

На малюнку показано вікно, збудоване із використанням даного компонувальника.

GridBagLayout є найбільш гнучким і разом з тим найбільш складним в платформі Java.

Він дозволяє розміщувати компоненти у виляді сітки із рядів і колонок. При цьому компоненти

можуть займати декілька рядків або колонок. Також колонки можуть мати різну ширину, а рядки

різну висоту. При цьому для визначення висоти і ширини комірки приймається до уваги

найоптимальніший розмір компонента. Цей розмір отримується функцією getPrefferedSize(). Його

також можна задати для кожного компонента з допомогою функції setPrefferedSize(Dimension

dim).

На наступному малюнку показана сітка для попереднього вікна. Як видно, сітка має три

колонки і три рядки. Кнопка в другому рядку займає всі колонки; кнопка в третьому рядку займає

дві праві колонки.

Якщо ми збільшимо вікно, як показано на малюнку, то побачимо, що нижній ряд, де

знаходиться Button 5, займає весь новий вертикальний простір. Новий горизонтальний простір

ділиться між всіма колонками. Така поведінка компонентів задається параметрами

GridBagLayout. Слід відмітити, що кожен компонент займає весь можливий горизонтальний

простір, але не весь можливий вертикальний простір (як можна бачити у Button 5). Ця поведінка

теж задається в програмі.

Для того, щоб задати поведінку кожного компонента, ми повинні задати для кожного із

них свої констрейнти (contraints). Констрейнт – це об’єкт класу GridBagConstraints. При

додаванні компонента до контейнера, ми повинні вказати констрейнт для кожного компонента.

Наприклад:

GridBagConstraints c = new GridBagConstraints();

c.fill = GridBagConstraints.HORIZONTAL;

79


JButton button1 = new JButton("Button 1");

c.weightx = 0.5;

c.gridx = 0;

c.gridy = 0;

pane.add(button1, c);

Нижче пояснюється значення кожної змінної класу GridBagConstrains:

gridx, gridy

Задає рядок і колонку де буде знаходитись верхній лівий куток компонента. По

замовчуванню, gridx=0 і gridy=0.

gridwidth, gridheight

Задає кількіть колонок (gridwidth) або рядків (gridheight) які буде займати

компонент. Або інакше кажучи, цим параметром задається кількість комірок, але не пікселів,

котрі займає компонент. Значення по замовчуванню - 1.

fill

Якщо розмір оптимальний розмір компонента (визначається get/setPrefferedSize() ) є

меншим ніж комірка, в якій знаходиться компонент, цей параметр задає, яким чином буде

зайнятий

вільний

простір

в

межах

комірки.

Значення

по

замовчування

GridBagConstraints.NONE, Якщо цей параметр - GridBagConstraints.HORIZONTAL –

компонент займає весь можливий горизонтальний простір, якщо - VERTICAL - компонент займає

весь можливий вертикальний простір, а у випадку BOTH – компонент займає всю комірку.

ipadx, ipady

Задає мінімальний можливий розмір компонента в комірці. По замовчуванню – 0. Ширина

компонента буде не менше, ніж його мінімальна ширина плюс ipadx*2 піксел, аналогічно,

висота компонента буде не меншою, ніж його мінімальна висота плюс ipady*2 піксел.

(Мінімальні розміри компонента задаються функцією getMinimumSize()).

insets

Задає відстань між компонентом та краєм комірки, в якій знаходиться компонент. Ця

величина – обєкт класу Insets(int top, int left, int bottom, int right). По замовчуванню, дорівнює null.

anchor

Використовується, коли компонент є меншим, ніж комірка, в якій він знаходиться,

визначає розташування компонента в комірці. Можливі значення (GridBagConstraints

константи): CENTER (по замовчуванню), PAGE_START, PAGE_END, LINE_START, LINE_END,

FIRST_LINE_START, FIRST_LINE_END, LAST_LINE_END, і LAST_LINE_START.

Нижче на малюнку показано розташування компонента в межах комірки із заданими

значеннями anchor.

----------------------------------------------------------------------| NORTHEAST

NORTH

NORTHWEST

|

|

|

|

|

|EAST

CENTER

WEST

|

|

|

|

|

|SOUTHEAST

EAST

SOUTHWEST

|

-----------------------------------------------------------------------weightx, weighty

80


Ці параметри визначають те, яким чином розподіляється вільна область контейнера.

Параметр weightx - визначає як розподіляється область між колонками, а weighty – між

рядками. Можливі значення – від 0.0 до 1.0.

Якщо ми не задали ці параметри, то всі компоненти будуть знаходитись по центру

контейнера. Якщо одна із колонок має weightx=1.0, тоді вона буде займати весь вільний простір

контейнера по ширині. Аналогічно розподіляється простір по-вертикалі.

Порядок виконання роботи

1. Виконайте приклад 1 із різними значеннями аргументу alignment.

Спробуєте змінити розміри вікна. Зверніть увагу як при цьому змінюється

розташування кнопок.

2. Виконайте приклад 2 із різною кількістю доданих кнопок.

Спробуєте змінити розміри вікна. Зверніть увагу як при цьому змінюється

розташування кнопок. Спробуйте додати дві кнопки з одним і тим же значенням

BorderLayout.

3. Виконайте приклад 3.

4. Виконайте приклад 4. Задайте різні значення вирівнювання для всіх кнопок:

button1.setAlignmentX(JButton.CENTER_ALIGNMENT).Задайте

значення

максимального розміру кнопок, як показано нижче: button1.setMaximumSize(new

Dimension(Integer.MAX_VALUE,30)).

Спробуйте поміняти розмір вікна.

5.Виконайте приклад 5. Змініть кількість колонок та рядків в конструкторі. Зверніть увагу

на поведінку кнопок при зміні розмірів вікна.

6. Виконайте приклад 6.

7. Зробити висновки.

8. Оформити звіт. У звіті повинно бути текст програми і скріншоти результатів.

9. Прикріпити до VNS файл [Ваша Фамілія].zip в архіві повинно бути файли програм

[Ваша Фамілія]_labN_k.class ,a також файли звіту [Ваша Фамілія]_Zvit_LabN.mdb, де N – номер

лабораторної роботи, k – номер програми.

Контрольні питання

1. Який з компонувальників використовує змінну констрейнт (Constraints)?

2. Який параметр у компонувальнику GridBagLayout задає відстань між компонентом та краєм

комірки, в якій знаходиться компонент.

3. Який параметр у компонувальнику GridBagLayout задає мінімальний можливий розмір

компонента в комірці.

4. Який параметр у компонувальнику GridBagLayout задає кількіть колонок або рядків які буде

займати компонент.

5. Який параметр у компонувальнику GridBagLayout задає рядок і колонку де буде знаходитись

верхній лівий куток компонента.

6. Який з компонувальників дозволяє розміщувати компоненти у виляді сітки із рядів і колонок.

При цьому компоненти можуть займати декілька рядків або колонок. Також колонки можуть

мати різну ширину, а рядки різну висоту. При цьому для визначення висоти і ширини

комірки приймається до уваги найоптимальніший розмір компонента.

7.

Який компонувальник розташовує компоненти у вигляді сітки комірок.

81



 

А также другие работы, которые могут Вас заинтересовать

81566. Коллаген: особенности аминокислотного состава, первичной и пространственной структуры. Роль аскорбиновой кислоты в гидоксилировании пролина и лизина 108.5 KB
  В межклеточном матриксе молекулы коллагена образуют полимеры называемые фибриллами коллагена. Фибриллы коллагена обладают огромной прочностью и практически нерастяжимы. Молекулы коллагена состоят из трёх полипептидных цепей называемых αцепями. Первичная структура αцепей коллагена необычна так как каждая третья аминокислота в полипептидной цепи представлена глицином около 1 4 аминокислотных остатков составляют пролин или 4гидроксипролин около 11 аланин.
81567. Особенности биосинтеза и созревания коллагена. Проявления недостаточности витамина С 106.89 KB
  Синтез и созревание коллагена сложный многоэтапный процесс начинающийся в клетке а завершающийся в межклеточном матриксе. Синтез и созревание коллагена включают в себя целый ряд посттрансляционных изменений: гидроксилирование пролина и лизина с образованием гидроксипролина Hyp и гидроксилизина Hyl; гликозилирование гидроксилизина; частичный протеолиз отщепление сигнального пептида а также N и Сконцевых пропептидов; образование тройной спирали. Синтез полипептидных цепей коллагена.
81568. Особенности строения и функции эластина 103.27 KB
  Эластин содержит довольно много пролина и лизина но лишь немного гидроксипролина; полностью отсутствует гидроксилизин. В образовании этих сшивок участвуют остатки лизина двух трёх или четырёх пептидных цепей. Предполагают что эти гетероциклические соединения формируются следующим образом: вначале 3 остатка лизина окисляются до соответствующих εальдегидов а затем происходит их соединение с четвёртым остатком лизина с образованием замещённого пиридинового кольца. Окисление остатков лизина в εальдегиды осуществляется медьзависимой...
81569. Гликозаминогликаны и протеогликаны. Строение и функции. Роль гиалуроновой кислоты в организации межклеточного матрикса 192.62 KB
  Протеогликаны высокомолекулярные соединения состоящие из белка 510 и гликозаминогликанов 9095. Протеогликаны отличаются от большой группы белков которые называют гликопротеинами. Гликозаминогликаны и протеогликаны являясь обязательными компонентами межклеточного матрикса играют важную роль в межклеточных взаимодействиях формировании и поддержании формы клеток и органов образовании каркаса при формировании тканей.
81570. Адгезивные белки межклеточного матрикса: фибронектин и ламинин, их строение и функции. Роль этих белков в межклеточных взаимодействиях и развитии опухолей 104.14 KB
  К первой группе белков с выраженными адгезивными свойствами относят фибронектин ламинин нидоген фибриллярные коллагены и коллаген IV типа; их относят к белкам зрелой соединительной ткани. Фибронектин. Фибронектин один из ключевых белков межклеточного матрикса неколлагеновый структурный гликопротеин синтезируемый и выделяемый в межклеточное пространство многими клетками.
81571. Структурная организация межклеточного матрикса. Изменения соединительной ткани при старении, коллагенозах. Роль коллагеназы при заживлении ран. Оксипролинурия 112.48 KB
  Роль коллагеназы при заживлении ран. Коллаген IX типа антипараллельно присоединяется к фибриллам коллагена II типа. Его глобулярный НК4домен основный он не связан с фибриллами коллагена II типа и поэтому к нему может присоединяться такой компонент матрикса как гиалуроновая кислота. Микрофибриллы которые образуются тетрамерами коллагена VI типа присоединяются к фибриллам коллагена II типа и к гиалуроновой кислоте.
81572. Важнейшие белки миофибрилл: миозин, актин, актомиозин, тропомиозин, тропонин, актинин. Молекулярная структура миофибрилл 116.56 KB
  Молекулярная масса миозина скелетных мышц около 500000 для миозина кролика 470000. Молекула миозина имеет сильно вытянутую форму длину 150 нм. Легкие цепи находящиеся в головке миозиновой молекулы и принимающие участие в проявлении АТФазнойактивности миозина гетерогенны по своему составу. Количество легких цепей в молекуле миозина у различных видов животных и в разных типах мышц неодинаково.
81573. Биохимические механизмы мышечного сокращения и расслабления. Роль градиента одновалентных ионов и ионов кальция в регуляции мышечного сокращения и расслабления 107.85 KB
  В настоящее время принято считать что биохимический цикл мышечного сокращения состоит из 5 стадий: 1 миозиновая головка может гидролизовать АТФ до АДФ и Н3РО4 Pi но не обеспечивает освобождения продуктов гидролиза. Актомиозиновая связь имеет наименьшую энергию при величине угла 45 поэтому изменяется угол миозина с осью фибриллы с 90 на 45 примерно и происходит продвижение актинана 1015 нм в направлении центра саркомера; 4 новая молекула АТФ связывается с комплексом миозинFактин; 5 комплекс миозинАТФ обладает низким...
81574. Саркоплазматические белки: миоглобин, его строение и функции. Экстрактивные вещества мышц 122.6 KB
  Концентрация адениновых нуклеотидов в скелетной мускулатуре кролика в микромолях на 1 г сырой массы ткани составляет: АТФ 443 АДФ 081АМФ 093. в мышечной ткани по сравнению с концентрациейадениновых нуклеотидов очень мало. К азотистым веществам мышечной ткани принадлежат имидазолсодержащие дипептиды карнозин и ансерин.; метилированное производное карнозина ансерин был обнаружен в мышечной ткани несколько позже.