建材秒知道
登录
建材号 > 设计 > 正文

用java设计一个简单的界面设计,越简单越好,谢谢

舒服的银耳汤
威武的蜡烛
2022-12-28 18:07:22

用java设计一个简单的界面设计,越简单越好,谢谢

最佳答案
心灵美的荷花
完美的豆芽
2026-05-08 22:41:47

用java设计一个简单的界面可以参考如下实例:

import javax.swing.JFrame//框架

import javax.swing.JPanel//面板

import javax.swing.JButton//按钮

import javax.swing.JLabel//标签

import javax.swing.JTextField//文本框

import java.awt.Font//字体

import java.awt.Color//颜色

import javax.swing.JPasswordField//密码框

import java.awt.event.ActionListener//事件监听

import java.awt.event.ActionEvent//事件处理

import javax.swing.JOptionPane//消息窗口public class UserLogIn extends JFrame{

 public JPanel pnluser

 public JLabel lbluserLogIn

 public JLabel lbluserName

 public JLabel lbluserPWD

 public JTextField txtName

 public JPasswordField pwdPwd

 public JButton btnSub

 public JButton btnReset

 public UserLogIn(){

  pnluser = new JPanel()

  lbluserLogIn = new JLabel()

  lbluserName = new JLabel()

  lbluserPWD = new JLabel()

  txtName = new JTextField()

  pwdPwd = new JPasswordField()

  btnSub = new JButton()

  btnReset = new JButton()

  userInit()

 }

 public void userInit(){

  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)//设置关闭框架的同时结束程序

  this.setSize(300,200)//设置框架大小为长300,宽200

  this.setResizable(false)//设置框架不可以改变大小

  this.setTitle("用户登录")//设置框架标题

  this.pnluser.setLayout(null)//设置面板布局管理

  this.pnluser.setBackground(Color.cyan)//设置面板背景颜色

  this.lbluserLogIn.setText("用户登录")//设置标签标题

  this.lbluserLogIn.setFont(new Font("宋体",Font.BOLD | Font.ITALIC,14))//设置标签字体

  this.lbluserLogIn.setForeground(Color.RED)//设置标签字体颜色

  this.lbluserName.setText("用户名:")

  this.lbluserPWD.setText("密    码:")

  this.btnSub.setText("登录")

  this.btnReset.setText("重置")

  this.lbluserLogIn.setBounds(120,15,60,20)//设置标签x坐标120,y坐标15,长60,宽20

  this.lbluserName.setBounds(50,55,60,20)

  this.lbluserPWD.setBounds(50,85,60,25)

  this.txtName.setBounds(110,55,120,20)

  this.pwdPwd.setBounds(110,85,120,20)

  this.btnSub.setBounds(85,120,60,20)

  this.btnSub.addActionListener(new ActionListener()//匿名类实现ActionListener接口

   {

    public void actionPerformed(ActionEvent e){

     btnsub_ActionEvent(e)

    }    

   }

  ) 

  this.btnReset.setBounds(155,120,60,20)

  this.btnReset.addActionListener(new ActionListener()//匿名类实现ActionListener接口

   {

    public void actionPerformed(ActionEvent e){

     btnreset_ActionEvent(e)

    }    

   }

  )   

  this.pnluser.add(lbluserLogIn)//加载标签到面板

  this.pnluser.add(lbluserName)

  this.pnluser.add(lbluserPWD)

  this.pnluser.add(txtName)

  this.pnluser.add(pwdPwd)

  this.pnluser.add(btnSub)

  this.pnluser.add(btnReset)

  this.add(pnluser)//加载面板到框架

  this.setVisible(true)//设置框架可显  

 }

 public void btnsub_ActionEvent(ActionEvent e){

  String name = txtName.getText()

  String pwd = String.valueOf(pwdPwd.getPassword())

  if(name.equals("")){

   JOptionPane.showMessageDialog(null,"账号不能为空","错误",JOptionPane.ERROR_MESSAGE)

   return

  }else if (pwd.equals("")){

   JOptionPane.showMessageDialog(null,"密码不能为空","错误",JOptionPane.ERROR_MESSAGE)

   return

  }else if(true){

   this.dispose()

  }else{

   JOptionPane.showMessageDialog(null,"账号或密码错误","错误",JOptionPane.ERROR_MESSAGE)

   return

  }

 }

 public void btnreset_ActionEvent(ActionEvent e){

  txtName.setText("")

  pwdPwd.setText("")

 }

 public static void main(String[] args){

  new UserLogIn()

 }

}

最新回答
体贴的芹菜
温暖的楼房
2026-05-08 22:41:47

