【问题标题】:Why my thread is not working?为什么我的线程不起作用?
【发布时间】:2016-12-23 17:15:08
【问题描述】:

为什么我的线程不起作用?

我想在JFrame 上短时间显示一条消息..然后我想关闭消息并启动我的主要JPanel。

我应该把线程放在我的主类之外吗?

我在谷歌上搜索了更多..但我没有希望。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class SwitchCheck {

    public static void main(String[] args) {

        final JFrame JF = new JFrame("SwitchJpanel");
        JF.setSize(300, 200);
        JF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Thread Cl = new Thread() {
            public void run() {
                try {
                    JPanel P = new JPanel(null);
                    JF.getContentPane().add(P);
                    JButton L = new JButton("Wellcome");
                    L.setBounds(20, 30, 100, 20);
                    P.add(L);
                    sleep(10000000);
                } catch (Exception e) {

                }
            }
        };
        Cl.start();
        JF.getContentPane().removeAll();
        JF.getContentPane().revalidate();
        final JPanel P1 = new JPanel(null);
        JF.getContentPane().add(P1);
        JLabel L1 = new JLabel("Left");
        L1.setBounds(10, 20, 100, 20);
        P1.add(L1);
        JLabel L2 = new JLabel("Right");
        L2.setBounds(120, 20, 100, 20);
        P1.add(L2);
        final JButton B1 = new JButton("Panel1");
        B1.setBounds(20, 60, 100, 20);
        P1.add(B1);
        final JButton B2 = new JButton("Panel2");
        B2.setBounds(120, 60, 100, 20);
        P1.add(B2);
        B1.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {
                // TODO Auto-generated method stub
                JF.getContentPane().removeAll();
                JPanel P1 = new JPanel(null);
                JF.getContentPane().add(P1);
                JF.getContentPane().revalidate();
                JLabel L1 = new JLabel("Left");
                L1.setBounds(10, 20, 100, 20);
                P1.add(L1);
                JLabel L2 = new JLabel("Right");
                L2.setBounds(120, 20, 100, 20);
                P1.add(L2);
                B1.setText("Panel1");
                B1.setBounds(20, 60, 100, 20);
                P1.add(B1);
                B2.setText("Panel2");
                B2.setBounds(120, 60, 100, 20);
                P1.add(B2);
            }

        });
        B2.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {
                // TODO Auto-generated method stub
                JF.getContentPane().removeAll();
                JPanel P2 = new JPanel(null);
                JF.getContentPane().add(P2);
                JF.getContentPane().revalidate();

                JLabel L3 = new JLabel("UP");
                L3.setBounds(10, 20, 100, 20);
                P2.add(L3);
                JLabel L4 = new JLabel("Down");
                L4.setBounds(120, 20, 100, 20);
                P2.add(L4);
                B1.setText("Panel3");
                B1.setBounds(20, 60, 100, 20);
                P2.add(B1);
                B2.setText("Panel4");
                B2.setBounds(120, 60, 100, 20);
                P2.add(B2);

            }

        });
        JF.setResizable(false);
        JF.setVisible(true);
    }

}

【问题讨论】:

    标签: java swing


    【解决方案1】:

    您的代码中有多个错误:

    1. 您正在main 方法中执行所有代码。

    2. 您没有关注Oracle naming conventions,其中变量名应为小写形式

    3. 您正在手动设置所有组件的边界,虽然这似乎是开始学习 Swing 时制作复杂 GUI 的最佳和最简单的方法,但这不是正确的方法,而是使用Layout manager 或它们的组合以及Empty borders(如果需要间距),Swing 必须在多种屏幕尺寸、PLAF 和分辨率下工作。

    4. 我想在 JFrame 上短暂显示一条消息..然后我想关闭该消息并启动我的主 JPanel。

      似乎您想要做的是在一段时间后使用Dialog 和auto close

    5. 从以上观点来看,您不想使用Thread,而是使用Swing Timer。

      Thread.sleep(...) 将使您的程序“冻结”直到它完成,而Timer 将在自己的线程中执行。

    6. 您没有将程序放在Event Dispatch Thread (EDT)

    【讨论】:

    • 谢谢你..我不知道摇摆计时器..我现在使用它并且工作:)哇
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 2021-12-18
    • 2013-04-02
    相关资源
    最近更新 更多