Как отключить кнопку графического интерфейса в Java - PullRequest
4 голосов
/ 26 июля 2011

так что у меня есть небольшой кусочек кода для моего GUI:

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.BoxLayout;
import javax.swing.JSeparator;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;


public class IPGUI extends JFrame implements ActionListener 
{
    private static JPanel contentPane;
    private static boolean btn1Clicked = false;
    private static boolean btn2Clicked = false;
    private static boolean btn3Clicked = false;
    private static boolean btn4Clicked = false;

    //Create the frame
    public IPGUI() 
    {
        //Sets frame properties
        setTitle("IP Extractor");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 250, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        //Creates new JPanel with boxlayout
        JPanel panel = new JPanel();
        contentPane.add(panel, BorderLayout.CENTER);
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

        //////////////////New Button//////////////////

        JButton btnConvertDocuments = new JButton("1. Convert Documents");
        btnConvertDocuments.setAlignmentX(Component.CENTER_ALIGNMENT);
        btnConvertDocuments.setMaximumSize(new Dimension(160, 0));
        btnConvertDocuments.setPreferredSize(new Dimension(0, 50));

        panel.add(btnConvertDocuments);

        btnConvertDocuments.setActionCommand("w");
        btnConvertDocuments.addActionListener((ActionListener) this);

        if (btn1Clicked == true)
        {
            btnConvertDocuments.setEnabled(false);
        }

        JSeparator separator_3 = new JSeparator();
        panel.add(separator_3);

        //////////////////New Button//////////////////

        JButton btnExtractImages = new JButton("2. Extract Images");
        btnExtractImages.setAlignmentX(Component.CENTER_ALIGNMENT);
        btnExtractImages.setMaximumSize(new Dimension(160, 0));
        btnExtractImages.setPreferredSize(new Dimension(0, 50));

        panel.add(btnExtractImages);

        btnExtractImages.setActionCommand("x");
        btnExtractImages.addActionListener((ActionListener) this);

         if (btn2Clicked == true)
         {
             btnExtractImages.setEnabled(false);
         }

        JSeparator separator_2 = new JSeparator();
        panel.add(separator_2);

        //////////////////New Button//////////////////

        JButton btnParseRIDValues = new JButton("3. Parse rId Values");
        btnParseRIDValues.setAlignmentX(Component.CENTER_ALIGNMENT);
        btnParseRIDValues.setMaximumSize(new Dimension(160, 0));
        btnParseRIDValues.setPreferredSize(new Dimension(0, 50));

        panel.add(btnParseRIDValues);

        btnParseRIDValues.setActionCommand("y");
        btnParseRIDValues.addActionListener((ActionListener) this);

        if (btn3Clicked == true)
        {
            btnParseRIDValues.setEnabled(false);
        }

        JSeparator separator_1 = new JSeparator();
        panel.add(separator_1);

        //////////////////New Button//////////////////

        JButton btnParseImageInfo = new JButton("4. Parse Image Info.");
        btnParseImageInfo.setAlignmentX(Component.CENTER_ALIGNMENT);
        btnParseImageInfo.setMaximumSize(new Dimension(160, 0));
        btnParseImageInfo.setPreferredSize(new Dimension(0, 50));

        panel.add(btnParseImageInfo);

        btnParseImageInfo.setActionCommand("z");
        btnParseImageInfo.addActionListener((ActionListener) this);

        if (btn4Clicked == true)
        {
            btnParseImageInfo.setEnabled(false);
        }
    }

    public void actionPerformed(ActionEvent event) 
    {
        String command = event.getActionCommand();

        if (command.equals("w"))
        {
            FileConverter fc = new FileConverter();
            btn1Clicked = true;
        }
        else if (command.equals("x"))
        {
            ImageExtractor ie = new ImageExtractor();
            btn2Clicked = true;
        }
        else if (command.equals("y")) 
        {
            XMLIDParser xip = new XMLIDParser();
            btn3Clicked = true;
        }
        else if (command.equals("z")) 
        {
            XMLTagParser xtp = new XMLTagParser();
            btn4Clicked = true;
        }
    }    
}

