java - 切换 Jlabel 和 JPanel 的可见性

标签 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

但是他们都无法帮助解决我的问题。

希望你能帮助我。

最佳答案

不要在事件调度线程上使用 sleep() - 它将阻止线程处理绘画和其他 UI 相关事件,并且 UI 将被卡住。请参阅The Event Dispatch Thread教程以了解更多详细信息。

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

关于java - 切换 Jlabel 和 JPanel 的可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58511913/

相关文章:

java - 正则表达式中的问号 : difference between 'Pattern.compile("\"title\":\"(.*?)\"") ;' and ' Pattern. 编译 ("\"标题\":\".*\"");'

java - 从带有线程的方法返回

Java swing 绘图图形空指针?

java - 是否可以使用字符串作为计算?

Ruby:Linux ubuntu 上的图形用户界面 tk 不起作用

java - 如何使 jtextfield 文本在标签进入时消失(Netbeans)

java - Apache Commons SCXML 有什么替代品吗?

java - 尝试连接到串行端口时使用 javax.swing.SwingWorker 时出现问题

java - JTreeTable显示问题

android - 更新 UI/runOnUiThread/final 变量 : How to write lean code that does UI updating when called from another Thread