import java.awt.BorderLayout\x0d\x0aimport java.awt.Color\x0d\x0aimport java.awt.FlowLayout\x0d\x0aimport java.awt.Font\x0d\x0aimport java.awt.event.ActionEvent\x0d\x0aimport java.awt.event.ActionListener\x0d\x0aimport java.awt.event.KeyEvent\x0d\x0aimport java.awt.event.KeyListener\x0d\x0aimport java.util.Calendar\x0d\x0a\x0d\x0aimport javax.swing.JButton\x0d\x0aimport javax.swing.JFrame\x0d\x0aimport javax.swing.JLabel\x0d\x0aimport javax.swing.JOptionPane\x0d\x0aimport javax.swing.JPasswordField\x0d\x0aimport javax.swing.JTextArea\x0d\x0a\x0d\x0apublic class Test2{\x0d\x0apublic Test2() {}\x0d\x0a\x0d\x0aJFrame frame //主界面框架\x0d\x0a\x0d\x0a//主界面函数\x0d\x0apublic void mainFace() {\x0d\x0aframe=new JFrame("主界面")\x0d\x0aframe.setLayout(new BorderLayout())\x0d\x0a\x0d\x0aJLabel label=new JLabel("这是主界面")\x0d\x0aframe.add(label,BorderLayout.CENTER)\x0d\x0a\x0d\x0aJButton button=new JButton("进入另一个界面")\x0d\x0aframe.add(button,BorderLayout.SOUTH)\x0d\x0abutton.addActionListener(new ActionListener() {\x0d\x0a\x0d\x0a@Override\x0d\x0apublic void actionPerformed(ActionEvent e) {\x0d\x0aotherFace()//进入另一个界面\x0d\x0aframe.dispose() //主界面关闭\x0d\x0a}\x0d\x0a\x0d\x0a})\x0d\x0a\x0d\x0aframe.setSize(400,300)\x0d\x0aframe.setLocation(100,50)\x0d\x0aframe.setVisible(true)\x0d\x0aframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)\x0d\x0a}\x0d\x0a\x0d\x0a//另一个图形界面\x0d\x0apublic void otherFace() {\x0d\x0afinal JFrame oframe=new JFrame("另一个界面")\x0d\x0aoframe.setLayout(new BorderLayout())\x0d\x0a\x0d\x0aJTextArea displayArea=new JTextArea()\x0d\x0aoframe.add(displayArea,BorderLayout.CENTER)\x0d\x0adisplayArea.setFont(new Font("宋体",Font.BOLD,30))\x0d\x0adisplayArea.setForeground(Color.red)\x0d\x0a\x0d\x0adisplayArea.append("\n\n\n\n 这是另一个图形界面")\x0d\x0a\x0d\x0aJButton button1=new JButton("返回主界面")\x0d\x0aoframe.add(button1,BorderLayout.SOUTH)\x0d\x0a\x0d\x0abutton1.addActionListener(new ActionListener() {\x0d\x0a\x0d\x0a@Override\x0d\x0apublic void actionPerformed(ActionEvent e) {\x0d\x0aframe.setVisible(true) //主界面显示\x0d\x0aoframe.dispose() //另一个界面关闭\x0d\x0a}\x0d\x0a\x0d\x0a})\x0d\x0a\x0d\x0aoframe.setSize(400,300)\x0d\x0aoframe.setLocation(150,100)\x0d\x0aoframe.setVisible(true)\x0d\x0a}\x0d\x0a\x0d\x0a//密码输入函数\x0d\x0apublic void passwordFrame() {\x0d\x0afinal JFrame keyFrame=new JFrame("Password Input")\x0d\x0akeyFrame.setLayout(new FlowLayout())\x0d\x0a\x0d\x0afinal JPasswordField keyField=new JPasswordField()\x0d\x0akeyField.setColumns(30)\x0d\x0akeyField.setFont(new Font("宋体",Font.BOLD,20))\x0d\x0akeyField.setEchoChar('@')\x0d\x0akeyFrame.add(keyField)\x0d\x0a \x0d\x0aCalendar calendar=Calendar.getInstance()\x0d\x0a\x0d\x0aint mon=calendar.get(Calendar.MONTH)+1\x0d\x0aint day=calendar.get(Calendar.DAY_OF_MONTH)\x0d\x0aint h=calendar.get(Calendar.HOUR_OF_DAY)\x0d\x0aint m=calendar.get(Calendar.MINUTE)\x0d\x0a\x0d\x0afinal String nowKey=mon+"."+day+"."+h+"."+m //密码为现在时间的 月.日.时.分\x0d\x0a\x0d\x0akeyField.addKeyListener(new KeyListener() { //给密码框添加键盘监听器\x0d\x0a\x0d\x0apublic void keyPressed(KeyEvent e) {\x0d\x0aif(e.getKeyCode()==KeyEvent.VK_ENTER) {\x0d\x0achar[] key=keyField.getPassword()\x0d\x0aString keyStr = String.valueOf(key)\x0d\x0a\x0d\x0aif(keyStr.equals(nowKey)) {\x0d\x0amainFace()//进入主界面\x0d\x0akeyFrame.dispose()\x0d\x0a}\x0d\x0aelse {\x0d\x0aJOptionPane.showMessageDialog(null, "输入的密码不正确!")\x0d\x0a}\x0d\x0a}\x0d\x0a}\x0d\x0a\x0d\x0a@Override\x0d\x0apublic void keyReleased(KeyEvent e) {}\x0d\x0a\x0d\x0apublic void keyTyped(KeyEvent e) {}\x0d\x0a\x0d\x0a})\x0d\x0a\x0d\x0aJButton sureButton=new JButton("确认")\x0d\x0akeyFrame.add(sureButton)\x0d\x0asureButton.addActionListener(new ActionListener() { //给'确定'按钮添加动作监听器\x0d\x0a\x0d\x0apublic void actionPerformed(ActionEvent e) {\x0d\x0achar[] key=keyField.getPassword()\x0d\x0aString keyStr = String.valueOf(key)\x0d\x0a\x0d\x0aif(keyStr.equals(nowKey)) {\x0d\x0amainFace()//进入主界面\x0d\x0akeyFrame.dispose()\x0d\x0a}\x0d\x0aelse {\x0d\x0aJOptionPane.showMessageDialog(null, "输入的密码不正确!")\x0d\x0a}\x0d\x0a}\x0d\x0a\x0d\x0a})\x0d\x0a\x0d\x0aJButton cancelButton=new JButton("取消")\x0d\x0akeyFrame.add(cancelButton)\x0d\x0acancelButton.addActionListener(new ActionListener() {\x0d\x0a\x0d\x0apublic void actionPerformed(ActionEvent e) {\x0d\x0aSystem.exit(0)\x0d\x0a}\x0d\x0a\x0d\x0a})\x0d\x0a\x0d\x0akeyFrame.setSize(400,120)\x0d\x0akeyFrame.setLocation(300,300)\x0d\x0akeyFrame.setVisible(true)\x0d\x0akeyFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)\x0d\x0a}\x0d\x0a\x0d\x0a//程序主函数\x0d\x0apublic static void main(String args[]) {\x0d\x0aTest2 t2=new Test2()\x0d\x0at2.passwordFrame()\x0d\x0a}\x0d\x0a}

复杂的白羊
高兴的紫菜
2026-05-08 22:41:47

首先:采用什么技术实现

java语言可以使用awt 和swing等技术实现图形界面

推荐使用Swing,因为Swing比AWT更专业,更漂亮,组件更丰富,功能更强大。

2.   其次:分析采用什么布局

边界布局BorderLayout,配合表格布局GridLayout,既简单又美观

3.   最后:分析需求中需要用的组件

学生姓名 学号  显示信息 需要用到文本框JTextField

单选按钮 需要用到组件 JRadioButton

复选框    需要用到组件 JCheckBox

组合框    需要用到组件 JComboBox

图片效果

参考代码如下

//导入所需要的包

import java.awt.event.*

import javax.swing.border.*

import javax.swing.*

import java.awt.*

public class ClassFrame extends JFrame {// 写一个类继承自JFrame 窗体

// 定义组件

private static final long serialVersionUID = 1L

private JPanel contentPane

private JTextField tfName, tfNum, allInfo

private JRadioButton rb1, rb2

private JCheckBox cb1, cb2, cb3

private JComboBox<String> t1, t2, t3

public static void main(String[] args) {

EventQueue.invokeLater(new Runnable() {

public void run() {

try {

ClassFrame frame = new ClassFrame()// 创建一个窗口实例

frame.setVisible(true)// 让该窗口实例可见

} catch (Exception e) {

e.printStackTrace()

}

}

})

}

public ClassFrame() {

setTitle("选课ing...")//标题

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)// 设置关闭是退出JVM

setSize(450, 339)// 设置窗体大小

setLocationRelativeTo(null)// 窗体居中

contentPane = new JPanel()// 内容面板

contentPane.setBorder(new EmptyBorder(5, 5, 5, 5))

contentPane.setLayout(new BorderLayout(0, 0))// 设置布局

setContentPane(contentPane)

JPanel panel = new JPanel(new GridLayout(5, 1, 5, 10))//5行1列的表格布局

panel.setBorder(new TitledBorder(null, "", TitledBorder.LEADING, TitledBorder.TOP, null, null))

contentPane.add(panel, BorderLayout.CENTER)//给panel添加边框

JPanel panel_1 = new JPanel()

panel.add(panel_1)

JLabel label = new JLabel("姓名")

panel_1.add(label)

tfName = new JTextField()

panel_1.add(tfName)

tfName.setColumns(10)

JLabel label_2 = new JLabel("学号")

panel_1.add(label_2)

tfNum = new JTextField()

tfNum.setColumns(10)

panel_1.add(tfNum)

rb1 = new JRadioButton("男")

panel_1.add(rb1)

rb1.setSelected(true)//设置单选按钮中,默认选择的按钮

rb2 = new JRadioButton("女")

panel_1.add(rb2)

ButtonGroup bts = new ButtonGroup()//单选按钮需要加入同一个ButonGroup中才能生效

bts.add(rb1)

bts.add(rb2)

JPanel panel_2 = new JPanel()

panel.add(panel_2)

cb1 = new JCheckBox("高等数学")

panel_2.add(cb1)

t1 = new JComboBox<String>()

t1.setModel(new DefaultComboBoxModel<String>(new String[] { "林老师", "赵老师", "孙老师" }))

panel_2.add(t1)

JPanel panel_3 = new JPanel()

panel.add(panel_3)

cb2 = new JCheckBox("世界经济")

panel_3.add(cb2)

t2 = new JComboBox<String>()

t2.setModel(new DefaultComboBoxModel<String>(new String[] { "张老师", "刘老师" }))

panel_3.add(t2)

JPanel panel_4 = new JPanel()

panel.add(panel_4)

cb3 = new JCheckBox("音乐赏析")

panel_4.add(cb3)

t3 = new JComboBox<String>()

t3.setModel(new DefaultComboBoxModel<String>(new String[] { "王老师", "周老师" }))

panel_4.add(t3)

JPanel panel_5 = new JPanel()

panel.add(panel_5)

JButton jbOk = new JButton("确定")

panel_5.add(jbOk)

JButton jbRest = new JButton("重填")

panel_5.add(jbRest)

JPanel panelSouth = new JPanel()

contentPane.add(panelSouth, BorderLayout.SOUTH)

JLabel labe = new JLabel("选课信息")

labe.setHorizontalAlignment(SwingConstants.LEFT)

panelSouth.add(labe)

allInfo = new JTextField()

allInfo.setColumns(30)

panelSouth.add(allInfo)

JPanel panelNorth = new JPanel()

contentPane.add(panelNorth, BorderLayout.NORTH)

JLabel labelTitle = new JLabel("学生选课界面")

labelTitle.setForeground(Color.DARK_GRAY)

labelTitle.setFont(new Font("宋体", Font.BOLD, 20))

panelNorth.add(labelTitle)

//给确定按钮添加事件处理代码

jbOk.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

StringBuilder info = new StringBuilder()

String name = tfName.getText()

String num = tfNum.getText()

String sex

if (rb1.isSelected()) {

sex = "男"

} else {

sex = "女"

}

info.append(name + num + sex)

if (cb1.isSelected()) {

String c = cb1.getText()

String t = t1.getSelectedItem().toString()

info.append(" " + c + t)

}

if (cb2.isSelected()) {

String c = cb2.getText()

String t = t2.getSelectedItem().toString()

info.append(" " + c + t)

}

if (cb3.isSelected()) {

String c = cb3.getText()

String t = t3.getSelectedItem().toString()

info.append(" " + c + t)

}

allInfo.setText(info.toString())//把学生信息和选课信息放到文本框

}

})