Часть, на которую я хочу обратить особое внимание, состоит в следующем:

 if (btn1Clicked == true)
        {
            btnConvertDocuments.setEnabled(false);
        }

Таким образом, я считаю, что эта команда должна делать следующее: после нажатия кнопки и вызова метода выполненного действия btnClicked должен быть установлен в значение true, поэтому эта кнопка должна быть отключена.

Может кто-нибудь объяснить, где я ошибаюсь, или у меня есть правильная идея здесь? Заранее благодарю за любой вклад!

Ответы [ 8 ]

10 голосов
/ 26 июля 2011

Вы должны поместить оператор btnConvertDocuments.setEnabled(false); в метод actionPerformed(ActionEvent event). Приведенное выше условие получает вызов только один раз в конструкторе, когда создается экземпляр объекта IPGUI.

if (command.equals("w")) {
    FileConverter fc = new FileConverter();
    btn1Clicked = true;
    btnConvertDocuments.setEnabled(false);
}
4 голосов
/ 27 июля 2011

действительно, что невозможно отключить JComponent(s), если вывод в GUI вызывается из Listener, во всех случаях все события находятся внутри EDT, включая setEnabled/setVisible,

JComponent(s) отключено / отображается, если все события в EDT заканчиваются,

есть способы

1 / самым безопасным способом будет поиск GlassPane , который предотвращает все-таки MouseEvents (не KeyEvents) лучший код вокруг camickr

2 / использовать многопоточность с SwingWorker для отдельных и отложенных конкретных событий, Action from JComponent -> disable JComponent(s) in GUI -> then required Action, но там (если возможно добавить) вы должны идентифицировать все действия, используя myAction#putProperty("String","String")

3 / положить Enabled/Visible на invokeLater() и все действия от слушателя должны быть заключены в invokeAndWait()

4 / внутри Runnable()#Thread

3 голосов
/ 26 июля 2011

Вместо того, чтобы использовать логические значения, почему бы просто не установить кнопку в false при нажатии, так что вы делаете это в своем методе actionPerformed. Это более эффективно ..

if (command.equals("w"))
{
    FileConverter fc = new FileConverter();
    btnConvertDocuments.setEnabled(false);
}
2 голосов
/ 27 июля 2011
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.BoxLayout;
import javax.swing.JSeparator;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;


public class IPGUI extends JFrame implements ActionListener 
{
    private static JPanel contentPane;

    private JButton btnConvertDocuments;
    private JButton btnExtractImages;
    private JButton btnParseRIDValues;
    private JButton btnParseImageInfo;

    //Create the frame
    public IPGUI() 
    {
        //Sets frame properties
        setTitle("IP Extractor");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 250, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        //Creates new JPanel with boxlayout
        JPanel panel = new JPanel();
        contentPane.add(panel, BorderLayout.CENTER);
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

        //////////////////New Button//////////////////

        JButton btnConvertDocuments = new JButton("1. Convert Documents");
        btnConvertDocuments.setAlignmentX(Component.CENTER_ALIGNMENT);
        btnConvertDocuments.setMaximumSize(new Dimension(160, 0));
        btnConvertDocuments.setPreferredSize(new Dimension(0, 50));

        panel.add(btnConvertDocuments);

        btnConvertDocuments.setActionCommand("w");
        btnConvertDocuments.addActionListener((ActionListener) this);

        JSeparator separator_3 = new JSeparator();
        panel.add(separator_3);

        //////////////////New Button//////////////////

        btnExtractImages = new JButton("2. Extract Images");
        btnExtractImages.setAlignmentX(Component.CENTER_ALIGNMENT);
        btnExtractImages.setMaximumSize(new Dimension(160, 0));
        btnExtractImages.setPreferredSize(new Dimension(0, 50));

        panel.add(btnExtractImages);

        btnExtractImages.setActionCommand("x");
        btnExtractImages.addActionListener((ActionListener) this);

        JSeparator separator_2 = new JSeparator();
        panel.add(separator_2);

        //////////////////New Button//////////////////

        JButton btnParseRIDValues = new JButton("3. Parse rId Values");
        btnParseRIDValues.setAlignmentX(Component.CENTER_ALIGNMENT);
        btnParseRIDValues.setMaximumSize(new Dimension(160, 0));
        btnParseRIDValues.setPreferredSize(new Dimension(0, 50));

        panel.add(btnParseRIDValues);

        btnParseRIDValues.setActionCommand("y");
        btnParseRIDValues.addActionListener((ActionListener) this);

        JSeparator separator_1 = new JSeparator();
        panel.add(separator_1);

        //////////////////New Button//////////////////

        JButton btnParseImageInfo = new JButton("4. Parse Image Info.");
        btnParseImageInfo.setAlignmentX(Component.CENTER_ALIGNMENT);
        btnParseImageInfo.setMaximumSize(new Dimension(160, 0));
        btnParseImageInfo.setPreferredSize(new Dimension(0, 50));

        panel.add(btnParseImageInfo);

        btnParseImageInfo.setActionCommand("z");
        btnParseImageInfo.addActionListener((ActionListener) this);
    }

