java中,messageScrollPane.setPreferredSize(new Dimension(400,400); messageScrollPane.revalidate()-

java swing中frame.setSize(500,300);与frame.setPreferredSize(new Dimension(500,300));~

frame.setPreferredSize是设置控件开始显示出来时候的大小。
setSize就是设置组件大小。

setPreferredSize和frame.pack()不用一起用吧。

服务端代码如下:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.net.*;
import java.io.*;

/*
* 聊天服务端的主框架类
*/
public class ChatServer extends JFrame implements ActionListener{

public static int port = 8888;//服务端的侦听端口

ServerSocket serverSocket;//服务端Socket
Image icon;//程序图标
JComboBox combobox;//选择发送消息的接受者
JTextArea messageShow;//服务端的信息显示
JScrollPane messageScrollPane;//信息显示的滚动条
JTextField showStatus;//显示用户连接状态
JLabel sendToLabel,messageLabel;
JTextField sysMessage;//服务端消息的发送
JButton sysMessageButton;//服务端消息的发送按钮
UserLinkList userLinkList;//用户链表

//建立菜单栏
JMenuBar jMenuBar = new JMenuBar();
//建立菜单组
JMenu serviceMenu = new JMenu ("服务(V)");
//建立菜单项
JMenuItem portItem = new JMenuItem ("端口设置(P)");
JMenuItem startItem = new JMenuItem ("启动服务(S)");
JMenuItem stopItem=new JMenuItem ("停止服务(T)");
JMenuItem exitItem=new JMenuItem ("退出(X)");

JMenu helpMenu=new JMenu ("帮助(H)");
JMenuItem helpItem=new JMenuItem ("帮助(H)");

//建立工具栏
JToolBar toolBar = new JToolBar();

//建立工具栏中的按钮组件
JButton portSet;//启动服务端侦听
JButton startServer;//启动服务端侦听
JButton stopServer;//关闭服务端侦听
JButton exitButton;//退出按钮

//框架的大小
Dimension faceSize = new Dimension(400, 600);

ServerListen listenThread;

JPanel downPanel ;
GridBagLayout girdBag;
GridBagConstraints girdBagCon;


/**
* 服务端构造函数
*/
public ChatServer(){
init();//初始化程序

//添加框架的关闭事件处理
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
//设置框架的大小
this.setSize(faceSize);

//设置运行时窗口的位置
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation( (int) (screenSize.width - faceSize.getWidth()) / 2,
(int) (screenSize.height - faceSize.getHeight()) / 2);
this.setResizable(false);

this.setTitle("聊天室服务端"); //设置标题

//程序图标
icon = getImage("icon.gif");
this.setIconImage(icon); //设置程序图标
show();

//为服务菜单栏设置热键'V'
serviceMenu.setMnemonic('V');

//为端口设置快捷键为ctrl+p
portItem.setMnemonic ('P');
portItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_P,InputEvent.CTRL_MASK));

//为启动服务快捷键为ctrl+s
startItem.setMnemonic ('S');
startItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_S,InputEvent.CTRL_MASK));

//为端口设置快捷键为ctrl+T
stopItem.setMnemonic ('T');
stopItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_T,InputEvent.CTRL_MASK));

//为退出设置快捷键为ctrl+x
exitItem.setMnemonic ('X');
exitItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_X,InputEvent.CTRL_MASK));

//为帮助菜单栏设置热键'H'
helpMenu.setMnemonic('H');

//为帮助设置快捷键为ctrl+p
helpItem.setMnemonic ('H');
helpItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_H,InputEvent.CTRL_MASK));

}

/**
* 程序初始化函数
*/
public void init(){

Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());

//添加菜单栏
serviceMenu.add (portItem);
serviceMenu.add (startItem);
serviceMenu.add (stopItem);
serviceMenu.add (exitItem);
jMenuBar.add (serviceMenu);
helpMenu.add (helpItem);
jMenuBar.add (helpMenu);
setJMenuBar (jMenuBar);

