今天写了一个UDPserver的swing,一切都是按照教程来的,但是打开后只有一个最基本的窗口可以改变大小,但是里面的组件右面部分不显示,这是为什么呢?
package udp_server;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class style {
//创建一个页面
JFrame whole_page = new JFrame ("UDP Server");
//创建接收文本框和输出文本框
JTextArea recv_send = new JTextArea(8,20);
JTextArea portarea = new JTextArea(1,8);
JTextArea iparea = new JTextArea(1,8);
//创建一堆按钮
JButton getip = new JButton("获取");
JButton yes_port = new JButton("确定");
JButton create_udp_server = new JButton("创建UDP Server");
//创建一块桌面充当画布
//private MyCanvas drawArea = new MyCanvas();
//定义一个JList对象
JList<String> historydata;
//定义一个DefaultListModel对象
DefaultListModel<String> historyModel = new DefaultListModel<>();
//定义一个右键菜单,用于设置程序的外观风格
JPopupMenu stylemenu = new JPopupMenu();
//定义一个ButtongGroup对象,用于组合风格按钮,形成单选
ButtonGroup styleGroup = new ButtonGroup();
//定义五个单选按钮菜单项,用于设置程序风格
JRadioButtonMenuItem metalItem = new JRadioButtonMenuItem("Metal 风格",true);
JRadioButtonMenuItem nimbusItem = new JRadioButtonMenuItem("Nimbus 风格",true);
JRadioButtonMenuItem windowsItem = new JRadioButtonMenuItem("Windows 风格",true);
JRadioButtonMenuItem classicItem = new JRadioButtonMenuItem("Windows 经典风格",true);
JRadioButtonMenuItem motifItem = new JRadioButtonMenuItem("Motif 风格",true);
public void init(){
//------------------------组合主区域------------------------
//创建两个装载文本框和按钮的JPanel,创建两个箱子并放在左边
JPanel portArea = new JPanel();
portArea.add(portarea);
portArea.add(yes_port);
JPanel ipArea = new JPanel();
ipArea.add(iparea);
ipArea.add(getip);
Box putInArea = Box.createVerticalBox();
putInArea.add(ipArea);
putInArea.add(portArea);
whole_page.add(putInArea, BorderLayout.WEST);
//whole_page.add(portArea, BorderLayout.WEST);
//whole_page.add(ipArea, BorderLayout.WEST);
//把“创建udp按钮”放进左边盒子
Box creatUDP = Box.createVerticalBox();
creatUDP.add(create_udp_server);
putInArea.add(creatUDP);
//创建一个盒子放在右面
Box SeenArea = Box.createVerticalBox();
//定义历史数据列表
historydata = new JList<>(historyModel);
historydata.setVisibleRowCount(8);
//在右边盒子中添加组件
SeenArea.add(historydata);
//SeenArea.add(MyCanvas);
whole_page.add(SeenArea, BorderLayout.EAST);
//------------------------组合右键菜单-----------------------------
styleGroup.add(metalItem);
styleGroup.add(nimbusItem);
styleGroup.add(windowsItem);
styleGroup.add(classicItem);
styleGroup.add(motifItem);
//给5个风格菜单创建事件监听器
ActionListener flavorLister = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
try {
changeFlavor(command);
} catch (Exception e1) {
e1.printStackTrace();
}
}
};
//为5个风格菜单项注册监听器
metalItem.addActionListener(flavorLister);
nimbusItem.addActionListener(flavorLister);
windowsItem.addActionListener(flavorLister);
classicItem.addActionListener(flavorLister);
motifItem.addActionListener(flavorLister);
stylemenu.add(metalItem);
stylemenu.add(nimbusItem);
stylemenu.add(windowsItem);
stylemenu.add(classicItem);
stylemenu.add(motifItem);
//调用 whole_page组件的setComponentPopupMenu
putInArea.setComponentPopupMenu(stylemenu);
// 设置关闭窗口时推出程序
whole_page.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置jFrame最佳大小并可见
whole_page.pack();
whole_page.setVisible(true);
whole_page.setLayout(new BorderLayout());
}
//定义一个方法,用于改变界面风格
private void changeFlavor(String command) throws Exception{
switch (command){
case "Metal 风格":
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
break;
case "Nimbus 风格":
UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
break;
case "Windows 风格":
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
break;
case "Windows 经典风格":
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel");
break;
case "Motif 风格":
UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
break;
}
//更新whole_page窗口内顶级容器以及所有组件的UI
SwingUtilities.updateComponentTreeUI(whole_page.getContentPane());
//更新右键菜单及内部所有菜单项的UI
SwingUtilities.updateComponentTreeUI(stylemenu);
}
public static void main(String[] args) {
new style().init();
}
}