重新排序标签

问题描述 投票:1回答:2

我正在从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();
            }
        });
    }
}
java swing jlabel
2个回答
0
投票

在纠正错误之前,有几件事需要修复:

  1. 此行有2个错误:public class Test extends JPanel {

    • 课程名称,您知道有多少人称他们的课程为Test吗?很多!使其更具描述性,例如SwapLabelsTest
    • [extends JPanel,您无需更改JPanel的行为,因此在这种情况下无需扩展它,只需创建JPanel的新实例。
  2. 不要将所有内容都放在构造函数中,最好使用initialize()方法或类似的方法(在下面的代码中为createAndShowGUI())来处理GUI构造。这似乎是最简单的方法,但是当项目变大时,将这一部分分离会更方便。

  3. 将变量移到更大的范围,以便于处理,除非这些变量在方法中是局部的,否则将提高性能和可读性。

  4. [包含检测事件的组件,例如JButton,以便在触发该事件(单击按钮)时执行交换操作。

  5. << [然后只需更改后更新用户界面即可。
  6. 您可能会问,但是我该怎么做?像这样:

    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 enter image description here    

0
投票
我交换了数组条目
交换数组中的条目不起作用。数组与面板无关。

因此您需要调整面板上的组件。

我想将标签之一移动到面板的开始(最左侧)。

嗯,这是与“交换”不同的要求。这也更容易。

您可以将组件添加到面板中并指定其在面板中的位置,因此将组件添加到开头很容易,因为其位置始终为零。

因此,将第三个组件移到开头,代码将类似于:

enter image description here

如果您确实想要交换,则代码将相似。您将在两个位置都得到该组件,然后先将一个组件添加回较低的位置,然后将另一个组件添加回较高的位置。

© www.soinside.com 2019 - 2024. All rights reserved.