//给重填按钮 设置事件处理代码

jbRest.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

tfName.setText("")

tfNum.setText("")

rb1.setSelected(true)

cb1.setSelected(false)

t1.setSelectedIndex(0)

cb2.setSelected(false)

t2.setSelectedIndex(0)

cb3.setSelected(false)

t3.setSelectedIndex(0)

allInfo.setText("")

}

})

}

}

寂寞的耳机
执着的白昼
2026-05-08 22:41:47
1 边框布局

JPanel panel1=(JPanel)getContentPane()

panel1.setLayout(new FlowLayout())

凭着我们现在所积累的阅读程序的功夫,应该能够很快地知道我们通过第一条语句创建了一个容器JPanel类的panel1。

而接下来,我们则调用了panel1.setLayout(new FlowLayout()),在上一章中,我们一直没有对它进行相应的分析。现在该是揭开它的面纱的时候了。

单词layout的中文意思是“布局”、“布置”,setLayout就是设置布局格式。也就是说,容器panel1的方法setLayout是用来设置布局格式的。那么,我们一直用的是什么模式呢?对,就是后面括号里的FlowLayout()。顾名思义,也就是流布局方式。这是一种顺其自然的方式:从左到右,一个个对象地摆放,摆不下,就摆到下一行。所以,我们就无法去控制它。

