可以获取父边框或标签的名称吗?

时间:2015-06-01 14:14:58

标签: java swing jpanel

我正在尝试在我们的系统中记录一些信息,为了使其易于阅读,我需要记录特定复选框所在容器的名称。

例如,我在面板中有一个复选框,然后该面板是一个选项卡式窗格。我想记录“选项卡名称/面板边框名称/复选框名称”

这似乎很难。我有复选框,然后执行getParent(),但我似乎没有比这更进一步。

更新

按名称我的意思是显示在标签顶部的名称;实际上我有许多不同的容器,我需要记录他们的所有名称(不是程序员给出的实际名称,而是显示在GUI上的名称)。因此,对于JPanel,它将是边界名称,对于其他容器,它将是其他东西。

2 个答案:

答案 0 :(得分:2)

容器(由getParent()返回)是一个AWT Component,并且有getName()方法返回组件的名义名称。但是,我认为您会发现名称字段通常是null ...除非您已经尽力设置它。

另一方面,如果您想获取容器的类名,可以通过调用parentObj.getClass().getName()来获取它。

  

按名称我的意思是显示在标签顶部的名称。

嗯,我认为没有通用的方法可以做到这一点。您正在考虑的是组件的“名称”可能是各种不同的东西,具体取决于组件的内容。它甚至可能不是父对象的一部分。

某些组件类具有getText()方法,可能适合用作名称。其他人没有什么合适的。

答案 1 :(得分:1)

使用Swing / AWT API的反射和方法来实现以下目标非常简单:

  • 复选框文字。
  • 显示复选框的面板标题边框(标题)。
  • 显示面板的标签的标题。

enter image description here

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.border.*;

public class PrettyPrintControlChange {

    private JComponent ui = null;
    static final String rightwards = new String(Character.toChars(8594));

    PrettyPrintControlChange() {
        initUI();
    }

    public final void initUI() {
        if (ui != null) {
            return;
        }

        ui = new JPanel(new BorderLayout(4, 4));
        ui.setBorder(new EmptyBorder(4, 4, 4, 4));

        JTabbedPane tabbedPane = new JTabbedPane();
        ui.add(tabbedPane);

        final JTextArea textArea = new JTextArea(5, 45);
        ui.add(new JScrollPane(textArea), BorderLayout.PAGE_END);

        ActionListener al = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JCheckBox cb = (JCheckBox) e.getSource();
                textArea.append(getPrettyCheckBoxString(cb) + "\n");
            }
        };

        for (int i = 1; i < 3; i++) { //tabs
            JPanel tabPanel = new JPanel(new GridLayout(0, 1, 4, 4));
            tabbedPane.addTab("Tab " + i, tabPanel);
            for (int j = 1; j < 4; j++) { // panels with titled border
                JPanel titledPanel = new JPanel(new GridLayout(1, 0, 4, 4));
                titledPanel.setBorder(new TitledBorder("Panel " + j));
                tabPanel.add(titledPanel);
                for (int k = 1; k < 7; k++) { // check boxes
                    JCheckBox checkBox = new JCheckBox("Check Box " + k);
                    checkBox.addActionListener(al);
                    titledPanel.add(checkBox);
                }
            }
        }
    }

    /**
     * Provides a string representing the state and containment hierarchy of a
     * check box. Uses the text of the check box, titled borders and tabbed pane
     * tab in which the check box appears to identify it.
     */
    private static String getPrettyCheckBoxString(JCheckBox cb) {
        StringBuilder sb = new StringBuilder("Check Box: ");
        ArrayList<Container> containerHeirarchy = new ArrayList<Container>();
        containerHeirarchy.add(cb);

        Container parent = cb.getParent();
        boolean foundTabbedPane = false;
        while (parent != null && !foundTabbedPane) {
            if (parent instanceof JTabbedPane) {
                foundTabbedPane = true;
            }
            containerHeirarchy.add(parent);
            parent = parent.getParent();
        }
        // traverse the collection in revers order.
        for (int i = containerHeirarchy.size() - 1; i >= 0; i--) {
            Container c = containerHeirarchy.get(i);
            if (c instanceof JTabbedPane) {
                JTabbedPane tp = (JTabbedPane) c;
                String title = tp.getTitleAt(tp.getSelectedIndex());
                sb.append(" tab: " + title);
            } else if (c instanceof JPanel) {
                JPanel panel = (JPanel) c;
                Border border = panel.getBorder();
                if (border instanceof TitledBorder) {
                    TitledBorder titledBorder = (TitledBorder) border;
                    String title = titledBorder.getTitle();
                    sb.append(" " + rightwards + " panel: " + title);
                }
            } else if (c instanceof JCheckBox) {
                JCheckBox checkBox = (JCheckBox)c;
                String title = checkBox.getText();
                sb.append(" " + rightwards + " check box: " + title);
            }
        }

        return sb.toString();
    }

    private static void prettyPrintCheckBox(JCheckBox cb) {
        System.out.println(getPrettyCheckBoxString(cb));
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {
                }
                PrettyPrintControlChange o = new PrettyPrintControlChange();

                JFrame f = new JFrame(o.getClass().getSimpleName());
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);

                f.setContentPane(o.getUI());
                f.pack();
                f.setMinimumSize(f.getSize());

                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}