[英]How to disable a JButton on certain clause?
我正在做一個小項目,其中我有一個帶有 5 個JFrame
的JButtons
。 3 JButtons
是主要關注點,默認啟用。
我想要的是直到並且除非按下這 3 個JButtons
中的任何一個,否則 2 個中的 rest 應該保持禁用狀態。
我嘗試使用ActionListner
和MouseListener
但無濟於事。
檢查我嘗試過的多個代碼。
public void mousePressed (MouseEvent me){
if (me.getButton() == MouseEvent.NOBUTTON ){
proceedBtn.setEnabled(false);
proceedBtn.setToolTipText("Please Enter A Button Before Proceeding");
}
else {
proceedBtn.setEnabled(true);
}
}
這是我嘗試過的另一段代碼。
public void mousePressed (MouseEvent me){
if (me.getClickCount == 0 ){
proceedBtn.setEnabled(false);
proceedBtn.setToolTipText("Please click a button Before Proceeding");
}
else {
proceedBtn.setEnabled(true);
}
}
我在這里做錯了什么? 我什至為相同的代碼嘗試了mouseClicked
方法,但什么也沒發生。
您需要了解ActionListener class。 正如@harper89建議的那樣,甚至還有一個關於如何編寫動作監聽器的教程。 我還建議您將JButton
子類化,因為這似乎比查詢ActionEvent
的源更合適。
這是一個例子 -
public final class JButtonDemo {
private static DisabledJButton disabledBtnOne;
private static DisabledJButton disabledBtnTwo;
public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
createAndShowGUI();
}
});
}
private static void createAndShowGUI(){
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
final JPanel disabledBtnPanel = new JPanel();
disabledBtnOne = new DisabledJButton();
disabledBtnTwo = new DisabledJButton();
disabledBtnPanel.add(disabledBtnOne);
disabledBtnPanel.add(disabledBtnTwo);
panel.add(disabledBtnPanel);
final JPanel enablerBtnPanel = new JPanel();
enablerBtnPanel.add(new EnablerJButton("Button 1"));
enablerBtnPanel.add(new EnablerJButton("Button 2"));
enablerBtnPanel.add(new EnablerJButton("Button 3"));
panel.add(enablerBtnPanel);
frame.add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private static final class DisabledJButton extends JButton{
public DisabledJButton(){
super("Disabled");
setEnabled(false);
}
}
private static final class EnablerJButton extends JButton{
public EnablerJButton(final String s){
super(s);
addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
if(!disabledBtnOne.isEnabled()){
disabledBtnOne.setEnabled(true);
disabledBtnOne.setText("Enabled");
}
if(!disabledBtnTwo.isEnabled()){
disabledBtnTwo.setEnabled(true);
disabledBtnTwo.setText("Enabled");
}
}
});
}
}
}
如果您按下三個啟用按鈕中的任何一個,則兩個禁用的按鈕都將根據您的要求啟用。
我想知道如果使用切換類型的按鈕(例如 JToggleButton 或其子項之一(JRadioButton 或 JCheckBox))編寫代碼會更好。 這樣,用戶可以查看下部按鈕是否被選中或“激活”。 這也將允許您控制用戶是否可以檢查三個底部按鈕中的一個或多個,或者只檢查一個底部按鈕(通過使用 ButtonGroup 對象)。 例如,並為部分竊取他的代碼向 mre 道歉(他的回答為 1+):
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JButtonDemo2 {
private static final String[] TOGGLE_NAMES = { "Monday", "Tuesday",
"Wednesday" };
private JPanel mainPanel = new JPanel();
private JButton leftButton = new JButton("Left");
private JButton rightButton = new JButton("Right");
private JToggleButton[] toggleBtns = new JToggleButton[TOGGLE_NAMES.length];
public JButtonDemo2() {
JPanel topPanel = new JPanel();
topPanel.add(leftButton);
topPanel.add(rightButton);
leftButton.setEnabled(false);
rightButton.setEnabled(false);
CheckListener checkListener = new CheckListener();
JPanel bottomPanel = new JPanel(new GridLayout(1, 0, 5, 0));
for (int i = 0; i < toggleBtns.length; i++) {
// uncomment one of the lines below to see the program
// with check boxes vs. radio buttons, vs toggle buttons
toggleBtns[i] = new JCheckBox(TOGGLE_NAMES[i]);
// toggleBtns[i] = new JRadioButton(TOGGLE_NAMES[i]);
// toggleBtns[i] = new JToggleButton(TOGGLE_NAMES[i]);
toggleBtns[i].setActionCommand(TOGGLE_NAMES[i]);
toggleBtns[i].addActionListener(checkListener);
bottomPanel.add(toggleBtns[i]);
}
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS));
mainPanel.add(topPanel);
mainPanel.add(bottomPanel);
}
public JComponent getMainComponent() {
return mainPanel;
}
public void enableTopButtons(boolean enable) {
leftButton.setEnabled(enable);
rightButton.setEnabled(enable);
}
private class CheckListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
for (JToggleButton checkBox : toggleBtns) {
if (checkBox.isSelected()) {
enableTopButtons(true);
return;
}
}
enableTopButtons(false);
}
}
private static void createAndShowGui() {
JFrame frame = new JFrame("JButtonDemo2");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new JButtonDemo2().getMainComponent());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
如果您想使用 JToggleButtons 查看此代碼,請注釋掉創建 JCheckBoxes 的行並取消注釋創建 JToggleButtons 的行:
// toggleBtns[i] = new JCheckBox(TOGGLE_NAMES[i]);
// toggleBtns[i] = new JRadioButton(TOGGLE_NAMES[i]);
toggleBtns[i] = new JToggleButton(TOGGLE_NAMES[i]);
同樣,如果您想查看帶有 JRadioButtons 的程序,只需取消注釋 JRadioButton 行並注釋其他兩個。
我相信您可以查看按鈕的actionListeners
。
然后,當單擊前三個按鈕之一時,您可以對.setenabled = true
執行簡單的if
語句。
我以前做過,但不太願意說明如何做。 生病包括一些應該工作的代碼和一個可能比我解釋得更好的教程。
例子:
JButtonOne.addActionListener(new ButtonHandler();)
private class ButtonHandler implements ActionListener{
public void actionPerformed(ActionEvent event) {
//write your if statement or call a method etc here
}
}
嘗試將鼠標監聽器放在正常活動的按鈕上。 這樣,當它們激活時,它們可以啟用通常不活動的按鈕。 此外,將通常不活動的按鈕設置為在應用程序首次啟動時禁用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.