Adăugarea și eliminarea dinamică a componentelor cu jpanel și jscrollpane, java swing și alte java

În cazul în care un pic de a specula cu privire la modul în care acest lucru ar trebui să se întâmple, imediat vine în minte este ceva de genul: pentru a adăuga în JPanel (sau oriunde altundeva vom adăuga o componentă) este metoda adăugare pentru a adăuga, apoi pentru a elimina trebuie eliminați. Bine, bine - există astfel de metode și fac exact ceea ce este necesar. Cu toate acestea, există câteva trucuri pe care trebuie să le știți dacă doriți să faceți (sau nu doriți, dar trebuie să le adăugați și să le eliminați dinamic).







Să vedem codul pentru întregul exemplu.

Hai să mergem direct la test și să vedem codul dragut pentru butoanele "Add" și "Delete". Ce se face de fapt. Când adaugi un nou JLabel, iată ce:

Mai întâi, vom calcula indicele, care va fi pentru noua JLabel, astfel încât numerotarea să ajungă în ordine. Apoi, creați un nou JLabel, setați fontul, aliniați-l și adăugați-l pe panou. Și acum cel mai intersex - numim metoda revalidată în JScrollPane. Dacă nu facem acest apel, atunci nu vom vedea nimic.

Să vedem ce se întâmplă când ștergi un JLabel adăugat anterior.

În primul rând, verificăm dacă există JLabeli care pot fi șterși sau nu. Dacă există o astfel de JLabel, găsim indexul său (ultimul din listă), îl eliminăm din panoul apelând metoda de ștergere. Apoi trebuie să sunăm repaint pe panoul JPanel pe care se află JLabel. Apelul de reproșare îi spune lui JPanel că trebuie redesenat. În cele din urmă, cel mai recent apel este o revalidare de la JScrollPane, pe care se află JPanel.

Același lucru se poate face fără o listă:

clasa publica TestFrame extinde JFrame

public static void createGUI () ultimul cadru JFrame = nou JFrame ("Cadru de testare");
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

finală Font font = font nou ("Verdana", Font.PLAIN, 25);

JPanel butPanel = nou JPanel ();

JButton addButton = noul JButton ("+");
addButton.setFont (font);
addButton.setFocusable (fals);
darPanel.add (addButton);

JButton remButton = noul JButton ("-");






RemButton.setFont (font);
RemButton.setFocusabil (fals);
darPanel.add (remButton);

ultimul JPanel labPanel = nou JPanel ();
ultimul JScrollPane scrollPane = noul JScrollPane (labPanel);
labPanel.setLayout (noul BoxLayout (labPanel, BoxLayout.Y_AXIS));

addButton.addActionListener (nou ActionListener () void actionPerformed (ActionEvent e) int = numărul publice labPanel.getComponentCount () + 1;
JLabel label = noul JLabel ("Label" + number);
label.setAlignmentX (JLabel.CENTER_ALIGNMENT);
label.setFont (font);
labPanel.add (etichetă);
scrollPane.revalidate ();
>
>);

remButton.addActionListener (nou ActionListener () public void actionPerformed (ActionEvent e) în cazul în care (labPanel.getComponentCount ()> 0) int index = labPanel.getComponentCount () - 1;
JLabel etichetă = (JLabel) labPanel.getComponent (index);
labPanel.remove (etichetă);
labPanel.repaint ();
scrollPane.revalidate ();
>
>
>);

frame.getContentPane () setLayout (nou BorderLayout ());
frame.getContentPane () adăugați (butPanel, BorderLayout.NORTH);
frame.getContentPane () adăugați (scrollPane, BorderLayout.CENTER);

frame.setPreferredSize (noua dimensiune (250, 200));
frame.pack ();
frame.setLocationRelativeTo (null);
frame.setVisible (adevărat);
>

statice void main (String [] args) publice javax.swing.SwingUtilities.invokeLater (nou Runnable () public void run () JFrame.setDefaultLookAndFeelDecorated (true);
createGUI ();
>
>);
>
>

Nu este soluție clară.

Este mult mai flexibil să creezi un JList cu propriul tău model (extinde AbstractListModel), în care poți să dansezi oriunde din propria listă privată. În această listă, desigur, puteți să stocați nu numai numărul de serie și să ștergeți nu numai ultimul element.

Și apoi prin ListCellRenderer pentru a afișa nimic, și ceva mai dificil de a construi o etichetă va fi, de asemenea, relativ ușor, deoarece echipa din fabrică sau componente convenabil atașa lista de modele.

Soluția este flexibilă, sunt de acord. Însă, dacă este necesar, trebuie utilizată flexibilitatea.

eto_ya:
Nu este soluție clară.
Este mult mai flexibil să creezi un JList cu propriul tău model (extinde AbstractListModel), în care poți să dansezi oriunde din propria listă privată. În această listă, desigur, puteți să stocați nu numai numărul de serie și să ștergeți nu numai ultimul element.
Și apoi prin ListCellRenderer pentru a afișa nimic, și ceva mai dificil de a construi o etichetă va fi, de asemenea, relativ ușor, deoarece echipa din fabrică sau componente convenabil atașa lista de modele.

Cum, în acest caz, pentru a adăuga un alt jLabel, ce ar fi paralel cu primul?

Dacă înțeleg corect, atunci trebuie să modificați orientarea BoxLayout de la Y_AXIS la X_AXIS.
Aceasta este, în loc de această linie
labPanel.setLayout (noul BoxLayout (labPanel, BoxLayout.Y_AXIS));
va fi așa
labPanel.setLayout (noul BoxLayout (labPanel, BoxLayout.X_AXIS));

bondforev și încă ne puteți spune cum să lucrăm cu xml







Trimiteți-le prietenilor: