如何访问顶部JFrame下的所有组件 [英] How to access all components beneath top JFrame

查看:117
本文介绍了如何访问顶部JFrame下的所有组件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

部分出于学习目的,我制作了一个 JFrame ,其中4 JPanel s,2 JLabel s,以及 JMenuBar 。我将各种组件(按钮,文本框,文本区域)放入4个JPanel中。我在整个过程中禁用了所有组件。

Partly for learning purposes, I made a JFrame with 4 JPanels, 2 JLabels, and a JMenuBar. I put various components (buttons, textboxes, textarea) into the 4 JPanels. I disabled every one of the components throughout.

然后我写了两个方法来尝试启用所有内容。部分工作。这是代码:

I then wrote two methods to try to enable everything. Worked partially. Here's the code:

  public void enableEverything(){
    Component [] p = this.getContentPane().getComponents();
    for(Component pp : p)
      if(pp instanceof JPanel)
        enableAll((JPanel) pp);
  }

  public void enableAll(JPanel p){
    Component [] c = p.getComponents();
    for(Component cc: c)
      cc.setEnabled(true);
    jTextArea1.setEnabled(true);
    jScrollPane1.setEnabled(true);
  }

JTextArea (在 JScrollPane 中,即使使用上面的最后两行也没有启用。为什么?

The JTextArea (inside a JScrollPane) didn't get enabled even with the last two lines above. Why?

我也试过:

Component [] s = jScrollPane1.getComponents();
for(Component ss: s)
  ss.enableInputMethods(true);

如何启用textarea?

并且 JMenuBar 也没有启用。但我真的不知道在哪里找到它。我读到它在JLayeredPane中,但是...我尝试过它没有用:

And the JMenuBar didn't get enabled either. But I really don't know where to find it. I read that it's in the JLayeredPane, but ... what I tried with it didn't work:

for(int i = 0; i < 2; i++){
  System.out.println(i);
  this.getLayeredPane().getComponent(i).setEnabled(true);
}

在哪个窗格中我找到 JMenuBar 以及如何启用 JMenu s?(甚至 JMenuItem s。)

In which pane do I find the JMenuBar and how would I enable the JMenus? (And even the JMenuItems.)

当然,这有效:

menFileAndEdit.setEnabled(true);
mnuFile.setEnabled(true);
mnuEdit.setEnabled(true);
mniFileSave.setEnabled(true);
mniEditUndo.setEnabled(true);
mniEditRedo.setEnabled(true);

请记住,我只是在尝试,尝试了解所有内容以及如何访问它通过使用诸如 getComponents()之类的东西从顶部 JFrame 向下钻取来编程。

Keep in mind that I'm just experimenting, trying to learn where everything is and how to access it programmatically by drilling down from the top JFrame using something like getComponents().

以下是如何进入菜单栏!

Here's how to get at the menu bar!

Component[] m = this.getJMenuBar().getComponents();
    for(Component mm: m)
      mm.setEnabled(true);



第二次编辑



参见下面的递归部分解决方案。

2nd Edit

See below for recursive partial solution.

这是对@maaartinus的递归响应(尽管我只是在第二次阅读他关于堆栈的说明)。对我的问题不是答案,但它是进步。

This is a "recursive response" to @maaartinus (though I only just this second read his note about a stack). It's not an answer to my problem, but it's progress.

  public void enableEverything(Container c){
    Component [] p = c.getComponents();
    System.out.println("Component count " + c.getComponentCount() + " for " +   
                                            c.toString().substring(0,40)  );
    for(Component pp : p){
        pp.setEnabled(true);
        if(pp instanceof Container){
          System.out.println("Recursive call for " + pp.toString().substring(0,40));
          enableEverything((Container) pp);
        }
        else System.out.println("No recursive call");
    }

我必须调用它两次以启用几乎所有功能:

I had to call it twice to get almost everything enabled:

  gameBoard.enableEverything(gameBoard.getContentPane());
  gameBoard.enableEverything(gameBoard.getJMenuBar());

它取消了一种方法,因为它是递归的,它产生了相同的结果,因为它也做了 NOT 启用 JMenuItem s或 JTextArea

It did away with one method since it's recursive, and it produced same results in that it also did NOT enable the JMenuItems or the JTextArea.

所以我仍然在寻找如何做到这一点。

它产生了有趣的输出,因为每个组件似乎都是是一个容器的实例,这似乎不对:

It produced interesting output in that every component seems to be an instance of Container, which doesn't seem right:

 gameBoard.enableEverything(gameBoard.getContentPane())
Component count 6 for javax.swing.JPanel[null.contentPane,0,23
Recursive call for    javax.swing.JPanel[pnlGameGrid,12,139,59
Component count 1 for javax.swing.JPanel[pnlGameGrid,12,139,59
Recursive call for    javax.swing.JTextField[jTextField1,233,1
Component count 0 for javax.swing.JTextField[jTextField1,233,1
Recursive call for    javax.swing.JPanel[pnlAvailableLetters,1
Component count 1 for javax.swing.JPanel[pnlAvailableLetters,1
Recursive call for    javax.swing.JToggleButton[jToggleButton1
Component count 0 for javax.swing.JToggleButton[jToggleButton1
Recursive call for    javax.swing.JLabel[lblAvailableLetters,1
Component count 0 for javax.swing.JLabel[lblAvailableLetters,1
Recursive call for    javax.swing.JPanel[pnlScore,476,25,107x9
Component count 2 for javax.swing.JPanel[pnlScore,476,25,107x9
Recursive call for    javax.swing.JTextField[txtScore,21,14,66
Component count 0 for javax.swing.JTextField[txtScore,21,14,66
Recursive call for    javax.swing.JButton[btnScore,21,61,66x24
Component count 0 for javax.swing.JButton[btnScore,21,61,66x24
Recursive call for    javax.swing.JPanel[pnlPlays,624,51,271x5
Component count 3 for javax.swing.JPanel[pnlPlays,624,51,271x5
Recursive call for    javax.swing.JScrollPane[jScrollPane1,13,
Component count 3 for javax.swing.JScrollPane[jScrollPane1,13,
Recursive call for    javax.swing.JViewport[,1,1,220x80,layout
Component count 1 for javax.swing.JViewport[,1,1,220x80,layout
Recursive call for    javax.swing.JTextArea[jTextArea1,0,0,220
Component count 0 for javax.swing.JTextArea[jTextArea1,0,0,220
Recursive call for    javax.swing.JScrollPane$ScrollBar[,0,0,0
Component count 2 for javax.swing.JScrollPane$ScrollBar[,0,0,0
Recursive call for    javax.swing.plaf.metal.MetalScrollButton
Component count 0 for javax.swing.plaf.metal.MetalScrollButton
Recursive call for    javax.swing.plaf.metal.MetalScrollButton
Component count 0 for javax.swing.plaf.metal.MetalScrollButton
Recursive call for    javax.swing.JScrollPane$ScrollBar[,0,0,0
Component count 2 for javax.swing.JScrollPane$ScrollBar[,0,0,0
Recursive call for    javax.swing.plaf.metal.MetalScrollButton
Component count 0 for javax.swing.plaf.metal.MetalScrollButton
Recursive call for    javax.swing.plaf.metal.MetalScrollButton
Component count 0 for javax.swing.plaf.metal.MetalScrollButton
Recursive call for    javax.swing.JButton[jButton1,61,262,81x2
Component count 0 for javax.swing.JButton[jButton1,61,262,81x2
Recursive call for    javax.swing.JCheckBox[jCheckBox1,49,207,
Component count 0 for javax.swing.JCheckBox[jCheckBox1,49,207,
Recursive call for    javax.swing.JLabel[lblPlays,624,29,100x1
Component count 0 for javax.swing.JLabel[lblPlays,624,29,100x1


gameBoard.enableEverything(gameBoard.getJMenuBar())
Component count 2 for javax.swing.JMenuBar[menFileAndEdit,0,0,
Recursive call for    javax.swing.JMenu[mnuFile,0,0,31x21,alig
Component count 0 for javax.swing.JMenu[mnuFile,0,0,31x21,alig
Recursive call for    javax.swing.JMenu[mnuEdit,31,0,33x21,ali
Component count 0 for javax.swing.JMenu[mnuEdit,31,0,33x21,ali

我希望递归得到 JMenuItem s,但没有这样的运气。 有关如何操作的任何想法?

I was hoping recursion would get at the JMenuItems, but no such luck. Any thoughts on how to do so?

推荐答案

六个月后,我有一个像样的,不是 - 在菜单选项操作的上下文中,将所有工具提示设置为

Six months later, I have a decent, not-altogether-inelegant way to access everything that I needed to below main JFrame, in the context of a menu option action that sets all tool tips to "":

private void tipsOff(Container container)
{
  Component [] c = container.getComponents();
  Component s;
  for (Component cc : c) {
    ((JComponent)cc).setToolTipText("");
    if(cc instanceof JPanel)      tipsOff((Container) cc);
    if(cc instanceof JScrollPane) tipsOff(((JScrollPane)cc).getViewport());
  }
}  

private void mniPrefTooltipsActionPerformed(java.awt.event.ActionEvent evt)
{                                                
  tipsOff(gui.getContentPane());
  tipsOff(gui.mbrMenuBar);
}     

注意递归调用 tipsOff

另请注意有关使用 ToolTipManager 的评论和答案(在这个主题,它在我的原始问题的上下文中工作,以减少所有代码这里指出的是,可以应用任何其他操作而不是工具提示 - 例如,设置不可见或禁用......等等。

Also note comments and Answer about using ToolTipManager (in this thread, which works in the context of my original question to reduce all the code to one line. Point here is that any other operation could be applied instead of ""-ing tool tips--e.g., setting invisible or disabling... etc.

感谢 maaartinus tipsOff 中的 JScrollPane 行。

这篇关于如何访问顶部JFrame下的所有组件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