从本章开始,我们就要学习一种控制布局的方法。在Java语言中,提供了各种布局管理器,以便大家能够达到这一目的。

通常我们最常使用的布局管理器是:Border Layout(边框布局管理器),如下图所示,边框布局管理器将一个屏幕分成了五个部分:东、南、西、北、中。

如果要使用这种边框布局管理进行布局控制,我们必须先将“容器”设置为“边框布局控制模式”,具体来说,就是当调用setLayout方法为容器设置布局控制模式时,参数设置为BorderLayout。例如:

JPanel panel1=(JPanel)getContentPane()

panel1.setLayout(new BorderLayout())

然后,我们就可以在使用容器的add方法添加部件时,附加上位置参数,使得该部件显示在指定的位置上。位置参数分别是:

BorderLayout.NORTH 位置为北

BorderLayout.SOUTH 位置为南

BorderLayout.EAST 位置为东

BorderLayout.WEST 位置为西

BorderLayout.NORTH 位置为中心

实例说明

下面,我们就来试一试,使用按钮排出五个方向!请创建一个testBorder.java,输入以下源程序:

源程序:useTextArea.java

import java.awt.*

import javax.swing.*

import java.applet.Applet

public class testBorder extends JApplet

{

public void init()

{

JPanel panel1=(JPanel)getContentPane()

panel1.setLayout(new BorderLayout())

JButton north=new JButton("North")

JButton south=new JButton("South")

JButton east=new JButton("East")

JButton west=new JButton("West")

JButton center=new JButton("Center")

panel1.add(north,BorderLayout.NORTH)

panel1.add(south,BorderLayout.SOUTH)

panel1.add(east,BorderLayout.EAST)

panel1.add(west,BorderLayout.WEST)

panel1.add(center,BorderLayout.CENTER)

}

}

然后,我们使用javac编译这个程序,然后编辑一个显示这个Java Applet的HTML页面。最后调用appletviewer来观察这个页面

为了试一下,如果并没有在每个位置都安排一个部件,那么会怎么样呢?我们修改一下程序,将panel1.add(west,BorderLayout.WEST)这一行注释掉(就是在前面加上“//”号),也就是不显示西边的按钮,看一下结果如何。正如上图(图10-3)所示,西边由于没有部件,因此“中”就朝西靠,“占领”了它的位置。

而如果我们修改一下程序,让中间的按钮不显示的话,就会出现如图10-5的样子,中间的区域并未并占领,而是空在那里了!这是与其它位置不同的地方,大家一定要记住。

一些提示:

其实这很好理解,如果中间的那一块的位置被其它位置上的部件占领的话,就会使得分不清“东”、“南”、“西”、“北”了。倒成了“左上角”、“左下角”、“右上角”、“右下角”了。

2 网格布局

实例说明

下面,我们来看一个新的程序!首先创建一个testGrid.java文件,并输入以下源程序:

源程序:testGrid.java

import java.awt.*

import javax.swing.*

import java.applet.Applet

public class testGrid extends JApplet

{

String buttonLabels[]={"No.1","No.2","No.3","No.4","No.5",

"No.6","No.7","No.8","No.9"}

public void init()

{

JPanel panel1=(JPanel)getContentPane()

panel1.setLayout(new GridLayout(3,3))

for (int x=0xpanel1.add(new JButton(buttonLabels[x]))

}

}

然后,我们使用javac编译这个程序,然后编辑一个显示这个Java Applet的HTML页面。最后调用appletviewer来观察这个页面

我们主要是关心如何摆放各个部件,而不是如何构建一个程序。所以,正如本例中的按钮一下,这一章中的所有部件都是一个样子,没有任何作用。这样也使得程序尽可能地变短了,更易于大家阅读和理解程序。

下面,我们就一起来看一下上面的这个程序。

1) String buttonLabels[]={"No.1","No.2","No.3","No.4","No.5",

"No.6","No.7","No.8","No.9"}

我想大家都能很轻松地读懂这条语句,我们在此定义了一个字符串数组buttonLabels,它有9个字符串成员,也就是我们后面定义的9个按钮的标签文本。

值得注意的是,大家一定要知道,buttonLabels[1]表示哪个字符串!如果您的答案是“No.1”的话,就错了!正确的答案是“No.2”,这是因为在数组中索引值是从0开始的,也就是说如果要使用“No.1”的话,应该使用buttonLabels[0]。这对更好地理解后面的程序十分重要,也是基本功之一。

2) JPanel panel1=(JPanel)getContentPane()

panel1.setLayout(new GridLayout(3,3))

在这两行程序中,我们首先定义了一个容器部件panel1。然后调用setLayout方法设置布局管理器。这里我们使用了一个新的布局管理器:GridLayout,网格布局管理器。

我们注意到GridLayout的后面带了两个参数:3,3。这有什么用呢?我们一起来看一下GridLayout方法的定义:

