Java JFrame не обновляет настройки кнопки - PullRequest
5 голосов
/ 13 февраля 2012

У меня небольшая проблема с Java Jframe и кнопка не обновляется.

Я пытаюсь отключить кнопку «Печать» до тех пор, пока печать нового JFrame, который она открывает, не завершится и JFrame не закроется ...

Кнопка будет отключена только в том случае, если появилось новое окнопроисходит, но не до тех пор, что может занять немного времени ....

Я установил кнопку для отключения, выполнив следующее: PrintBttn.setEnabled(false);

Я попытался позвонить mainPanel.revalidate(); mainPanel.repaint(); PrintBttn.revalidate(); PrintBttn.repaint, а также смесь вышеперечисленного, как они рекомендовали на других форумах ...

В данный момент я немного растерялся из-за этого и почему он не отключает кнопку, пока не появится новое окно, так какпервое, что я делаю, это отключаю его, как показано выше, а затем просматриваю и создаю новое окно ....

Спасибо, Эрик

Ответы [ 2 ]

6 голосов
/ 13 февраля 2012

Скорее всего, речь идет о выпуске EDT, чтобы позволить ему перекрашивать отключенную кнопку.

Как правило, это будет выглядеть примерно так:

PrintBttn.setEnabled(false);
SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        // Code to display the second JFrame goes here
    }
};
3 голосов
/ 13 февраля 2012

Возможно, вам не удалось также поместить свой первый кадр в EDT, посмотрите код, действительно ли вы этого хотите:

import java.awt.event.*;

import javax.swing.*;

public class TwoFrames
{
    private JFrame frame1, frame2;
    private JPanel panel1, panel2;
    private JButton button1, button2, button3;
    private ActionListener action;

    public TwoFrames()
    {               
        frame1 = new JFrame("Frame One");
        frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame2 = new JFrame("Frame Two");
        frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        panel1 = new JPanel();      

        action = new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                if (ae.getSource() == button1)
                {
                    // Here goes your code for displaying your Second Frame.
                    SwingUtilities.invokeLater(new Runnable()
                    {
                        public void run()
                        {
                            if (!frame2.isShowing())
                            {                                                           
                                panel2 = new JPanel();

                                button2 = new JButton("Click Me to HIDE FRAME.");
                                button2.setHorizontalTextPosition(AbstractButton.CENTER);
                                button2.setVerticalTextPosition(AbstractButton.CENTER);
                                button2.addActionListener(action);

                                panel2.add(button2);
                                panel2.setOpaque(true);
                                frame2.setContentPane(panel2);

                                frame2.setSize(200, 200);
                                frame2.setLocationRelativeTo(null);
                                frame2.setVisible(true);
                            }
                        }
                    });             
                    button3.setEnabled(false);
                }
                else if (ae.getSource() == button2)
                {
                    frame2.dispose();
                    button3.setEnabled(true);
                }
            }       
        };

        button1 = new JButton("Click Me to Display FRAME.");
        button1.setHorizontalTextPosition(AbstractButton.CENTER);
        button1.setVerticalTextPosition(AbstractButton.CENTER);
        button1.addActionListener(action);          

        button3 = new JButton("Watch Me getting DISABLED");
        button3.setHorizontalTextPosition(AbstractButton.CENTER);
        button3.setVerticalTextPosition(AbstractButton.CENTER);
        button3.addActionListener(action);

        panel1.add(button1);
        panel1.add(button3);
        panel1.setOpaque(true);
        frame1.setContentPane(panel1);      

        frame1.setSize(200, 200);       

        frame1.setVisible(true);
    }

    public static void main(String... args)
    {
        // Here we are Scheducling a JOB for Event Dispatcher Thread.
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()               
            {
                new TwoFrames();
            }
        });
    }
}
...