我做了个GUI的程序,为什么第一次运行时只看到框架,还要最小化到任务栏,再恢复时才能看到框架里的其它组件(控件)呢?

解决方案 »

  1.   


    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.util.*;
    import java.net.*;public class Transmitter {    String dictateString = "";
        int r = 0, i=0;
        Random ran = new Random();
        TextField dictateText = new TextField(dictateString); //指令文本
        //Label dictateText = new Label(dictateString);
        InetAddress myIP = null;
        public Transmitter(){        JFrame fr = new JFrame("按键准确度测试-服务器端");
            fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            fr.setSize(600,400);
            fr.setLocation(100,100);
            fr.setVisible(true);
            fr.setResizable(false);        Container ct = fr.getContentPane();
            GridBagLayout gridbag = new GridBagLayout();
            GridBagConstraints gridbagC = new GridBagConstraints();
            ct.setLayout(gridbag);
            gridbagC.insets = new Insets(2,5,2,5);        // 说明标签
            gridbagC.gridx = 1;
            gridbagC.gridy = 1;
            gridbagC.gridwidth = 2;
            gridbagC.gridheight = 1;
            gridbagC.anchor = GridBagConstraints.SOUTHWEST;
            gridbagC.fill = GridBagConstraints.HORIZONTAL;
            Label instructionLabel = new Label("服务器端说明:");
            gridbag.setConstraints(instructionLabel, gridbagC);
            ct.add(instructionLabel);        // 说明内容
            gridbagC.gridx = 1;
            gridbagC.gridy = 2;
            gridbagC.gridwidth = 4;
            gridbagC.gridheight = 2;
            gridbagC.anchor = GridBagConstraints.CENTER;
            gridbagC.fill = GridBagConstraints.BOTH;
            Label instructionText = new Label("本程序测试您的按键准确度,服务器端" +
                    "发送20个随机指令:上、下、左、右,并以end结束。");
            gridbag.setConstraints(instructionText, gridbagC);
            ct.add(instructionText);        // 指令按钮
            gridbagC.gridx = 1;
            gridbagC.gridy = 4;
            gridbagC.gridwidth = 1;
            gridbagC.gridheight = 1;
            gridbagC.anchor = GridBagConstraints.SOUTHWEST;
            gridbagC.fill = GridBagConstraints.WEST;
            Button dictateButton = new Button("生成随机指令");
            gridbag.setConstraints(dictateButton, gridbagC);
            ct.add(dictateButton);        // 指令提示标签
            gridbagC.gridx = 2;
            gridbagC.gridy = 4;
            gridbagC.gridwidth = 1;
            gridbagC.gridheight = 1;
            gridbagC.anchor = GridBagConstraints.SOUTHWEST;
            gridbagC.fill = GridBagConstraints.HORIZONTAL;
            Label insAdviceLabel = new Label("(请按键生成随机指令)");
            gridbag.setConstraints(insAdviceLabel, gridbagC);
            ct.add(insAdviceLabel);        // 指令生成
            // 在方法 dictateButton_action() 中        // 指令显示
            gridbagC.gridx = 1;
            gridbagC.gridy = 5;
            gridbagC.gridwidth = 4;
            gridbagC.gridheight = 1;
            gridbagC.anchor = GridBagConstraints.WEST;
            gridbagC.fill = GridBagConstraints.BOTH;
            //TextField dictateText = new TextField(dictateString);
            dictateText.setSize(100, 20);
            //dictateText.setSize(400, 100);
            gridbag.setConstraints(dictateText, gridbagC);
            ct.add(dictateText);        // 指令按钮事件监听
            dictateButton.addActionListener(
                    new ActionListener(){
                        public void actionPerformed(ActionEvent e){
                        dictateButton_action(e);
                        dictateText.setText(dictateString);
                        }
                    }
            );        // 客户端IP标签
            gridbagC.gridx = 1;
            gridbagC.gridy = 6;
            gridbagC.gridwidth = 2;
            gridbagC.gridheight = 1;
            gridbagC.anchor = GridBagConstraints.SOUTHWEST;
            gridbagC.fill = GridBagConstraints.BOTH;
            Label ipLabel = new Label("请输入客户端IP地址(默认为本机IP):");
            gridbag.setConstraints(ipLabel, gridbagC);
            ct.add(ipLabel);        // IP文本框
            gridbagC.gridx = 1;
            gridbagC.gridy = 7;
            gridbagC.gridwidth = 4;
            gridbagC.gridheight = 1;
            gridbagC.anchor = GridBagConstraints.CENTER;
            gridbagC.fill = GridBagConstraints.BOTH;
            getLocalIP();
            TextField ipText = new TextField(myIP.toString());
            gridbag.setConstraints(ipText, gridbagC);
            ct.add(ipText);        // IP文本 事件监听
    /*
            ipText.addTextListener(
                    new TextListener(){
                        public void actionPerformed(ActionEvent e){
                        dictateButton_action(e);
                        dictateText.setText(dictateString);
                        }
                    }
            );
    */
            // 发送指令 按钮
            gridbagC.gridx = 1;
            gridbagC.gridy = 8;
            gridbagC.gridwidth = 2;
            gridbagC.gridheight = 1;
            gridbagC.anchor = GridBagConstraints.SOUTHWEST;
            gridbagC.fill = GridBagConstraints.WEST;
            Button sendButton = new Button("发送指令");
            gridbag.setConstraints(sendButton, gridbagC);
            ct.add(sendButton);    }    // 方法 : 按钮事件动作 - 指令生成
        void dictateButton_action(ActionEvent e){
            dictateString = "";
            for(i=0;i<19;i++){
            r = ran.nextInt(4);
            switch(r){
                case 0 : dictateString += "上"; break;
                case 1 : dictateString += "下"; break;
                case 2 : dictateString += "左"; break;
                case 3 : dictateString += "右"; break;
                }
            }
            dictateString += "end";
        }    // 方法 :获取本机IP地址
        void getLocalIP(){
            try{
                myIP = InetAddress.getLocalHost();
            }
            catch(UnknownHostException e ){}
        }    public static void main(String[] args){
            Transmitter transmitter = new Transmitter();
        }
    }
      

  2.   

    上面贴出了现在做了的部分,大概写了三分之一了。
    我用的是netbeans 的IDE,运行时不能正常显示,但是最小化后,再还原就能正常显示了。第一次做这种东西,感觉awt和swing是一头雾水
    多谢了~
      

  3.   

    我运行了,直接就能正常显示啊。
    不过显示之后会看到组件被重新布局(组件在窗体上迅速移动位置),然后一闪而过。
    解决的方法是把 fr.setVisible(true);挪到构造方法的最后就好了,一般来说应该把组件安装好再显示窗体,你的那个显示不正常的问题可能也是这个原因。