    public void actionPerformed(ActionEvent event) 
    {
        String command = event.getActionCommand();

        if (command.equals("w"))
        {
            FileConverter fc = new FileConverter();
            btnConvertDocuments.setEnabled(false);
        }
        else if (command.equals("x"))
        {
            ImageExtractor ie = new ImageExtractor();
            btnExtractImages.setEnabled(false);
        }
        else if (command.equals("y")) 
        {
            XMLIDParser xip = new XMLIDParser();
            btnParseRIDValues.setEnabled(false);
        }
        else if (command.equals("z")) 
        {
            XMLTagParser xtp = new XMLTagParser();
            btnParseImageInfo.setEnabled(false);        
        }
    }


}

Вот решение, которое я нашел благодаря помощи каждого. Еще раз спасибо всем за ваш вклад, очень ценю это!

2 голосов
/ 27 июля 2011

Есть ли причина, по которой вы не делаете что-то вроде:

public class IPGUI extends JFrame implements ActionListener 
{
    private static JPanel contentPane;

    private JButton btnConvertDocuments;
    private JButton btnExtractImages;
    private JButton btnParseRIDValues;
    private JButton btnParseImageInfo;

    public IPGUI() 
    {
        ...

        btnConvertDocuments = new JButton("1. Convert Documents");

        ...

        btnExtractImages = new JButton("2. Extract Images");

        ...

        //etc.
    }

    public void actionPerformed(ActionEvent event) 
    {
        String command = event.getActionCommand();

        if (command.equals("w"))
        {
            FileConverter fc = new FileConverter();
            btnConvertDocuments.setEnabled( false );
        }
        else if (command.equals("x"))
        {
            ImageExtractor ie = new ImageExtractor();
            btnExtractImages.setEnabled( false );
        }

        // etc.
    }    
}

Оператор if с вашим кодом отключения не будет вызван, если вы не продолжите вызывать конструктор IPGUI.

2 голосов
/ 26 июля 2011

Вы создаете фрейм с помощью кнопки enable, делаете некоторый тест, чтобы увидеть, является ли btn1Cliked истинным, и все.

Тогда у вас есть метод actionPerformed, который ничего не делает с вашей кнопкой.Таким образом, если у вас нет каких-либо действий, ваш статус кнопки больше не будет оцениваться.

2 голосов
/ 26 июля 2011

Как только вы создали фрейм, часть кода с вашим условным условием не будет введена. Иными словами, во время выполнения теста if (btn1Clicked == true) кнопка не только не была нажата, но даже не отображалась пользователю.

Потеряйте логические значения и переместите строку с btnConvertDocuments.setEnabled(false) в свой actionListener. Сделайте кнопки экземплярами переменных, не делайте их статическими переменными. (В качестве альтернативы вы можете сохранить кнопки в качестве локальных переменных и назначить каждой из них свой собственный анонимный внутренний слушатель класса.)

0 голосов
/ 24 апреля 2017

Вместо того, чтобы использовать логические значения, почему бы просто не установить кнопку в false при нажатии, так что вы делаете это в своем методе actionPerformed.Это более эффективно ..

if (command.equals("w"))
{
    FileConverter fc = new FileConverter();
    btnConvertDocuments.setEnabled(false);
}
...