public GridLayout (int rows,int cols)

我们看一下这两个参数,首先它们都是int型—整型的。那么它们分别起到什么作用呢?我们还是采用顾名思义法吧!row的中文意思是行,col的中文意思是列,后面加上一个s,是这两个单词的复数形式。

好,我们现在串起来想一下,我们定义了一个网格布局,然后定了它的行、列数!这不就画出了这个网格了吗?如果我们在语句是使用GridLayout(5,5)的话,就会把整个容器分成25个单元

而我们在程序中使用的是GridLayout(3,3),所以它就将整个容器分成了

注意:

这种划分是一种逻辑上的,暗藏式的划分,而不会把格子给划出来。另外,我们这里举的两个例子行、列都相等,其实完全可以不等。

3) for (int x=0xpanel1.add(new JButton(buttonLabels[x]))

这是一个循环结构的程序。我们先看循环语句,循环的初值是“x=0”,继续执行循环的条件语句是“xbuttonLabels.length就是用来请得字符串数组buttonLabels的长度!也就是这个字符串数组中有多少个字符串?我们知道,我们在该数组中定义了9个。

从程序中,我们可以获知,当x=buttonLabels.length时,循环就将结束,应为它不满足条件x别忘了,我们使用buttonLabels[0]表示第一个字符串,buttonLabels[1]表示第二个字符串……,那么最后一个字符串就应该是buttonLabels[buttonLabels.length-1]嘛。

在循环中,我们使用容器提供的add方法,将新定义的按钮部件添加进去。

有时,我们可能想获得象下图所示的布局效果!让各个部件之间存在一些间隙。使用Java的网格布局可以实现吗?

我很高兴地回答你:“可以!”,我们可以使用GridLayout的另一种构造器方法(签名不同)来实现:

public GridLayout (int rows,int cols,int hgap,int vgap)

在这个方法中,可以带上四个整型参数,前两个我们已经很熟悉了,行数与列数。后面则是两个新的参数。

第一个是hgap,其中gap的意思是间隙、空隙的意思,而h则是horizontal(水平)的第一个字母。也就是说,我们可以通过hgap参数设置横向的间隙。

第二个是vgap,v则是vertical(垂直)的第一个字母。也就是说,我们可以通过vgap参数设置纵向的间隙。

自测练习

1)_________________是网格布局管理器。

a.BorderLayout b.GridLayout c.ReseauLayout

d.FlowLayout

利用以下代码回答问题2、3、4、5:

2)这个布局中有__________行?

a.7行 b.5行 c.6行 d.8行

3)这个布局中有__________列?

a.7行 b.5行 c.6行 d.8行

4)这个布局将容器分为_________个部分?

a.48个 b.35个 c.30个 d.40个

5)第5个部件位于__________位置。

a.左上角 b.左下角 c.右上角 d.右下角 e.中间

6)根据以下界面,编写一个程序

图10-12 练习题图

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

7) 如果我们构建一个5*5的网格布局,但只在该容器中加入17个按钮,将会出现什么情况?请编写一个程序,来试一试效果。

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

练习答案

1)b 没什么好解释的,请大家记住!

2)a 第一个参数是行数,因此是7行。

3)b 第二个参数是列数,因此为5列。

4)b 7行5列,其7*5,35个部分嘛。

5)c 第5个部件是第一行的最后一个,当然在右上角嘛。

6)下面是一个实现的程序实例:

源程序:lianxi10_2.java

import java.awt.*

import javax.swing.*

import java.applet.Applet

public class lianxi10_2 extends JApplet

{

String buttonLabels[]={"1","2","3","4","5","6","7",

"8","9","*","0","#"}

public void init()

{

JPanel panel1=(JPanel)getContentPane()

panel1.setLayout(new GridLayout(4,3,10,10))

for (int x=0xpanel1.add(new JButton(buttonLabels[x]))

}

}

7)下面是一个实现的程序实例:

源程序:lianxi10_3.java

import java.awt.*

import javax.swing.*

import java.applet.Applet

public class lianxi10_3 extends JApplet

{

String buttonLabels[]={"No.1","No.2","No.3","No.4","No.5",

"No.6","No.7","No.8","No.9","No.10","No.11","No.12",

"No.13","No.14","No.15","No.16","No.17"}

public void init()

{

JPanel panel1=(JPanel)getContentPane()

panel1.setLayout(new GridLayout(5,5))

for (int x=0xpanel1.add(new JButton(buttonLabels[x]))

}

}

这个程序使用javac编译完后,编写一个包含这个类的HTML页面,再用appletviewer来观察发现运行结果如下图所示:

图10-13 练习答案图

这个输出是不是令你感到十分意外,整个程序根本不按要求分成5列,所以我们从这里得到一个使用网格布局中要十二分注意的一点:“请别忘了将网格填满”。否则程序的输出将不可预料。

一些提示:

如果你真的没有那么多东西来“占领”网格的话,我建议你使用一个空标签来填补这个空白的网格,使得程序的输出如你所愿。使用空标签的方法很容易:

panel1.add(new Label(“”))

从这里,我们也看出了,我们学习过的流布局管理器、边框布局管理器,以及我们刚学习过的网格布局管理器都比较死板,不够高级。

10.3 组合布局

传授新知

正如我们在上一小节结束的时候说的一样,各种布局管理器都有自己的缺点,没有一种能够真正地完全满足我们编写GUI程序时的要求。

而在Java语言中,允许在容器中加入其他容器,这样每个容器可以根据自己的需要采用不同的布局管理器,组合成为一个我们所需要的GUI程序界面。这种方法,我们就称之为组合布局。

注意:

与流布局、边框布局、网格布局不同,组合布局并不是一个新的布局管理器,它是通过结合各种布局管理器的优点,将它们组合地应用在GUI程序界面的开发中。这是一种布局管理的方法。也可以说是一种GUI程序界面的开发技巧。

当我们设计GUI程序界面时,最好先在纸上把它画出来,然后“分块解决”。也就是将能够组合在一起的部件找出来,将它们放在一个容器里,并为它们选择合适的布局管理器。然后把这些容器摆放在一起,就解决了。

设计时还要考虑到窗体大小发生改变的时候,引起的部件形体变化。这方面,请你熟记几个设计技巧:

1) 对于那些要求扁平状的部件,我们应该将它放置在边框布局中的南面或北面;

