9
回答
请教一个java awt 显示的问题
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

自己想要的是(图一)这种效果的。运行时有时是(图一)有时是(图二)的样子 ,概率都到50%,自己看不出那儿错了 ,代码在下面。希望谁给我指点下啊。

                                       (图一)

 

                        (图二)

 

代码在下面:

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Send_Receive {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
    Windows_chat wc = new Windows_chat();
    wc.winChat();
    wc.southPanel();
    wc.centerPanel();
    wc.WindowsExit();
    wc.sendButton();

}
}
class Windows_chat extends Frame {
    
    private Button send;
    private Button log;
    private Button shake;
    private Button clear;
    private TextArea viewText;
    private TextArea sendText; 
    private TextField tf;
    
    public void winChat() {
    setLocation(500, 50 );
    setSize(400, 600);
    setVisible(true);
    }
    public void pannel() {
        
    }

    public void southPanel() {
        Panel south = new Panel();                    //创建南边的Panel
        tf = new TextField(15);
        tf.setText("127.0.0.1");
        send = new Button("发 送");
        log = new Button("记 录");
        clear = new Button("清 屏");
        shake = new Button("震 动");
        south.add(tf);
        south.add(send);
        south.add(log);
        south.add(clear);
        south.add(shake);
        this.add(south,BorderLayout.SOUTH);            //将Panel放在Frame的南边
    }
    public void centerPanel() {
        Panel center = new Panel();                    //创建中间的Panel
        viewText = new TextArea();
        sendText = new TextArea(5,1);
        center.setLayout(new BorderLayout());        //设置为边界布局管理器
        center.add(sendText,BorderLayout.SOUTH);    //发送的文本区域放在南边
        center.add(viewText,BorderLayout.CENTER);    //显示区域放在中间
        viewText.setEditable(false);                //设置不可以编辑
        viewText.setBackground(Color.WHITE);        //设置背景颜色
        sendText.setFont(new Font("xxx", Font.PLAIN, 15));
        viewText.setFont(new Font("xxx", Font.PLAIN, 15));
        this.add(center,BorderLayout.CENTER);
    }
    public void WindowsExit() {
        
        this.addWindowListener(new WindowAdapter() {
            
            public void windowClosing(WindowEvent e) {
            
                System.exit(0);
            }
            });
        
        
    }
    public void sendButton() {
        send.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
            try {
                sendwindow();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            }
            
        });
    }
    
    public void sendwindow() throws IOException {
        String message = sendText.getText();
        String ip =  tf.getText();
        DatagramSocket socket = new DatagramSocket();
        DatagramPacket packet = 
                new DatagramPacket(message.getBytes(),message.getBytes().length,InetAddress.getByName(ip),9999);
        String time = getCurrentTime();    
        String view = time + " 我对:" + (ip.equals("255.255.255.255") ? "所有人" : ip) + "说\r\n" + message + "\r\n\r\n";;
        viewText.append(view);
    }
    
    private String getCurrentTime() {
        // TODO Auto-generated method stub
        Date d = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        
        return sdf.format(d);
    }
}

<无标签>
举报
170731
发帖于3个月前 9回/103阅

AWT 是Abstract Window ToolKit (抽象窗口工具包)的缩写,这个工具包提供了一套与本地图形界面进行交互的接口。AWT 中的图形函数与操作系统所提供的图形函数之间有着一一对应的关系,我们把它称为peers。 也就是说,当我们利用 AWT 来构件图形用户界面的时候,我们实际上是在利用操作系统所提供的图形库。由于不同操作系统的图形库所提供的功能是不一样的,在一个平台上存在的功能在另外一个平台上则可能不存在。为了实现Java语言所宣称的"一次编译,到处运行"的概念,AWT 不得不通过牺牲功能来实现其平台无关性,也就是说,AWT 所提供的图形功能是各种通用型操作系统所提供的图形功能的交集。由于AWT 是依靠本地方法来实现其功能的,我们通常把AWT控件称为重量级控件。 
Swing 是在AWT的基础上构建的一套新的图形界面系统,它提供了AWT 所能够提供的所有功能,并且用纯粹的Java代码对AWT 的功能进行了大幅度的扩充。例如说并不是所有的操作系统都提供了对树形控件的支持, Swing 利用了AWT 中所提供的基本作图方法对树形控件进行模拟。由于 Swing 控件是用100%的Java代码来实现的,因此在一个平台上设计的树形控件可以在其他平台上使用。由于在Swing 中没有使用本地方法来实现图形功能,我们通常把Swing控件称为轻量级控件。 
AWT和Swing之间的基本区别:AWT 是基于本地方法的C/C++程序,其运行速度比较快;Swing是基于AWT 的Java程序,其运行速度比较慢。对于一个嵌入式应用来说,目标平台的硬件资源往往非常有限,而应用程序的运行速度又是项目中至关重要的因素。在这种矛盾的情况下,简单而高效的AWT 当然成了嵌入式Java的第一选择。而在普通的基于PC或者是工作站的标准Java应用中,硬件资源对应用程序所造成的限制往往不是项目中的关键因素,所以在标准版的Java中则提倡使用Swing, 也就是通过牺牲速度来实现应用程序的功能。 
通俗的话: 
AWT 是抽象窗口组件工具包,是 java 最早的用于编写图形节目应用程序的开发包。 
Swing 是为了解决 AWT 存在的问题而新开发的包,它以 AWT 为基础的。

