Dinamikusan hozzáadása és eltávolítása, alkatrészek és JPanel jscrollpane, java swing és más java

Ha egy kicsit elmélkedni, hogy ez történjen, azonnal eszembe jut valami hasonló: a hozzáadni JPanel (vagy bárhol máshol fogunk hozzá egy komponens) a kiegészítő módszer hozzá, majd eltávolítjuk kell eltávolítani. Rendben, rendben - ilyen módszerek léteznek, és ők pontosan mire van szüksége. Van azonban egy pár trükköt, amit tudnia kell, ha akarsz (vagy nem akarnak, de ez szükséges) a dinamikus hozzáadása és eltávolítása.

Lássuk az összes kód példák.

Hivatkozva közvetlenül a teszt és nézd meg a kódot az áhított gomb „hozzáadása” és a „Remove”. Mit tényleg csinálni. Ez teszi, hogy egy új JLabel:

Kezdeni, kiszámítja az index, amely egy új egy JLabel, hogy a számozás volt ahhoz. Ezután hozzon létre egy új egy JLabel, ő meg a betűtípus, igazítás, és adjuk hozzá a panelt. És most a legtöbb intersnoe - hívja az érvényesség módszer JScrollPane. Ha nem teszi, hogy hívás, nem fogunk látni semmit.

Lássuk, mi történik törlésekor a korábban felvett JLabel.

Először is nézze meg, hogy van-e JLabel'y, amelyet el lehet távolítani, vagy sem. Ha egy ilyen JLabel ott találjuk az index (utolsó a listában), távolítsa el a panel hívja a eltávolítás módszer. Akkor meg kell hívni a átfestés a JPanel, ami JLabel. Hívjon átfestés JPanel azt mondja, hogy meg kell rajzolni. És végül, a legutóbbi hívás - az érvényesség azt egy JScrollPane, ami egy JPanel.

Ugyanezt meg lehet tenni anélkül, hogy a lista:

public class TestFrame kiterjed JFrame

public static void createGUI () végleges JFrame frame = new JFrame ( «Test frame»);
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

végső betűtípus font = új betűtípus ( «Verdana», Font.PLAIN, 25);

JPanel butPanel = új JPanel ();

JButton addButton = new JButton ( «+»);
addButton.setFont (font);
addButton.setFocusable (false);
butPanel.add (addButton);

JButton remButton = új JButton ( «-«);
remButton.setFont (font);
remButton.setFocusable (false);
butPanel.add (remButton);

végleges JPanel labPanel = új JPanel ();
végleges JScrollPane scrollPane = új JScrollPane (labPanel);
labPanel.setLayout (új BoxLayout (labPanel, BoxLayout.Y_AXIS));

addButton.addActionListener (új ActionListener () public void actionPerformed (ActionEvent e) int szám = labPanel.getComponentCount () + 1;
JLabel label = new JLabel ( «Label» + szám);
label.setAlignmentX (JLabel.CENTER_ALIGNMENT);
label.setFont (font);
labPanel.add (címke);
scrollPane.revalidate ();
>
>);

remButton.addActionListener (új ActionListener () public void actionPerformed (ActionEvent e) amennyiben (labPanel.getComponentCount ()> 0) int index = labPanel.getComponentCount () - 1;
JLabel label = (JLabel) labPanel.getComponent (index);
labPanel.remove (címke);
labPanel.repaint ();
scrollPane.revalidate ();
>
>
>);

. Frame.getContentPane () setLayout (új BorderLayout ());
. Frame.getContentPane () hozzá (butPanel, BorderLayout.NORTH);
. Frame.getContentPane () hozzá (scrollPane, BorderLayout.CENTER);

frame.setPreferredSize (új dimenzió (250, 200));
frame.pack ();
frame.setLocationRelativeTo (null);
frame.setVisible (true);
>

public static void main (String [] args) javax.swing.SwingUtilities.invokeLater (új futtatható () public void run () JFrame.setDefaultLookAndFeelDecorated (true);
createGUI ();
>
>);
>
>

Hmm ... érthetetlen döntést.

Amennyiben rugalmasabb, hogy hozzon létre egy JList saját modellje (bővíti AbstractListModel), amelyben minden táncos a saját privát listáról. Ez a lista természetesen tárolhatja nemcsak a sorozatszámot, és távolítsa el nem csak az utolsó elem.

Majd keresztül ListCellRenderer megjeleníteni semmit, és még valami nehéz építeni egy címkét is viszonylag egyszerű, mert a gyári csapat vagy alkatrészek kényelmesen tulajdonítanak a listát modellek.

Rugalmas megoldás, egyetértek. A rugalmasság azonban felhasználhatók, ha szükséges.

eto_ya:
Hmm ... érthetetlen döntést.
Amennyiben rugalmasabb, hogy hozzon létre egy JList saját modellje (bővíti AbstractListModel), amelyben minden táncos a saját privát listáról. Ez a lista természetesen tárolhatja nemcsak a sorozatszámot, és távolítsa el nem csak az utolsó elem.
Majd keresztül ListCellRenderer megjeleníteni semmit, és még valami nehéz építeni egy címkét is viszonylag egyszerű, mert a gyári csapat vagy alkatrészek kényelmesen tulajdonítanak a listát modellek.

Mivel ebben az ügyben újabb JLabel, hogy ő volt az elsővel párhuzamosan?

Ha jól értem, meg kell változtatni a tájolás BoxLayout a Y_AXIS a X_AXIS.
Vagyis ahelyett, hogy ezt a sort itt
labPanel.setLayout (új BoxLayout (labPanel, BoxLayout.Y_AXIS));
lesz itt
labPanel.setLayout (új BoxLayout (labPanel, BoxLayout.X_AXIS));

bondforev és még mondani, hogyan kell dolgozni xml