2) 对于那些要求细高状的部件,我们应该将它放置在边框布局中的东面或西面;

3) 对于那些可以随着窗体改变大小部分,我们可以将它放置在边框布局的中间;

4) 如果我们要求部件保持大小相同,那么,我们就应该采用网格布局。

下面,我们就通过几个实际的例子,来让大家领会和掌握这种设计的思路与方法。

实例说明

我们首先创建一个testCombination.java文件,然后输入以下源程序:

源程序:testCombination.java

import java.awt.*

import javax.swing.*

import java.applet.Applet

public class testCombination1 extends JApplet

{

public void init()

{

Frame frame1=new Frame("testCombination1")

frame1.setLayout(new BorderLayout())

TextArea text1=new TextArea()

frame1.add(text1,BorderLayout.CENTER)

JPanel panel1=(JPanel)getContentPane()

panel1.setLayout(new GridLayout(1,3,10,5))

panel1.add(new JButton("A"))

panel1.add(new JButton("B"))

panel1.add(new JButton("C"))

frame1.add(panel1,BorderLayout.SOUTH)

frame1.pack()

frame1.show()

}

}

然后,我们使用javac编译这个程序,然后编辑一个显示这个Java Applet的HTML页面。最后调用appletviewer来观察这个页面,如下图所示:

图10-14 程序testCombination.java的输出

正如上图所示,程序的输出与以前不同,各个部件不是显示在Appletviewer程序框中,而是显示在另一个窗口中。

这是怎么回事呢?下面我们就一起来看一下这个程序!

传授新知

在以前的程序中,我们一直都是使用容器JPanel,面板。而我们在这个程序中引进了一个新的容器Frame。使用了这个容器后,就会新创建一个窗口。这也就是为什么程序的输出有这么大的变化的原因。

1)Frame frame1=new Frame("testCombination")

这条语句,定义了一个Frame容器frame1,然后使用new操作符调用构造器方法,后面带的参数“testCombination”则是这个Frame的标题。

一些提示:

其实大家能Frame所体现出来的效果是很熟悉的,它等价于Windows中的窗体。而Frame的标题就是窗体的标题。

2) frame1.setLayout(new BorderLayout())

与JPanel容器一样,我们可以调用setLayout方法来设置Frame的布局管理器。在这里,我们将Frame容器frame1的布局管理器设置成为边框布局管理器(也就是我们在10.1小节中学习过的布局管理器)。

3) frame1.add(text1,BorderLayout.CENTER)

紧接着,我们调用frame1的add方法,将文本区部件text1添加到frame1容器中来。注意我们设置了它的位置:BorderLayout.CENTER。

这是因为,我们希望这个文本区能够随着窗体的大小变化而变化。所以适合将其放在在中间位置。

4) panel1.setLayout(new GridLayout(1,3,10,5))

我们又定义了一个JPanel容器panel1,并将其的布局管理器设置为网格布局管理器。并通过指定参数,使得整个panel1被分成1行3列,水平空隙为10的网格。

5) frame1.add(panel1,BorderLayout.SOUTH)

这是组合布局方法最重要的一步,我们将panel1这个容器,加入到了frame1这个容器中去了。并且指定了panel1这个容器在整个frame1中所占的位置:BorderLayout.SOUTH,也就是下边。这样,panel1中包含的三个按钮就会永远(不管窗体大小如何改变)呆在文本区的下边,而且三个按钮的大小会根据窗体大小的改变而改变。

一些提示:

这是因为,panel1中的按钮是用网格布局的。

6) frame1.pack()

frame1.show()

与JPanel不一样,使用Frame容器,不能够直接显示了出来。我们必须调用Frame容器的show方法才能使得Frame显示出来。

而在使用show方法之前,我们还需要使用pack方法将Frame中的内容做一个整合。请记住这里的使用方法。

4 GridBag布局

实例说明

到现在为止,我们已经学习了边框布局、网格布局以及组合布局,现在大家试一试编写一个程序,

怎么样,挺有难度的吧!完成这个GUI得花很多心思去设计组合,十分讨厌,下面我们就使用一个新的布局管理器GridBagLayout来解决这种难题。

首先,输入以下源程序:

源程序:testGridBag.java

import java.awt.*

import javax.swing.*

import java.applet.Applet

public class testGridBag extends JApplet

{

public void init()

{

JPanel panel1=(JPanel)getContentPane()

panel1.setLayout(new GridBagLayout())

GridBagConstraints gbdc=new GridBagConstraints()

gbdc.fill=GridBagConstraints.BOTH

gbdc.weightx=1

gbdc.weighty=1

panel1.add(new JButton("No.1"),gbdc)

panel1.add(new JButton("No.2"),gbdc)

panel1.add(new JButton("No.3"),gbdc)

gbdc.gridwidth=2

gbdc.gridx=0

panel1.add(new JButton("No.4"),gbdc)

gbdc.gridx=2

gbdc.gridwidth=1

gbdc.gridheight=2

panel1.add(new JButton("No.5"),gbdc)

gbdc.gridx=0

gbdc.gridheight=1

panel1.add(new JButton("No.6"),gbdc)

gbdc.gridx=1

panel1.add(new JButton("No.7"),gbdc)

gbdc.gridx=0

gbdc.gridwidth=2

panel1.add(new JButton("No.8"),gbdc)

gbdc.gridx=2

gbdc.gridwidth=1

panel1.add(new JButton("No.9"),gbdc)

}

}