所以说请尽量是用swing开做界面开发,一看你上面的界面就感觉你的操作系统是win10的感觉

--- 共有 1 条评论 ---
170731嗯对 是用的win10的。 3个月前 回复

这是用swing的,你看看有没有问题,如果觉得不怎么好看 还可以用 beautyeye swing来美化下


package com.test;

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JButton;

/**
 * @author beijixin
 *
 */
public class tets {

	private JFrame frame;
	private JTextField textField;

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

	/**
	 * Create the application.
	 */
	public tets() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 435, 634);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(null);
		
		JTextArea textArea = new JTextArea();
		textArea.setBounds(0, 0, 404, 449);
		frame.getContentPane().add(textArea);
		
		JTextArea textArea_1 = new JTextArea();
		textArea_1.setBounds(0, 459, 404, 82);
		frame.getContentPane().add(textArea_1);
		
		textField = new JTextField();
		textField.setBounds(10, 565, 125, 21);
		frame.getContentPane().add(textField);
		textField.setColumns(10);
		
		JButton btnNewButton = new JButton("发送");
		btnNewButton.setBounds(142, 564, 66, 23);
		frame.getContentPane().add(btnNewButton);
		
		JButton btnNewButton_1 = new JButton("记录");
		btnNewButton_1.setBounds(205, 564, 66, 23);
		frame.getContentPane().add(btnNewButton_1);
		
		JButton btnNewButton_2 = new JButton("清屏");
		btnNewButton_2.setBounds(269, 564, 74, 23);
		frame.getContentPane().add(btnNewButton_2);
		
		JButton btnNewButton_3 = new JButton("震动");
		btnNewButton_3.setBounds(343, 564, 70, 23);
		frame.getContentPane().add(btnNewButton_3);
	}
}

 

--- 共有 3 条评论 ---
tcxu 回复 @tcxu : 参考: http://blog.csdn.net/wang102010/article/details/2163509 3个月前 回复
tcxu 回复 @170731 : 将 文本区 放在带 自动水平和/或垂直滚动的滚动条容器内 java.awt.ScrollPane, 多出的文字就会随着 滚动条出现。 3个月前 回复
170731这个我试了下 就是文本行写多文本的话。 超多边界的行就没有下拉条了。 下面的文字显示不出来 3个月前 回复

1. 整理了你的代码,将创建组件的操作任务,都归于构造方法。
2. 在创建窗口的构造方法的末尾, 调用一下父类的方法  public void pack(),目的是:让没能显示的出的组件,都显示出。
调用 pack() 方法,可以 调整此窗口的大小,以适合其子组件的首选大小和布局。如果该窗口和/或其所有者还不可显示,则在计算首选大小之前都将变得可显示。在计算首选大小之后,将会验证该窗口。
3. 在 创建 viewText 文本区时,设置行数为 20, 即 viewText = new TextArea(20,1);

请测试下面修改的代码:

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Send_Receive {

    public static void main(String[] args) throws IOException {
    Windows_chat wc = new Windows_chat();
	}
}
class Windows_chat extends Frame {
    
    private Button send;
    private Button log;
    private Button shake;
    private Button clear;
    private TextArea viewText;
    private TextArea sendText; 
    private TextField tf;
    
    public Windows_chat() {  // 构造方法
    	setLocation(500, 50 );
    	setSize(400, 600);
    	setVisible(true);
 
        Panel south = new Panel();                    //创建南边的Panel
        tf = new TextField(15);
        tf.setText("127.0.0.1");
        send = new Button("发 送");
        log = new Button("记 录");
        clear = new Button("清 屏");
        shake = new Button("震 动");
        south.add(tf);
        south.add(send);
        south.add(log);
        south.add(clear);
        south.add(shake);
        this.add(south,BorderLayout.SOUTH);            //将Panel放在Frame的南边
  
        Panel center = new Panel();                    //创建中间的Panel
        viewText = new TextArea(20,1);   // viewText 文本区 的行数, 定位 20
        sendText = new TextArea(5,1);
        center.setLayout(new BorderLayout());        //设置为边界布局管理器
        center.add(sendText,BorderLayout.SOUTH);    //发送的文本区域放在南边
        center.add(viewText,BorderLayout.CENTER);    //显示区域放在中间
        viewText.setEditable(false);                //设置不可以编辑
        viewText.setBackground(Color.WHITE);        //设置背景颜色
        sendText.setFont(new Font("xxx", Font.PLAIN, 15));
        viewText.setFont(new Font("xxx", Font.PLAIN, 15));
        this.add(center,BorderLayout.CENTER);
  
        
        this.addWindowListener(new WindowAdapter() {         
            public void windowClosing(WindowEvent e) {     
                System.exit(0);
            	}
            });
        
        send.addActionListener(new ActionListener() {
            @Override 
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
            try {
                sendwindow();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            }           
        });
        pack(); //父类方法,从新检查一下界面,让没能显示的组件,都显示出来。 
  	}
    
