我正在从FlowLayout JPanel中的数组动态创建标签,并将它们存储在JLabel数组中以备将来参考。它们按预期从左到右显示。我想将其中一个标签移到面板的开头(最左侧)。
我不介意整个数组移动还是仅两个标签交换位置:
apple orange pear cherry melon
|
cherry apple orange pear melon
or
cherry orange pear apple melon
我交换了数组项,然后进行了revalidate()和repaint(),但是什么也没有发生。是否有一种简单的方法来移动摆动组件而不删除所有组件,然后将它们重新添加到面板中或将所有属性从一个标签复制到另一个标签(我定义了其他标签,而不仅仅是文本)?
这里是我的代码的精简版:
import javax.swing.*;
public class Test extends JPanel {
public Test () {
String entries[] = { "apple", "orange", "pear", "cherry", "melon" };
JLabel[] lbls = new JLabel[entries.length];
for (int i = 0; i < entries.length; ++i) {
lbls[i] = new JLabel();
lbls[i].setText(entries[i]);
add(lbls[i]);
}
// swap array entries
JLabel tmplbl = new JLabel();
tmplbl = lbls[3];
lbls[3] = lbls[0];
lbls[0] = tmplbl;
revalidate();
repaint();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("Test");
frame.setContentPane(new Test());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.pack();
}
});
}
}
在纠正错误之前,有几件事需要修复:
此行有2个错误:public class Test extends JPanel {
Test
吗?很多!使其更具描述性,例如SwapLabelsTest
。 extends JPanel
,您无需更改JPanel
的行为,因此在这种情况下无需扩展它,只需创建JPanel
的新实例。不要将所有内容都放在构造函数中,最好使用initialize()
方法或类似的方法(在下面的代码中为createAndShowGUI()
)来处理GUI构造。这似乎是最简单的方法,但是当项目变大时,将这一部分分离会更方便。
将变量移到更大的范围,以便于处理,除非这些变量在方法中是局部的,否则将提高性能和可读性。
[包含检测事件的组件,例如JButton
,以便在触发该事件(单击按钮)时执行交换操作。
JLabel
上面的代码交换了entrys数组中的值,我们现在要做的就是用String tmpString = entries[3];
entries[3] = entries[1];
entries[1] = tmpString;
内的label
更新每个lbl[i].setText(entries[i])
。
所以,最终您会得到这样的结果:
for-loop
每次单击按钮时,项目1和3(索引)将被交换并且UI将被更新(因为import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Test {
private JFrame frame;
private JPanel panel;
private String entries[] = { "apple", "orange", "pear", "cherry", "melon" };
private JLabel[] lbls = new JLabel[entries.length];
JButton button;
private void createAndShowGUI() {
panel = new JPanel();
for (int i = 0; i < entries.length; ++i) {
lbls[i] = new JLabel();
lbls[i].setText(entries[i]);
panel.add(lbls[i]);
}
button = new JButton("Swap 1 and 3");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String tmpString = entries[3];
entries[3] = entries[1];
entries[1] = tmpString;
reloadLabels();
}
});
frame = new JFrame("Test");
frame.add(panel);
frame.add(button, BorderLayout.SOUTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.pack();
}
private void reloadLabels() {
for (int i = 0; i < entries.length; ++i) {
lbls[i].setText(entries[i]);
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Test().createAndShowGUI();
}
});
}
}
会触发UI更新)。
.setText