上:Java程序设计复习提纲(上:入门语法) - 孤飞 - 博客园 (cnblogs.com)
基本语法与编译运行
数据类型和关键字
常用语法
数组与字符串
异常处理
中:Java程序设计复习提纲(中:面向对象) - 孤飞 - 博客园 (cnblogs.com)
下:本文
Java图形用户界面(GUI)设计主要是使用Swing和JavaFX这两个库。Swing是早期Java版本中使用的主要库,而JavaFX是后来引入的,提供了更多的功能和更好的性能。
以下是关于Java GUI设计的一些基本知识:
组件(Components):组件是GUI设计的基本元素,比如按钮、文本框、标签、复选框、下拉列表等。每一个组件都有很多属性可以设置,例如大小、位置、颜色等。
容器(Containers):容器是用来包含其他组件或容器的组件。例如,面板(Panel)和框架(Frame)就是两种常用的容器。容器也可以设置布局管理器(Layout Manager),用来控制其包含的组件如何排列。
事件处理(Event Handling):用户与GUI程序的交互主要通过事件(Event)来进行。例如,点击按钮、输入文本、选中复选框等操作都会产生事件。程序需要提供事件处理器(Event Handler)来响应这些事件。
绘图和动画:Java GUI程序可以使用2D绘图API来绘制各种图形(例如线、形状、文本等),并可以使用动画API来创建动画效果。
以下是一个简单的使用Swing库创建GUI的例子:
import javax.swing.JFrame; import javax.swing.JButton; public class SimpleGUI { public static void main(String[] args) { // Create a new frame (a window) JFrame frame = new JFrame("My First GUI"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300, 200); // Create a new button JButton button = new JButton("Click me!"); // Add the button to the frame frame.getContentPane().add(button); // Make the frame visible frame.setVisible(true); } }
在这个例子中,我们创建了一个新的窗口,然后在窗口中添加了一个按钮。当运行这个程序时,你将会看到一个窗口,窗口中有一个可以点击的按钮。
在Java GUI编程中,容器(Container)是一个可以包含其他组件(如按钮、标签、文本框等)和其他容器的组件。以下是Java中主要的容器类:
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
方法设置当关闭窗口时终止程序。JFrame frame = new JFrame("Title"); // create a new frame with the title "Title"
JPanel panel = new JPanel(); // create a new panel
JDialog dialog = new JDialog(frame, "Dialog", true); // create a new modal dialog with the title "Dialog"
JScrollPane scrollPane = new JScrollPane(textArea); // create a new scroll pane that contains a text area
容器的布局可以通过布局管理器(Layout Manager)来管理。布局管理器可以控制容器中的组件如何排列和调整大小。Java提供了几种内置的布局管理器,如FlowLayout、BorderLayout、GridLayout、BoxLayout等。
添加组件到容器通常通过调用容器的add
方法实现。例如,frame.add(button)
将一个按钮添加到一个框架中。
在Java图形用户界面(GUI)编程中,组件(Component)是构成用户界面的基本元素,例如按钮、文本框、标签、菜单、滑块等。下面列出了一些常见的Java GUI组件:
JButton button = new JButton("Click me!");
JLabel label = new JLabel("Hello, World!");
JTextField textField = new JTextField(20); // 20 columns wide
JTextArea textArea = new JTextArea(5, 20); // 5 rows and 20 columns
JCheckBox checkBox = new JCheckBox("Check me");
JRadioButton radioButton = new JRadioButton("Select me");
String[] choices = {"Choice 1", "Choice 2", "Choice 3"}; JComboBox comboBox = new JComboBox(choices);
JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 50, 25); // min: 0, max: 50, initial: 25
JMenuBar menuBar = new JMenuBar(); JMenu menu = new JMenu("Menu"); JMenuItem menuItem = new JMenuItem("Menu Item"); menu.add(menuItem); menuBar.add(menu);
所有的这些组件都是从javax.swing.JComponent
类继承的,这意味着他们都有一些公共的属性和方法,例如背景色、前景色、字体、工具提示文本等。另外,这些组件都可以注册事件监听器,以响应用户的输入(如点击、键入等)。
在Java GUI编程中,布局管理器(Layout Manager)决定了容器中的组件如何定位和调整大小。以下是Java中常见的布局管理器:
FlowLayout flowLayout = new FlowLayout(); container.setLayout(flowLayout);
BorderLayout borderLayout = new BorderLayout(); container.setLayout(borderLayout);
GridLayout gridLayout = new GridLayout(3, 2); // 3 rows and 2 columns container.setLayout(gridLayout);
BoxLayout boxLayout = new BoxLayout(container, BoxLayout.X_AXIS); // horizontal layout container.setLayout(boxLayout);
GridBagLayout gridBagLayout = new GridBagLayout(); container.setLayout(gridBagLayout);
每个容器都有一个默认的布局管理器,例如JFrame和JDialog默认使用BorderLayout,而JPanel和JApplet默认使用FlowLayout。你可以通过调用容器的setLayout
方法更改布局管理器。
布局管理器不是必需的。你可以通过将容器的布局管理器设置为null,然后手动指定每个组件的大小和位置来进行绝对定位。但是这种方法通常不推荐,因为它不能适应窗口大小的变化和不同平台的显示差异。
在Java GUI编程中,事件监听和处理是非常重要的概念。事件是用户与应用程序交互的方式,例如点击按钮、键入文本、移动鼠标等。事件监听器(Event Listener)是一个接口,包含了响应特定事件的方法。当事件发生时,事件源(Event Source,如按钮或文本框)会调用监听器的方法。
以下是Java中常见的事件和对应的监听器:
ActionListener
。button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // handle the button click } });
MouseListener
和MouseMotionListener
。button.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { // handle the mouse click } });
KeyListener
。textField.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { // handle the key press } });
ItemListener
。checkBox.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { // handle the item state change } });
WindowListener
。frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { // handle the window closing } });
注意:MouseAdapter
、KeyAdapter
和WindowAdapter
是MouseListener
、KeyListener
和WindowListener
的适配器类。适配器类是空实现了监听器接口的类,这样你可以只覆盖你感兴趣的方法,而不是所有的方法。例如,如果你只关心鼠标点击,那么你可以只覆盖mouseClicked
方法,而不需要覆盖mouseEntered
、mouseExited
、mousePressed
和mouseReleased
方法。
处理事件的代码通常会改变应用程序的状态或进行某种操作。例如,当用户点击按钮时,你可能会保存数据、打开新窗口或显示消息等。
我们使用上面提到的容器、组件、布局和事件监听处理来实现一个简易加减法计算器
效果:
程序代码:
import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Calculator { public static void main(String[] args) { // 创建一个新的JFrame实例作为主窗口 JFrame frame = new JFrame("Simple Calculator"); // 创建一个新的JPanel实例作为主面板 JPanel panel = new JPanel(); // 设置主面板的布局为GridLayout panel.setLayout(new GridLayout(2, 3, 10, 10)); // 创建组件 JTextField textField1 = new JTextField(10); textField1.setFont(new Font("Arial", Font.PLAIN, 20)); JTextField textField2 = new JTextField(10); textField2.setFont(new Font("Arial", Font.PLAIN, 20)); JButton addButton = new JButton("+"); addButton.setFont(new Font("Arial", Font.PLAIN, 30)); JButton subtractButton = new JButton("-"); subtractButton.setFont(new Font("Arial", Font.PLAIN, 30)); JTextField resultField = new JTextField(10); resultField.setFont(new Font("Arial", Font.PLAIN, 20)); resultField.setEditable(false); // 添加组件到主面板 panel.add(textField1); panel.add(textField2); panel.add(resultField); panel.add(addButton); panel.add(subtractButton); // 添加事件监听器到加号按钮 addButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { int num1 = Integer.parseInt(textField1.getText()); int num2 = Integer.parseInt(textField2.getText()); int sum = num1 + num2; resultField.setText(Integer.toString(sum)); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(frame, "Invalid input. Please enter only integers."); textField1.setText(""); textField2.setText(""); } } }); // 添加事件监听器到减号按钮 subtractButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { int num1 = Integer.parseInt(textField1.getText()); int num2 = Integer.parseInt(textField2.getText()); int diff = num1 - num2; resultField.setText(Integer.toString(diff)); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(frame, "Invalid input. Please enter only integers."); textField1.setText(""); textField2.setText(""); } } }); // 将主面板添加到主窗口 frame.add(panel); // 设置主窗口的大小、位置和关闭操作 frame.setSize(600, 200); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 显示主窗口 frame.setVisible(true); } }