2011-09-27 35 views
3

我已經找到了如何使用這個代碼,以保持一個JButton處於按下狀態後:如何保持一個JButton按下了它的JPanel失去焦點

JButton[] buttons; 
. 
. 
. 
public void actionPerformed(ActionEvent e) 
{ 

    for(int i = 0; i < buttons.length; i++) 
    { 
     if(e.getSource() == buttons[i]) 
     { 
      buttons[i].getModel().setPressed(true); 
     } 
     else 
     { 
      buttons[i].getModel().setPressed(false); 
     } 

    } 
} 

此代碼捕獲點擊的按鈕,保持它按下,使未按下面板上的所有其他按鈕。而且這段代碼工作得很好......直到窗口失去焦點(或者更具體地說,它的父級JPanel失去焦點)。之後,所有按鈕返回到未按下狀態。

現在,關於如何編寫WindowFocusListeners的教程已停用。有沒有辦法通過失去焦點來保持JButton的按下狀態?

+0

選擇一個答案小傢伙。將近4年你問這個 – Ungeheuer

回答

14

爲什麼不簡單地使用一系列JToggleButton並將它們添加到同一個ButtonGroup對象?所有艱苦的工作都是爲你完成的,因爲如果按下切換按鈕,它將保持按下狀態。把它看作一個看起來像JButton的JRadioButton(因爲實際上,JRadioButton 從JToggleButton下降)。

例如:

import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 

public class BunchOfButtons extends JPanel { 
    private static final String[] TEXTS = {"One", "Two", "Three", "Four", "Five"}; 
    private ButtonGroup btnGroup = new ButtonGroup(); 
    private JTextField textField = new JTextField(20); 

    public BunchOfButtons() { 
     JPanel btnPanel = new JPanel(new GridLayout(1, 0, 5, 0)); 
     BtnListener btnListener = new BtnListener(); 
     for (String text : TEXTS) { 
     JToggleButton toggleBtn = new JToggleButton(text); 
     toggleBtn.addActionListener(btnListener); 
     toggleBtn.setActionCommand(text); 
     btnPanel.add(toggleBtn); 
     btnGroup.add(toggleBtn); 
     } 

     JPanel otherPanel = new JPanel(); 
     otherPanel.add(textField); // just to take focus elsewhere 

     setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
     setLayout(new GridLayout(0, 1, 0, 15)); 
     add(btnPanel); 
     add(otherPanel); 
    } 

    private class BtnListener implements ActionListener { 
     public void actionPerformed(ActionEvent aEvt) { 
     textField.setText(aEvt.getActionCommand()); 
     } 
    } 

    private static void createAndShowGui() { 
     BunchOfButtons mainPanel = new BunchOfButtons(); 

     JFrame frame = new JFrame("BunchOfButtons"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+1

你撞到了頭上@Hovercraft Full Of Eels +1 – fireshadow52

+0

'private class' ???我從來沒有見過這樣的事情。你能否詳細說明(對我而言)? – fireshadow52

+2

這是一個私人的內部類,就是這樣。它只能在外部類中使用,就像匿名內部類一樣,但與匿名類不同,它可以多次使用。 –