Частично в учебных целях я сделал JFrame
с 4 JPanel
, 2 JLabel
и 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);
}
На какой панели мне найти 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()
.
1-е редактирование
Вот как попасть в строку меню!
Component[] m = this.getJMenuBar().getComponents();
for(Component mm: m)
mm.setEnabled(true);
2-е редактирование
См. Ниже рекурсивное частичное решение.
Это "рекурсивный ответ" @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, но не тут-то было. Есть мысли о том, как это сделать?
gameBoard.enableEverything(gameBoard)
вместо двух вызовов (для простоты). - person maaartinus   schedule 20.04.2014gameBoard
вenableEverything
для ОДНОГО звонка довольно очевидно! Он сделал то же, что и оба других подхода, но, хотя он по-прежнему не включает текстовую область или пункты меню, это более аккуратное и гораздо лучшее решение. В соответствии с просьбой, я опубликую новый вопрос. Я никогда не знаю, когда это уместно, так как это как бы оставляет нить в подвешенном состоянии, лишь частично решая исходную проблему и не имея связи с остальными. Тем не менее, эта ветка кажется мертвой, так что сойдет. - person DSlomer64   schedule 21.04.2014