//初始化按钮
portSet = new JButton("端口设置");
startServer = new JButton("启动服务");
stopServer = new JButton("停止服务" );
exitButton = new JButton("退出" );
//将按钮添加到工具栏
toolBar.add(portSet);
toolBar.addSeparator();//添加分隔栏
toolBar.add(startServer);
toolBar.add(stopServer);
toolBar.addSeparator();//添加分隔栏
toolBar.add(exitButton);
contentPane.add(toolBar,BorderLayout.NORTH);

//初始时,令停止服务按钮不可用
stopServer.setEnabled(false);
stopItem .setEnabled(false);

//为菜单栏添加事件监听
portItem.addActionListener(this);
startItem.addActionListener(this);
stopItem.addActionListener(this);
exitItem.addActionListener(this);
helpItem.addActionListener(this);

//添加按钮的事件侦听
portSet.addActionListener(this);
startServer.addActionListener(this);
stopServer.addActionListener(this);
exitButton.addActionListener(this);

combobox = new JComboBox();
combobox.insertItemAt("所有人",0);
combobox.setSelectedIndex(0);

messageShow = new JTextArea();
messageShow.setEditable(false);
//添加滚动条
messageScrollPane = new JScrollPane(messageShow,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
messageScrollPane.setPreferredSize(new Dimension(400,400));
messageScrollPane.revalidate();

showStatus = new JTextField(35);
showStatus.setEditable(false);

sysMessage = new JTextField(24);
sysMessage.setEnabled(false);
sysMessageButton = new JButton();
sysMessageButton.setText("发送");

//添加系统消息的事件侦听
sysMessage.addActionListener(this);
sysMessageButton.addActionListener(this);

sendToLabel = new JLabel("发送至:");
messageLabel = new JLabel("发送消息:");
downPanel = new JPanel();
girdBag = new GridBagLayout();
downPanel.setLayout(girdBag);

girdBagCon = new GridBagConstraints();
girdBagCon.gridx = 0;
girdBagCon.gridy = 0;
girdBagCon.gridwidth = 3;
girdBagCon.gridheight = 2;
girdBagCon.ipadx = 5;
girdBagCon.ipady = 5;
JLabel none = new JLabel(" ");
girdBag.setConstraints(none,girdBagCon);
downPanel.add(none);

girdBagCon = new GridBagConstraints();
girdBagCon.gridx = 0;
girdBagCon.gridy = 2;
girdBagCon.insets = new Insets(1,0,0,0);
girdBagCon.ipadx = 5;
girdBagCon.ipady = 5;
girdBag.setConstraints(sendToLabel,girdBagCon);
downPanel.add(sendToLabel);

girdBagCon = new GridBagConstraints();
girdBagCon.gridx =1;
girdBagCon.gridy = 2;
girdBagCon.anchor = GridBagConstraints.LINE_START;
girdBag.setConstraints(combobox,girdBagCon);
downPanel.add(combobox);

girdBagCon = new GridBagConstraints();
girdBagCon.gridx = 0;
girdBagCon.gridy = 3;
girdBag.setConstraints(messageLabel,girdBagCon);
downPanel.add(messageLabel);

girdBagCon = new GridBagConstraints();
girdBagCon.gridx = 1;
girdBagCon.gridy = 3;
girdBag.setConstraints(sysMessage,girdBagCon);
downPanel.add(sysMessage);

girdBagCon = new GridBagConstraints();
girdBagCon.gridx = 2;
girdBagCon.gridy = 3;
girdBag.setConstraints(sysMessageButton,girdBagCon);
downPanel.add(sysMessageButton);

girdBagCon = new GridBagConstraints();
girdBagCon.gridx = 0;
girdBagCon.gridy = 4;
girdBagCon.gridwidth = 3;
girdBag.setConstraints(showStatus,girdBagCon);
downPanel.add(showStatus);

contentPane.add(messageScrollPane,BorderLayout.CENTER);
contentPane.add(downPanel,BorderLayout.SOUTH);

//关闭程序时的操作
this.addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent e){
stopService();
System.exit(0);
}
}
);
}