在这个程序中,我们使用了GridBagLayout轻松地完成了这个界面的设计,允分凸现出它的强大。可以这么说,GridBagLayout是Java语言中最强大的布局管理器。

GridBagLayout,从名字上看,就知道它与GridLayout有一定的渊源,是的,GridBagLayout的确与其十分类似,也是使用网格来进行布局管理的。但与GridLayout(网格布局)不同的是,GridBagLayout不像网格布局一相,需要所有的部件的大小、形状相同。而且还可以将某一个部件放在一个固定的位置上。

下面,我们一起来分析一下testGridBag.java程序。

1) panel1.setLayout(new GridBagLayout())

在调用setLayout方法时,指定为GridBagLaoyout,使panel1使用GridBag布局管理。

2) GridBagConstraints gbdc=new GridBagConstraints()

GridBagLayout布局管理器是通过一个GridBagConstraints类来实现神奇的效果的。所以,我们要在使用时先定义一个GridBagConstraints类的对象。在这个程序中,我们定义了一个GridBagConstraints类的对象gbdc。

3) gbdc.fill=GridBagConstraints.BOTH

由于网格单元可能比该单元中的部件大,如果是这样,部件放置在单元格内会有一些多余空间。在默认情况下,部件不会扩张,也就是不会填充这个多余空间。

GridBagConstraints提供了一个fill属性,我们可以通过设置它的值来起到不同的效果。

¨ GridBagConstraints.NONE:不扩张,是默认值;

¨ GridBagConstraints.HORIZONTAL:部件水平扩张,将水平方向的多余空间填满;

¨ GridBagConstraints.VERTICAL:部件垂直扩张,将垂直方向的多余空间填满;

¨ GridBagConstraints.BOTH:部件同时向两个方向扩张,将单元格填满。

4) gbdc.weightx=1

gbdc.weighty=1

weightx和weighty是GridBagConstraints提供的另一对属性。它的取值是整型数,默认值为0。用来设置行(weightx)、列(weighty)的“重量”,如果值为0的话,所有的部件都会紧收在一起,聚集在中央,如图10-17所示。

而如果取值为其它数字,则会根据值来分配空间。

5) panel1.add(new JButton("No.1"),gbdc)

panel1.add(new JButton("No.2"),gbdc)

panel1.add(new JButton("No.3"),gbdc)

在没有任何约束的时候,向gbdc中添加按钮,这时效果与采用网格布局的效果完全一样。一个接着一个地“占领”单元格。

6) gbdc.gridwidth=2

gbdc.gridx=0

panel1.add(new JButton("No.4"),gbdc)

由于第四个按钮(No.4)是宽度是2,在GridBagLayout中,是由gridwidth属性来控制添加进入的部件的宽度的。

我们通过gbdc.gridwidth=2将其设置为2,这样,再添加进入的部件就会变成为2个单元格的宽度。

另外,我们再使用gbdc.gridx=0让其另起一行,从最左边的单元格开始填充。

因此,我们发现第四个按钮被加在了第二行,宽度为2个单元格。

7) gbdc.gridx=2

gbdc.gridwidth=1

gbdc.gridheight=2

panel1.add(new JButton("No.5"),gbdc)

接下来,我们要摆放第五个按钮,这个按钮将从第3个单元开始填充,其宽度为一个单元格,而高度则为两个单元格。

因此,我们首先使用用gbdc.gridx=2,使得下一个添加的部件(第五个按钮)放入第3个单元格(0代表第1个单元格,因此第3个单元格应该是2)。

由于,前面我们已经将gridwidth设置为2了,因此,我们需要使用gbdc.gridwidth=1,将其值设置回1。

最后使用gdbc.gridheight=2,使得添入的部件的单元格纵向跨越两个单元格。

8) gbdc.gridx=0

gbdc.gridheight=1

panel1.add(new JButton("No.6"),gbdc)

我想这一段程序,大家应该都不会再有什么理解上的问题了吧!主要提醒大家注意的是,我们使用gbdc.gridheight=1将单元格纵向跨度改成了默认值1。这是因为我们在前面需要时将其改成了2,所以在此需要将其改回来。

实例说明

为了更好地理解这个强大的GridBagLayout布局管理器,我们再来做一个有趣的实验。首先,我们创建一个testGridBag2.java

源程序:testGridBag2.java

import java.awt.*

import javax.swing.*

import java.applet.Applet

public class testGridBag2 extends JApplet

{

public void init()

{

JPanel panel1=(JPanel)getContentPane()

panel1.setLayout(new GridBagLayout())

GridBagConstraints gbdc=new GridBagConstraints()

panel1.add(new JButton("No.1"),gbdc)

panel1.add(new JButton("No.2"),gbdc)

setSize(300,200)

}

}

然后我们使用鼠标改变一下窗口的大小,看一下,这两个按钮有什么变化?你会惊奇地发现,窗口改变了大小,两个按钮的大小却没有变,而且一直呆在正中央的位置。

一些说明:

在这个程序中,我们使用了一个以前没有用过的语句:setsize(300.200),它的功能是在程序中设置窗口的大小。

现在我们对这个程序做一些修改!将添加两个按钮的两条语句:

panel1.add(new JButton("No.1"),gbdc)

panel1.add(new JButton("No.2"),gbdc)

将它们扩展为:

gbdc.weightx=1

panel1.add(new JButton("No.1"),gbdc)

gbdc.weightx=3

panel1.add(new JButton("No.2"),gbdc)

为什么会得到这个效果呢?我们在程序中添加按钮的程序段前加入一句:

gbdc.fill=GridBagConstraints.HORIZONTAL

再重新编译一下程序,再看看程序的输出有什么变化!

在得到结果之前,自己可以想象一下结果,然后看一下程序的实际输出与你的想法是否相吻合。

我们惊奇地发现,第二个按钮,突然变得十分宽起来(如图10-20所示)。这是因为放置第二个按钮的单元格的宽度是3,而第一个按钮的宽度是1。而且,我们又让第二个按钮横向扩展,因此得到了这样的输出结果。

