如何重新排序 JLabel 的 arrayList 以在列表顶部显示标签
how to re-order an arrayList of JLabel to show a Label on the top of the list
我有一个面板,其中列出了一组基于数组项的 JLabel
。还有一个 JTextFiled
和一个 JButton
作为搜索工具。
所以我可以设法将输入的文本与 JLabel 进行比较并突出显示匹配项 JLabel
。但我想要做的是将 JLabel
带到列表的顶部。当搜索字段被清除时,它会回到原来的位置。
这是我的代码:
public class JavaApplication78 {
JFrame frame;
JPanel panel, labelsPanel, searchPanel;
JLabel label;
JTextField field;
JButton button;
ArrayList<String> names = new ArrayList<String>();
ArrayList<JLabel> labelsArray = new ArrayList<JLabel>();
Border paddingBorder = BorderFactory.createEmptyBorder(10, 10, 10, 10);
Border border = BorderFactory.createLineBorder(Color.black);
JScrollPane labelsScroll;
public JavaApplication78() {
frame = new JFrame();
panel = new JPanel(new BorderLayout());
names.add(".mp3");
names.add(".html");
names.add(".jpeg");
names.add(".mp4");
names.add(".pdf");
labelsPanel = new JPanel(new GridBagLayout());
listLabels();
searchPanel = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
field = new JTextField(10);
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 10;
searchPanel.add(field, c);
button = new JButton("Ser");
c.weightx = 1;
searchPanel.add(button, c);
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent ae) {
String word = getText();
for(JLabel label : labelsArray){
if (label.getText().equals(word)){
//labelsArray.add(0, labelsArray.get(i));
labelsArray.add(0, label);
label.setBackground(Color.red);
}
}
}
});
field.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
field.setText("");
listLabels();
}
});
panel.add(searchPanel, BorderLayout.NORTH);
panel.add(labelsScroll, BorderLayout.CENTER);
frame.add(panel);
frame.setSize(200, 400);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
new JavaApplication78();
}
});
}
public String getText(){
return field.getText();
}
public void listLabels(){
GridBagConstraints gbc = new GridBagConstraints();
gbc.weightx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridwidth = GridBagConstraints.REMAINDER;
labelsScroll = new JScrollPane(labelsPanel);
for (String format : names) {
label = new JLabel(format);
//icon
labelsArray.add(label);
labelsPanel.add(label, gbc);
label.setBorder(BorderFactory.createCompoundBorder(border, paddingBorder));
label.setOpaque(true);
label.setBackground(Color.white);
}
}
}
知道如何将找到的 JLabel 置于列表顶部并在清除搜索字段后将其放回原处吗?
大多数布局管理器会根据组件的添加顺序(也称为 z 顺序)对组件进行布局。
所以你可以使用类似...
field.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//Reset
for (int order = 0; order < labelsArray.size(); order++) {
JLabel label = labelsArray.get(order);
labelsPanel.setComponentZOrder(label, order);
}
String text = field.getText();
for (JLabel label : labelsArray) {
if (label.getText().equals(text)) {
labelsPanel.setComponentZOrder(label, 0);
break;
}
}
labelsPanel.revalidate();
labelsPanel.repaint();
}
});
根据字段中输入的文本重新排序标签。此示例根据标签在 labelsArray
中出现的顺序重置顺序,然后再尝试找到匹配的标签
我有一个面板,其中列出了一组基于数组项的 JLabel
。还有一个 JTextFiled
和一个 JButton
作为搜索工具。
所以我可以设法将输入的文本与 JLabel 进行比较并突出显示匹配项 JLabel
。但我想要做的是将 JLabel
带到列表的顶部。当搜索字段被清除时,它会回到原来的位置。
这是我的代码:
public class JavaApplication78 {
JFrame frame;
JPanel panel, labelsPanel, searchPanel;
JLabel label;
JTextField field;
JButton button;
ArrayList<String> names = new ArrayList<String>();
ArrayList<JLabel> labelsArray = new ArrayList<JLabel>();
Border paddingBorder = BorderFactory.createEmptyBorder(10, 10, 10, 10);
Border border = BorderFactory.createLineBorder(Color.black);
JScrollPane labelsScroll;
public JavaApplication78() {
frame = new JFrame();
panel = new JPanel(new BorderLayout());
names.add(".mp3");
names.add(".html");
names.add(".jpeg");
names.add(".mp4");
names.add(".pdf");
labelsPanel = new JPanel(new GridBagLayout());
listLabels();
searchPanel = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
field = new JTextField(10);
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 10;
searchPanel.add(field, c);
button = new JButton("Ser");
c.weightx = 1;
searchPanel.add(button, c);
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent ae) {
String word = getText();
for(JLabel label : labelsArray){
if (label.getText().equals(word)){
//labelsArray.add(0, labelsArray.get(i));
labelsArray.add(0, label);
label.setBackground(Color.red);
}
}
}
});
field.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
field.setText("");
listLabels();
}
});
panel.add(searchPanel, BorderLayout.NORTH);
panel.add(labelsScroll, BorderLayout.CENTER);
frame.add(panel);
frame.setSize(200, 400);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
new JavaApplication78();
}
});
}
public String getText(){
return field.getText();
}
public void listLabels(){
GridBagConstraints gbc = new GridBagConstraints();
gbc.weightx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridwidth = GridBagConstraints.REMAINDER;
labelsScroll = new JScrollPane(labelsPanel);
for (String format : names) {
label = new JLabel(format);
//icon
labelsArray.add(label);
labelsPanel.add(label, gbc);
label.setBorder(BorderFactory.createCompoundBorder(border, paddingBorder));
label.setOpaque(true);
label.setBackground(Color.white);
}
}
}
知道如何将找到的 JLabel 置于列表顶部并在清除搜索字段后将其放回原处吗?
大多数布局管理器会根据组件的添加顺序(也称为 z 顺序)对组件进行布局。
所以你可以使用类似...
field.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//Reset
for (int order = 0; order < labelsArray.size(); order++) {
JLabel label = labelsArray.get(order);
labelsPanel.setComponentZOrder(label, order);
}
String text = field.getText();
for (JLabel label : labelsArray) {
if (label.getText().equals(text)) {
labelsPanel.setComponentZOrder(label, 0);
break;
}
}
labelsPanel.revalidate();
labelsPanel.repaint();
}
});
根据字段中输入的文本重新排序标签。此示例根据标签在 labelsArray
中出现的顺序重置顺序,然后再尝试找到匹配的标签