我正在尝试在我们的系统中记录一些信息,为了使其易于阅读,我需要记录特定复选框所在容器的名称。
例如,我在面板中有一个复选框,然后该面板是一个选项卡式窗格。我想记录“选项卡名称/面板边框名称/复选框名称”
这似乎很难。我有复选框,然后执行getParent()
,但我似乎没有比这更进一步。
按名称我的意思是显示在标签顶部的名称;实际上我有许多不同的容器,我需要记录他们的所有名称(不是程序员给出的实际名称,而是显示在GUI上的名称)。因此,对于JPanel
,它将是边界名称,对于其他容器,它将是其他东西。
答案 0 :(得分:2)
容器(由getParent()
返回)是一个AWT Component
,并且有getName()
方法返回组件的名义名称。但是,我认为您会发现名称字段通常是null
...除非您已经尽力设置它。
另一方面,如果您想获取容器的类名,可以通过调用parentObj.getClass().getName()
来获取它。
按名称我的意思是显示在标签顶部的名称。
嗯,我认为没有通用的方法可以做到这一点。您正在考虑的是组件的“名称”可能是各种不同的东西,具体取决于组件的内容。它甚至可能不是父对象的一部分。
某些组件类具有getText()
方法,可能适合用作名称。其他人没有什么合适的。
答案 1 :(得分:1)
使用Swing / AWT API的反射和方法来实现以下目标非常简单:
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);
}
}