在我的应用程序中,我有6个Jlabels
的列表,它们以contentPane
循环的形式添加到for
中。之后,我添加2 JButtons
-一个用于删除所有标签,第二个用于再次添加标签:
public class Test {
private JFrame frame;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Test window = new Test();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public Test() {
initialize();
}
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 960, 620);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.getContentPane().setLayout(null);
frame.getContentPane().setBackground(new Color(30, 30, 30));
LinkedList<JLabel> labels = new LinkedList<>();
for(int i = 0 ; i < 6 ; i++) {
labels.get(i).setSize(280, 50);
labels.setBackground(new Color(75, 75, 75));
labels.setOpaque(true);
}
Button buttonAdd = new JButton("Add");
buttonAdd.setBounds(310, 15, 150, 50);
buttonAdd.addMouseListener(new MouseAdapter() {
@Override
public final void mouseClicked(MouseEvent event) {
for(int i = 0 ; i < 6 ; i++) {
labels.get(i).setLocation(15, 15+50*i);
frame.getContentPane().add(labels.get(i));
}
}
});
Button buttonRemove = new JButton("Remove");
buttonRemove.setBounds(310, 15, 150, 50);
buttonRemove.addMouseListener(new MouseAdapter() {
@Override
public final void mouseClicked(MouseEvent event) {
for(int i = 0 ; i < 6 ; i++) {
frame.getContentPane().remove(labels.get(i));
}
}
});
}
}
当我在linstener外面添加6个标签时,它们已正确添加到ContentPane
并显示。但是,当我尝试通过按钮执行此操作时,单击buttonAdd
时没有任何反应。它们不会显示。
我尝试弄乱层次结构,手动设置索引,但没有任何效果。我怀疑是MouseListeners,但我不知道为什么这不起作用。
答案 0 :(得分:1)
第一件事;
-修改GUI的任何操作都必须在事件分发线程(EDT)中完成。您可以从this answer.
中了解更多原因。您必须致电:
Test.this.frame.revalidate();
Test.this.frame.repaint();
像下面这样:
for ( int i = 0; i < 6; i++ )
{
final JLabel l = labels.get( i );
l.setLocation( 15, 15 + (50 * i) );
Test.this.frame.getContentPane().add( l );
}
Test.this.frame.revalidate();
Test.this.frame.repaint();
除此之外,我在您的代码中看到您使用Button
而不是JButton
,我认为这只是一个输入错误。它应该是JButton
。也是
for(int i = 0 ; i < 6 ; i++) {
labels.get(i).setSize(280, 50);
labels.setBackground(new Color(75, 75, 75));
labels.setOpaque(true);
}
这段代码是错误的,标签是list
而不是JLabel
。定义局部变量
JLabel labelToAdd = labels.get(i)
labelToAdd.setSize(280, 50);
labelToAdd.setBackground(new Color(75, 75, 75));
labelToAdd.setOpaque(true);