切换Jlabel和JPanel的可见性

时间:2019-10-22 20:33:54

标签: java swing user-interface

我正在尝试切换JLable和JPanel的可见性。两者在初始情况下均处于可见状态。按下按钮后,它们应该在两秒钟内不可见。在这段时间之后,它们将再次可见。此外,JPanel上有两个复选框,它们按ButtonGroup分组。按下按钮后,应清除选择。

为了解决这个问题,我编写了以下代码:

package Aufgaben;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.border.EmptyBorder;

public class Aufgabe1 extends JFrame {

    private JPanel contentPane;
    private JPanel checkPanel;
    private JPanel pointPanel;

    private JRadioButton rdbtnJa;
    private JRadioButton rdbtnNein;
    private ButtonGroup btnGroup; 

    private JButton btnStart;
    private JLabel lblX;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Aufgabe1 frame = new Aufgabe1();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Aufgabe1() {setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 700, 300);
        contentPane = new JPanel();
        setContentPane(contentPane);
        contentPane.setLayout(null);

        btnStart = new JButton("Start");
        btnStart.setBounds(0, 0, 684, 23);
        contentPane.add(btnStart);

            checkPanel = new JPanel();
            checkPanel.setBounds(0, 229, 684, 33);
            contentPane.add(checkPanel);

            btnGroup = new ButtonGroup();

            rdbtnJa = new JRadioButton("Ja");
            checkPanel.add(rdbtnJa);
            btnGroup.add(rdbtnJa);

            rdbtnNein = new JRadioButton("Nein");
            checkPanel.add(rdbtnNein);
            btnGroup.add(rdbtnNein);

        pointPanel = new JPanel(new BorderLayout());
        pointPanel.setBackground(Color.BLACK);
        pointPanel.setBounds(0, 23, 684, 209);
        contentPane.add(pointPanel);

        lblX = new JLabel("X");
        lblX.setForeground(Color.WHITE);
        lblX.setVerticalAlignment(JLabel.CENTER);
        lblX.setHorizontalAlignment(JLabel.CENTER);
        pointPanel.add(lblX, BorderLayout.CENTER);

        run();
    }
    public void run() {
        System.out.println("----------");
        System.out.println("Method run()");
        btnStart.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println("btn actionPerformed()");
                createLightPoint();
            }
        });
    }

    private void createLightPoint() {
        System.out.println("----------");
        System.out.println("Method createLightPoint()");
        btnGroup.clearSelection();
        lblX.setVisible(false);
//        lblX.repaint();
//        pointPanel.repaint();
        checkPanel.setVisible(false);
//        checkPanel.repaint();

        System.out.println("Bevor Sleep");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("After Sleep");

        lblX.setVisible(true);
//        lblX.repaint();
        checkPanel.setVisible(true);
//        checkPanel.repaint();
    }

}

如您所见,我试图通过功能.setVisibility().repaint()解决问题(如上所述)。我尝试了.show().hide函数,尽管它们也不推荐使用。但是无论如何,它都不起作用。

我已经阅读了以下帖子:

Show/Hide JLabel with button?

https://softwareengineering.stackexchange.com/questions/233068/is-better-show-hide-or-setvisiblebool-visible

但是它们都不能帮助解决我的问题。

希望您能帮助我。

1 个答案:

答案 0 :(得分:0)

不要在事件分配线程 上使用sleep()-它会阻止线程处理绘画和其他与UI相关的事件,并且UI会冻结。有关更多详细信息,请参见The Event Dispatch Thread教程。

您可以改用Swing计时器,有关示例,请参见How to Use Swing Timers教程。