java - 如何访问顶部 JFrame 下面的所有组件

标签 java swing disabled-control

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

然后我编写了两个方法来尝试启用所有功能。部分工作。代码如下:

  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 内)即使使用上面的最后两行也没有启用。为什么?

我也尝试过:

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

如何启用文本区域?

还有JMenuBar也没有启用。但我真的不知道在哪里可以找到它。我读到它在 JLayeredPane 中,但是......我尝试的方法不起作用:

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

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

当然,这有效:

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

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

第一次编辑

以下是如何进入菜单栏!

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

第二次编辑

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

这是对@maaartinus 的“递归响应”(尽管我只是这一秒才读到他关于堆栈的注释)。这不是我的问题的答案,但它是进步。

  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");
    }

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

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

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

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

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

 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,但没有这样的运气。 关于如何做到这一点有什么想法吗?

最佳答案

我想你需要递归整个树,比如

  • 从根开始
  • 迭代所有组件
  • 启用它们中的每一个
  • 测试它是否是 Container 的实例
  • 如果是,则进行递归调用

对于 ScrollPane,您可能需要一个额外的 instanceof 测试,然后是 getViewPort 或类似的东西。

关于java - 如何访问顶部 JFrame 下面的所有组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23177407/

相关文章:

angularjs - 在 AngularJS 中服务器处理时禁用按钮

html - 单击不是提交按钮后如何禁用html按钮

java - android浏览器javascript问题

java - 更改时如何为 jtextfield 添加监听器?

java - 只要应用程序打开,AlarmManager 就会关闭

java - 使用 Java 创建自定义 UI 元素

java - 半透明 JLabel 未正确显示背景

java - 如何在Java swing中从另一个类禁用一个类中的多个JButton?

java - 无法让按钮与其他代码同时工作

java - 在 WildFly 中转储泄漏连接