Как динамически добавлять JLabels в JPanel?
у меня проблема с этим. У меня есть JPanel, и обычно я бы создал JLabel следующим образом:
JLabel lblNewLabel = new JLabel("New label");
lblNewLabel.setBounds(0, 0, 135, 14);
panel.add(lblNewLabel);
но я хочу, чтобы каждый раз, когда я нажимаю кнопку, на этой панели создавалась новая JLabel с тем же размером, но с другой высотой. Я попробовал:
panel.add(new JLabel(stringName));
но таким образом я не могу установить его границы. stringName я получаю от JTextField.
3 ответов
во-первых, использовать планировка. Сделано правильно макет будет размещать компоненты, как вы хотите. Во-вторых, при динамическом добавлении компонента в макет необходимо указать макет для обновления. Вот пример, он добавляет метку каждый раз, когда кнопка нажата:
public static void main(String[] args) {
final JFrame frame = new JFrame("Test");
frame.setLayout(new GridLayout(0, 1));
frame.add(new JButton(new AbstractAction("Click to add") {
@Override
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
frame.add(new JLabel("Bla"));
frame.validate();
frame.repaint();
}
});
}
}));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
SwingUtilities.invokeLater(new Runnable() {
@Override public void run() {
frame.setVisible(true);
}
});
}
как сказал @AndrewThompson используйте правильный LayoutManager
, вы не должны возиться с setBounds
etc.
вот пример, который я сделал (просто добавляет JLabel
до JPanel
каждый раз JButton
кнопки):
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Test {
public Test() {
createAndShowUI();
}
private void createAndShowUI() {
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
initComponents(frame);
frame.setResizable(false);
frame.pack();
frame.setVisible(true);
}
private void initComponents(final JFrame frame) {
final JPanel panel = new JPanel();
JButton button = new JButton("Add label");
button.addActionListener(new ActionListener() {
int count = 1;
@Override
public void actionPerformed(ActionEvent e) {
JLabel _lbl = new JLabel("Label " + count);//make label and assign text in 1 line
panel.add(_lbl);//add label we made
panel.revalidate();
panel.repaint();
frame.pack();//so our frame resizes to compensate for new components
count++;
}
});
frame.add(panel, BorderLayout.CENTER);
frame.add(button, BorderLayout.SOUTH);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Test();
}
});
}
}