黑马程序员技术交流社区

标题: 关于GUI的问题! [打印本页]

作者: 田建    时间: 2012-7-7 19:53
标题: 关于GUI的问题!
本帖最后由 田建 于 2012-7-8 08:42 编辑

小弟自己写了个小型的学生信息管理系统,现在基本功能已经实现,里面涉及到很多个界面之间的切换,每个界面有我本身设置的大小,位置以及布局(我设置的是流布局),这其中有一个问题就是别人不能改变窗体的大小,一改变布局就乱套了,想请问如何实现,在改变窗体的时候不改变各个控件之间的相对位置!
以下附一段登陆界面的代码,大家可以用这个做实例讲解一下,谢谢!
大家测试的时候需要把下面进入其他界面的代码注释掉!
  1. package cn.itcast.management;

  2. import java.awt.FlowLayout;
  3. import java.awt.GridBagLayout;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. import java.awt.event.MouseEvent;
  7. import java.awt.event.MouseListener;

  8. import javax.swing.JButton;
  9. import javax.swing.JComboBox;
  10. import javax.swing.JFrame;
  11. import javax.swing.JLabel;
  12. import javax.swing.JPasswordField;
  13. import javax.swing.JTextField;
  14. import javax.swing.event.MouseInputListener;

  15. public class LoginSwing extends JFrame implements ActionListener {
  16. private JLabel label1;
  17. private JLabel label2;
  18. private JLabel label3;
  19. private JLabel labelResult;
  20. private JTextField tf1;
  21. private JPasswordField tf2;
  22. private JComboBox cb;
  23. private JButton bt;
  24. String[] ss = { "学生", "老师" };

  25. public LoginSwing() {
  26. this.setTitle("学生信息管理系统");
  27. this.setLayout(new FlowLayout());
  28. this.setBounds(300, 200, 300, 180);
  29. label1 = new JLabel(" 用 户 名 : ");
  30. label2 = new JLabel(" 密 码 : ");
  31. label3 = new JLabel("身 份 : ");
  32. labelResult = new JLabel(" ");
  33. tf1 = new JTextField("请输入姓名", 10);
  34. tf2 = new JPasswordField("", 10);
  35. cb = new JComboBox(ss);

  36. bt = new JButton("登 陆 ");
  37. bt.addActionListener(this);
  38. this.add(label1);

  39. this.add(tf1);
  40. tf1.addMouseListener(new MouseInputListener() {

  41. @Override
  42. public void mouseMoved(MouseEvent e) {
  43. // TODO Auto-generated method stub

  44. }

  45. @Override
  46. public void mouseDragged(MouseEvent e) {
  47. // TODO Auto-generated method stub

  48. }

  49. @Override
  50. public void mouseReleased(MouseEvent e) {
  51. // TODO Auto-generated method stub

  52. }

  53. @Override
  54. public void mousePressed(MouseEvent e) {
  55. // TODO Auto-generated method stub

  56. }

  57. @Override
  58. public void mouseExited(MouseEvent e) {
  59. // TODO Auto-generated method stub

  60. }

  61. @Override
  62. public void mouseEntered(MouseEvent e) {
  63. // TODO Auto-generated method stub

  64. }

  65. @Override
  66. public void mouseClicked(MouseEvent e) {
  67. // TODO Auto-generated method stub
  68. tf1.setText("");
  69. }
  70. });
  71. this.add(label2);
  72. this.add(tf2);
  73. this.add(label3);
  74. this.add(cb);
  75. this.add(bt);
  76. this.add(labelResult);

  77. this.setVisible(true);

  78. }

  79. @Override
  80. public void actionPerformed(ActionEvent e) {
  81. // TODO Auto-generated method stub
  82. if (e.getSource() == bt) {
  83. String name = tf1.getText();
  84. String password = new String(tf2.getPassword());
  85. String work = (String) cb.getSelectedItem();
  86. if ("老师".equals(work)) {
  87. if ("田建".equals(name) && "020940509".equals(password)) {
  88. labelResult.setText("登陆成功");
  89. new TeacherSwing();// 进入老师操作界面
  90. this.setVisible(false);
  91. } else {
  92. labelResult.setText("用户名或密码有误,登陆失败");
  93. }
  94. }
  95. if ("学生".equals(work)) {
  96. if (LoginManager.login(name, password)) {
  97. new StudentSwing(tf1.getText());//进入学生操作界面
  98. this.setVisible(false);

  99. } else {
  100. labelResult.setText("输入的用户名或密码有误,登陆失败");
  101. }
  102. }
  103. }
  104. }

  105. public static void main(String[] args) {
  106. new LoginSwing();

  107. }
  108. }
复制代码

作者: 温少邦    时间: 2012-7-7 21:51
解决方案一:
当然不能直接用流式布局
流式和写文章一样,从第一行开始摆,摆不下了就换到第二行
窗口一变大,就全到一行去了

比如用Grid布局:
摆4个JPanel
每个JPanel都用默认的Border布局
分别放用户名,密码,身份,登陆按钮

  1. JPanel jp1=new JPanel();
  2. jp1.add(label1,BorderLayout.WEST);
  3. jp1.add(tf1,BorderLayout.EAST);
  4. this.add(jp1);

  5. JPanel jp2=new JPanel();
  6. jp2.add(label3,BorderLayout.WEST);
  7. jp2.add(cb,BorderLayout.EAST);
  8. this.add(jp2);

  9. JPanel jp3=new JPanel();
  10. jp3.add(label2,BorderLayout.WEST);
  11. jp3.add(tf2,BorderLayout.EAST);
  12. this.add(jp3);
  13.                
  14. JPanel jp4=new JPanel();
  15. jp4.add(bt,BorderLayout.CENTER);
  16. this.add(jp4);
复制代码
这样就可以了:







解决方案二:
使用null布局
每个控件都自己setBounds
然后用主窗体的setResizable(false)方法禁止用户改变大小


作者: 田建    时间: 2012-7-7 23:15
温少邦 发表于 2012-7-7 21:51
解决方案一:
当然不能直接用流式布局
流式和写文章一样,从第一行开始摆,摆不下了就换到第二行

多谢你的回答,第一种可以解决我的问题,但是还有没有其他方法呢?因为用这种方法改的话加上其他界面改动太大了!
作者: 温少邦    时间: 2012-7-7 23:26
田建 发表于 2012-7-7 23:15
多谢你的回答,第一种可以解决我的问题,但是还有没有其他方法呢?因为用这种方法改的话加上其他界面改动 ...

那应该只有setResizable(false),不让用户改变窗体大小了

感觉大部分GUI程序都是不让用户改变大小的吧
不论怎么布局,改变大小之后总是不太好看
作者: 田建    时间: 2012-7-7 23:30
但是真正在用的过程中改变大小是必须的啊,再就是我存储的信息还有图片,需要改变大小!
作者: 温少邦    时间: 2012-7-8 00:14
图片可以居中显示
如果想要改变大小
那肯定要设计布局
作者: 田建    时间: 2012-7-8 08:41
温少邦 发表于 2012-7-8 00:14
图片可以居中显示
如果想要改变大小
那肯定要设计布局

恩恩   多谢耐心的讲解!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2