/**
* 事件处理
*/
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
if (obj == startServer || obj == startItem) { //启动服务端
startService();
}
else if (obj == stopServer || obj == stopItem) { //停止服务端
int j=JOptionPane.showConfirmDialog(
this,"真的停止服务吗?","停止服务",
JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);

if (j == JOptionPane.YES_OPTION){
stopService();
}
}
else if (obj == portSet || obj == portItem) { //端口设置
//调出端口设置的对话框
PortConf portConf = new PortConf(this);
portConf.show();
}
else if (obj == exitButton || obj == exitItem) { //退出程序
int j=JOptionPane.showConfirmDialog(
this,"真的要退出吗?","退出",
JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);

if (j == JOptionPane.YES_OPTION){
stopService();
System.exit(0);
}
}
else if (obj == helpItem) { //菜单栏中的帮助
//调出帮助对话框
Help helpDialog = new Help(this);
helpDialog.show();
}
else if (obj == sysMessage || obj == sysMessageButton) { //发送系统消息
sendSystemMessage();
}
}

/**
* 启动服务端
*/
public void startService(){
try{
serverSocket = new ServerSocket(port,10);
messageShow.append("服务端已经启动,在"+port+"端口侦听...
");

startServer.setEnabled(false);
startItem.setEnabled(false);
portSet.setEnabled(false);
portItem.setEnabled(false);

stopServer .setEnabled(true);
stopItem .setEnabled(true);
sysMessage.setEnabled(true);
}
catch (Exception e){
//System.out.println(e);
}
userLinkList = new UserLinkList();

listenThread = new ServerListen(serverSocket,combobox,
messageShow,showStatus,userLinkList);
listenThread.start();
}

/**
* 关闭服务端
*/
public void stopService(){
try{
//向所有人发送服务器关闭的消息
sendStopToAll();
listenThread.isStop = true;
serverSocket.close();

int count = userLinkList.getCount();

int i =0;
while( i < count){
Node node = userLinkList.findUser(i);

node.input .close();
node.output.close();
node.socket.close();

i ++;
}

stopServer .setEnabled(false);
stopItem .setEnabled(false);
startServer.setEnabled(true);
startItem.setEnabled(true);
portSet.setEnabled(true);
portItem.setEnabled(true);
sysMessage.setEnabled(false);

messageShow.append("服务端已经关闭
");

combobox.removeAllItems();
combobox.addItem("所有人");
}
catch(Exception e){
//System.out.println(e);
}
}

/**
* 向所有人发送服务器关闭的消息
*/
public void sendStopToAll(){
int count = userLinkList.getCount();

int i = 0;
while(i < count){
Node node = userLinkList.findUser(i);
if(node == null) {
i ++;
continue;
}

try{
node.output.writeObject("服务关闭");
node.output.flush();
}
catch (Exception e){
//System.out.println("$$$"+e);
}

i++;
}
}

/**
* 向所有人发送消息
*/
public void sendMsgToAll(String msg){
int count = userLinkList.getCount();//用户总数

int i = 0;
while(i < count){
Node node = userLinkList.findUser(i);
if(node == null) {
i ++;
continue;
}

try{
node.output.writeObject("系统信息");
node.output.flush();
node.output.writeObject(msg);
node.output.flush();
}
catch (Exception e){
//System.out.println("@@@"+e);
}

i++;
}

sysMessage.setText("");
}

/**
* 向客户端用户发送消息
*/
public void sendSystemMessage(){
String toSomebody = combobox.getSelectedItem().toString();
String message = sysMessage.getText() + "
";

messageShow.append(message);

//向所有人发送消息
if(toSomebody.equalsIgnoreCase("所有人")){
sendMsgToAll(message);
}
else{
//向某个用户发送消息
Node node = userLinkList.findUser(toSomebody);

try{
node.output.writeObject("系统信息");
node.output.flush();
node.output.writeObject(message);
node.output.flush();
}
catch(Exception e){
//System.out.println("!!!"+e);
}
sysMessage.setText("");//将发送消息栏的消息清空
}
}

/**
* 通过给定的文件名获得图像
*/
Image getImage(String filename) {
URLClassLoader urlLoader = (URLClassLoader)this.getClass().
getClassLoader();
URL url = null;
Image image = null;
url = urlLoader.findResource(filename);
image = Toolkit.getDefaultToolkit().getImage(url);
MediaTracker mediatracker = new MediaTracker(this);
try {
mediatracker.addImage(image, 0);
mediatracker.waitForID(0);
}
catch (InterruptedException _ex) {
image = null;
}
if (mediatracker.isErrorID(0)) {
image = null;
}

return image;
}

public static void main(String[] args) {
ChatServer app = new ChatServer();
}
}

在重新设置某个容器中的组件的大小以后,需要调用包含这个组件的容器的revalidate()方法。Revalidate()方法会重新计算容器内所有的组建的大小,并且对他们进行重新布局。调用revalidate()方法后,布局管理器就会重新设置容器的大小,然后再重新对容器中的组件进行布局。
Revalidate()方法是Jcompnent的方法。它并不是马上改变组件的大小,而是标记该组件需要改变大小。这样就可以避免了多个组件都要改变大小时带来的重复计算。但是,如果想重新计算一个Jframe中的所有组件,就需要调用validate()方法---------Jframe没有扩展Jcomponent。

java getMessage为null 怎么办
答:空指针异常的message就是null。去看printStackTrace的输出里显示的是哪行吧。

javaEE Web项目 Spring 的国际化异常 No message found
答:我也遇到这个问题了。现在已经解决 解决方法:application.properties增加配置:如下:login是你的文件的名字 国际化配置 spring.messages.basename=i18n/login -1 no expried spring.messages.cache-seconds= -1 spring.messages.encoding=UTF-8

java 编写手机短信,高手赐教!!!
答:package examples;import java.util.Scanner;public class Entry { public static void main(String args []) { Scanner sc=new Scanner(System.in);String pno,msg;System.out.print("请输入短信内容:");msg=sc.nextLine();System.out.println("请输入目标手机号码:");pno=sc.nextLine();Short...

java中(messageDialog)弹出的信息框的那个确定按钮的文字怎么修改?_百度...
答:可以使用这个JOptionPane.showOptionDialog Object[] options = {"确定","取消","帮助"};int response=JOptionPane.showOptionDialog(this, "这是个选项对话框,用户可以选择自己的按钮的个数", "选项对话框标题",JOptionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]);if(...

请问JAVA中这句代码的含义?Collection messages=(Collection)request...
答:Collection是一个集合类,Collection messages=(Collection)request.getAttribute("message");的意思是从request对象中取出message的结果,然后再把结果保存到Collection集合类中!

JAVA日志信息在命令行输出带颜色的字符串是怎么实现的
答:下面的答案是针对控制控制台的颜色:the default console handler of java.util.logging prints messages to System.err, and therefor Eclipse renders them red.你可以通过修改eclipse里的console配色(当然这也影响了其他标准err输出的颜色),或者就是扩展ConsoleHandler :Java代码 class myConsoleHandler ...

Android Message和obtainMessage的区别
答:Message用于封装传递给Handler或者别的什么东西的信息,而obtainMessage则是用于获取一个空白的Message实例。出于节省内存和提高效率的考虑,创建Message实例时,应当尽可能使用obtainMessage,而非使用new关键字去新建Message实例。Message与obtainMessage的区别涉及到Java中关于类和方法的概念,也是面向对象的逻辑方法的...

java中如何把2个byte数组连起来
答:嘎嘎,1楼有意思 public class Test { public static void main(String[] args) { byte[] message;byte[] Head=new byte[3];byte[] Body=new byte[4];message=new byte[Head.length+Body.length];for (int i = 0; i < message.length; i++) { if(i<Head.length){ message[i]=...

java日志
答:LocationInfo=true:默认值是false,输出java文件名称和行号 Title=my app file: 默认值是 Log4J Log Messages. 2.PatternLayout 选项 ConversionPattern=%m%n :指定怎样格式化指定的消息。 3.XMLLayout 选项 LocationInfo=true:默认值是false,输出java文件和行号 2). log4j.appender.A1.layout.ConversionPattern=%-4r...

在java中用eclipse下找不到Property_File
答:用eclipse下找不到Property File是需要建立然后保存到对应路径的。点击new-file 弹出如下图所示对话框,选择好文件存放路径和文件名即可,别的文件

IT评价网,数码产品家用电器电子设备等点评来自于网友使用感受交流,不对其内容作任何保证

联系反馈
Copyright© IT评价网