    public void sendwindow() throws IOException {
        String message = sendText.getText();
        String ip =  tf.getText();
        DatagramSocket socket = new DatagramSocket();
        DatagramPacket packet = 
                new DatagramPacket(message.getBytes(),message.getBytes().length,InetAddress.getByName(ip),9999);
        String time = getCurrentTime();    
        String view = time + " 我对:" + (ip.equals("255.255.255.255") ? "所有人" : ip) + "说\r\n" + message + "\r\n\r\n";;
        viewText.append(view);
    }
    
    private String getCurrentTime() {
        // TODO Auto-generated method stub
        Date d = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        
        return sdf.format(d);
    }
}

 

--- 共有 2 条评论 ---
170731刚看到别人说 在所有控件加载后 再用 setVisible(true); 试了下 也没错误了。 3个月前 回复
170731加了pack()方法真的就没出现显示问题了。 只是自己不大懂这个原理。 真是谢谢您了 3个月前 回复

引用来自“北极心”的评论

所以说请尽量是用swing开做界面开发,一看你上面的界面就感觉你的操作系统是win10的感觉

注意, 用swing做界面开发,用的都是轻量级的组件。若遇到一个重量级 AWT 组件,而且位置重叠,那就被这个重量级 AWT 组件给覆盖了。若在你个 initialize()  方法的代码:

frame = new JFrame();
frame.setBounds(100, 100, 435, 634);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);

后面任意一处,加上如下一段创建  重量级 AWT 组件, 如 标签 (Label), 的代码。 结果,这个 重量级 AWT Label 组件,无论如何 都会 遮挡住 swing 的对应位置的组件。(至使 swing 组件 看不见,但 这些 swing 组件, 比如按钮,功能都在)

Label label = new Label("重量级 ATW 组件");
label.setAlignment(Label.CENTER);
label.setFont(new Font("HEITI",Font.BOLD , 15));
label.setBackground(Color.orange);
label.setForeground(Color.red);
label.setBounds(100, 560,200,23);
frame.getContentPane().add(label);

相应要增加几个头文件:

import java.awt.EventQueue;
import java.awt.Label;
import java.awt.Color;
import java.awt.Font;
import javax.swing.JScrollPane;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JButton;

结果如图:

或者,在你的代码公共类的主方法最后一行,添加:

wc.pack();

public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
    Windows_chat wc = new Windows_chat();
    wc.winChat();
    wc.southPanel();
    wc.centerPanel();
    wc.WindowsExit();
    wc.sendButton();
    wc.pack();
}

这样一来,pack() 方法会从新估算 展出的窗框的“最佳”尺寸,结果不尽人意,但保证每次都一定显示两个文本区域 viewText 和 sendText。

再将创建边界布局管理器中区 (BorderLayout.CENTER)的方法中,设定 “查看文本区” viewText 的行数为 20, 这样,结果会近似于你的理想展图.

 public void centerPanel() {
        Panel center = new Panel();                    //创建中间的Panel
        viewText = new TextArea(20,1);
        sendText = new TextArea(5,1);
        center.setLayout(new BorderLayout());        //设置为边界布局管理器
        center.add(sendText,BorderLayout.SOUTH);    //发送的文本区域放在南边
        center.add(viewText,BorderLayout.CENTER);    //显示区域放在中间
        viewText.setEditable(false);                //设置不可以编辑
        viewText.setBackground(Color.WHITE);        //设置背景颜色
        sendText.setFont(new Font("xxx", Font.PLAIN, 15));
        viewText.setFont(new Font("xxx", Font.PLAIN, 15));
        this.add(center,BorderLayout.CENTER);
    }

试试看是否可行?

注 : 在我的机器上运行你的 原生代码,结果,每次都出现你的理想展图,并没有发生过你所说的现象,即根本不存在你所报告的问题。

手工写的代码?

如果是前端那还能好,手写Swing真的不推荐。

NetBeans 支持 Swing 可视化开发,可以支持拖拉控件,快速实现 GUI,你可以试试。

--- 共有 1 条评论 ---
170731嗯 但是别人都是用的eclipse ,之前有搜但没找到这个工具的的教程 就没用了 3个月前 回复
顶部