相信实验做到这里,不须我说,大家也会有一些心得体会了。但是GridBagLayout远不止这一点,大家应该多做试验,才能够在真实的使用环境中有效地掌握GridBagLayout。

微笑的路人
明亮的芝麻
2026-05-08 22:41:47
1、分析业务需求, 理顺业务逻辑;

2, 根据业务需要考虑使用何种容器(JFrame ,Frame ,JWindow..) 需要的数量;

3, 每个容器(窗口)使用组件;

4.组件使用何种布局方式(边界布局,绝对布局,网格布局..),排列在容器(窗口)中;

5.组件中需要响应那些事件, 把事件响应代码写好,然后绑定到组件上(addListener...)

6.调试。

现实的煎蛋
负责的枕头
2026-05-08 22:41:47

import javax.swing.*

import java.awt.*

public class Frame extends JFrame {

public static void main(String[] args) {

new Frame()

}

public Frame() throws HeadlessException {

Container contentPanel = this.getContentPane()

JPanel headerPanel = new JPanel()

headerPanel.setLayout(new FlowLayout())

headerPanel.add(new JLabel("欢迎进入学生成绩管理系统"))

JPanel centerPanel = new JPanel()

centerPanel.setLayout(new GridLayout(2, 2))

centerPanel.add(new JLabel("用户名", JLabel.CENTER))

centerPanel.add(new JTextField())

centerPanel.add(new JLabel("密码", JLabel.CENTER))

centerPanel.add(new JTextField())

JPanel footerPanel = new JPanel()

footerPanel.setLayout(new FlowLayout())

footerPanel.add(new JButton("登录"))

footerPanel.add(new JButton("取消"))

contentPanel.add(headerPanel, BorderLayout.NORTH)

contentPanel.add(centerPanel, BorderLayout.CENTER)

contentPanel.add(footerPanel, BorderLayout.SOUTH)

this.setTitle("Login")

this.setBounds(0, 0, 300, 200)

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)

this.setVisible(true)

}

}

忧伤的香水
魁梧的小鸽子
2026-05-08 22:41:47

准备工作:

1、下载JDK;

2、下载Eclipse;

3、下载相应的EMF、GEF、VE;

开始安装:

1、安装JDK;

这个比较容易,标准的Windows安装程序,下一步,再下一步即可,安装完成后,也不需要重启。

2、安装Eclipse;

Eclipse是绿色软件,不需要安装,只需要解压缩,然后即可运行。

为了说明方便,我把它解压缩到C盘根目录下,得到C:\eclipse目录,运行C:\eclipse\eclipse.exe即可。

注意:下面的安装,需要先关闭eclipse程序。

3、安装EMF、GEF、VE;

对于Eclipse来说,这些都是它的插件,所以,安装方法都是一样的。插件下载地址http://download.eclips.org/ve

A、在C:\eclipse目录下,建立四个子目录:C:\eclipse\emf、C:\eclipse\gef、C:\eclipse\ve、C:\eclipse\links;

B、把下载的EMF、GEF、VE都解压缩到相应的目录中,即:把EMF压缩包解压缩到C:\eclipse\emf中,得到C:\eclipse\emf\eclipse目录,以此类推,完成GEF、VE的解压缩;

C、在C:\eclipse\links目录下,新建一个文本文件,名字可随便取,如:link.txt。

然后在link.txt文件中,加入以下三行文字:

path=emf

path=gef

path=VE

干净的向日葵
忐忑的荷花
2026-05-08 22:41:47
基本有五种

BorderLayout 边界布局管理器

将容器分为东、南、西、北、中五个区域

分别用BorderLayout.SOUTH BorderLayout.NORTH BorderLayout.EAST BorderLayout.WEST BorderLayout.CENTER

FlowLayout 流式布局管理器

按照组件的添加顺序将组件从左到右放置在容器中。允许左对齐、居中对齐、或右对齐

GridLayout网格布局管理器

将容器分割成多行多列 按照组件添加的顺序一次讲组件从左到右放置

GridBagLayout网格包布局管理器

允许组件中各个组件的大小各不相同

CardLayout 卡片布局管理器

将界面看成一些列的卡片,每一个卡片都有一个容器,任何时候只有一张卡片时可见的

构造方法有CradLayout()和CradLayout(int hgap,int vgap)

参数hgap表示卡片和容器的左右边界之间的间隙,参数vgap表示卡片和容器的上下边界之间的间隙

懦弱的乌冬面
苗条的羽毛
2026-05-08 22:41:47

JPanel jp=new JPanel()://定义面板并初始化

Icon iocn=new ImageIcon("C:/My Documents/tupian.jpg")//定义图片并初始化,写上图片的绝对路径

JLabel jl=new JLabel(icon)://把图片放在标签上

jp.add(jl)//往面板上添加标签注意:面板JPanel不能之间添加图片iocn,icon需要放在标签JLabel上,才能在JPanel上显示

import java.awt.event.*

import javax.swing.*

public class MainJFrame extends JFrame{

private ImageJPanel ip

public MainJFrame() {

initial()

}

public void initial()

{

ip=new ImageJPanel()

this.setTitle("Demo")

this.setSize(400,300)

this.setResizable(false)

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)

this.setLocationRelativeTo(this)

Container c=this.getContentPane()

c.setLayout(null)

ip.setBounds(0,0,this.getWidth(),this.getHeight())

c.add(ip)

this.setVisible(true)

}

public static void main(String[] args)

{

new MainJFrame()

}

}

class ImageJPanel extends JPanel

{

private ImageIcon ii

public ImageJPanel()

{

//bk.jpg是指背景图片的名称 ii=new ImageIcon("bk.jpg")

}

//绘制背景图片 public void paintComponent(Graphics g)

{

super.paintComponent(g)

g.drawImage(ii.getImage(),0,0,this)

}

}