ПредишенСледващото

Ако малко се спекулира за това как трябва да се случи, веднага ми идва на ум е нещо като: да се добави в JPanel (или където другаде отиваме да добавите компонент) е метод За да добавите, след което да се премахне трябва да се премахне. Добре, всичко е наред - такива методи съществуват и те правят точно това, което ви трябва. Въпреки това, има няколко трика, които трябва да знаете, ако искате да направите (или не искат да имат, но е необходимо) на динамичното добавяне и премахване.

Нека да видим всички примери на кода.

Позовавайки се директно към корпуса на тест и вижте кода за бутона пожелах "Добавяне" и "Премахване". Това, което правим в действителност го направя. Това е, което прави добавянето на нов JLabel:

За да започнете, изчисляване на индекса, който ще има нова по-JLabel, номерацията е в ред. Тогава се създаде нова по-JLabel, той постави на шрифта, подравняването и се добавя към панела. И сега най-intersnoe - обадете се презавери метод в JScrollPane. Ако не се направи този призив, ние няма да види нищо.

Нека да видим какво ще се случи по-рано, когато изтривате добавена JLabel.

Първо, ние проверяваме дали има JLabel'y, които могат да бъдат отстранени или не. Ако такъв JLabel там, ние откриваме индекса (последен в списъка), го премахнете от панела, като се обадите на метода на премахване. След това трябва да се обадите на пребоядиса в JPanel, което е JLabel. Обадете се пребоядиса JPanel казва, че той трябва да бъде преобразена. И накрая, най-новата разговор - това презавери в JScrollPane, което е JPanel.

Същото може да бъде направено без списъка:

обществени клас TestFrame простира JFrame

публично статично невалидни createGUI () окончателно JFrame рамка = нов JFrame ( «Тест кадър»);
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

крайния шрифта = нов шрифт ( «Verdana», Font.PLAIN, 25);

JPanel butPanel = нови JPanel ();

JButton addButton = нов JButton ( «+»);
addButton.setFont (шрифт);
addButton.setFocusable (фалшива);
butPanel.add (addButton);

JButton remButton = нов JButton ( «-«);
remButton.setFont (шрифт);
remButton.setFocusable (фалшива);
butPanel.add (remButton);

окончателен JPanel labPanel = нови JPanel ();
окончателен JScrollPane scrollPane = нов JScrollPane (labPanel);
labPanel.setLayout (нов BoxLayout (labPanel, BoxLayout.Y_AXIS));

addButton.addActionListener (нов ActionListener () обществени невалидни actionPerformed (ActionEvent д) Int номер = labPanel.getComponentCount () + 1;
етикет JLabel = нов JLabel ( «Label» + номер);
label.setAlignmentX (JLabel.CENTER_ALIGNMENT);
label.setFont (шрифт);
labPanel.add (етикет);
scrollPane.revalidate ();
>
>);

remButton.addActionListener (нов ActionListener () обществени невалидни actionPerformed (ActionEvent д) ако (labPanel.getComponentCount ()> 0) индекс Int = labPanel.getComponentCount () - 1;
JLabel етикет = (JLabel) labPanel.getComponent (индекс);
labPanel.remove (етикет);
labPanel.repaint ();
scrollPane.revalidate ();
>
>
>);

. Frame.getContentPane () setLayout (нов BorderLayout ());
. Frame.getContentPane () се добавя (butPanel, BorderLayout.NORTH);
. Frame.getContentPane () се добавя (scrollPane, BorderLayout.CENTER);

frame.setPreferredSize (ново измерение (250, 200));
frame.pack ();
frame.setLocationRelativeTo (нула);
frame.setVisible (истина);
>

публично статично невалидни основни (String [] аргументи) javax.swing.SwingUtilities.invokeLater (нова Изпълнима () обществени нищожен план () JFrame.setDefaultLookAndFeelDecorated (вярно);
createGUI ();
>
>);
>
>

Хм ... неразбираемо решение.

Къде по-гъвкави, за да създадете JList със собствен модел (простира AbstractListModel), в който всички танцуват на техния собствен списък. Този списък, разбира се, можете да съхраните не само серийния номер и премахване не само последния елемент.

И тогава през ListCellRenderer за да се покаже нищо, а нещо по-трудно да се изгради етикет също ще бъде относително лесно, защото заводския отбор или компоненти удобно прикрепят към списъка с модели.

Гъвкаво решение, аз съм съгласен. Гъвкавостта обаче трябва да се използва, ако е необходимо.

eto_ya:
Хм ... неразбираемо решение.
Къде по-гъвкави, за да създадете JList със собствен модел (простира AbstractListModel), в който всички танцуват на техния собствен списък. Този списък, разбира се, можете да съхраните не само серийния номер и премахване не само последния елемент.
И тогава през ListCellRenderer за да се покаже нищо, а нещо по-трудно да се изгради етикет също ще бъде относително лесно, защото заводския отбор или компоненти удобно прикрепят към списъка с модели.

Както и в този случай се добавят още JLabel, че той е успоредна на първата?

Ако разбирам правилно, е необходимо да се промени BoxLayout на ориентация с Y_AXIS на X_AXIS.
Това означава, че вместо тази линия тук
labPanel.setLayout (нов BoxLayout (labPanel, BoxLayout.Y_AXIS));
ще бъде тук тази
labPanel.setLayout (нов BoxLayout (labPanel, BoxLayout.X_AXIS));

bondforev и може дори да ви кажа как да се работи с XML

Подкрепете проекта - споделете линка, благодаря!