Border边框

边框创建与设置

Border border = BorderFactory.createXxxxBorder(...);
jComponent.setBorder(border);//设置边框

BorderFactory中的边框

使用BorderFactory中的静态方法创建边框

  • createEmptyBorder(): 空边框
  • createEmptyBorder(int top, int left, int bottom, int right):

  • createLineBorder(Color color): 线边框。color是线的颜色

  • createLineBorder(Color color, int thickness, boolean rounded): thickness是线宽,rounded是是否有圆角

  • createTitledBorder(Border border, String title, int titleJustification, int titlePosition, Font titleFont, Color titleColor):标题边框。border是要加标题的边框,title是标题内容。titleFont是标题字体,color是标题颜色。

    • titleJustification有以下取值
    • TitledBorder.LEFT
    • TitledBorder.CENTER
    • TitledBorder.RIGHT
    • TitledBorder.LEADING
    • TitledBorder.TRAILING
    • TitledBorder.DEFAULT_JUSTIFICATION (leading)
    • titleposition是标题在边框位置。有以下取值
    • TitledBorder.ABOVE_TOP
    • TitledBorder.TOP(位于顶线上)
    • TitledBorder.BELOW_TOP
    • TitledBorder.ABOVE_BOTTOM
    • TitledBorder.BOTTOM(位于底线上)
    • TitledBorder.BELOW_BOTTOM
    • TitledBorder.DEFAULT_POSITION(顶部)

还有许多其他边框

// 斜面边框
static Border createBevelBorder(...);
// 虚线边框
static Border createDashedBorder(...);
// “浮雕化”边框
static Border createEtchedBorder(...);
// 凹入斜面边缘的边框
static Border createLoweredBevelBorder(...);
// 具有凸出斜面边缘的边框
static Border createRaisedBevelBorder(...);
// 凸起软斜面
static Border createRaisedSoftBevelBorder(...);
// 合成边框
static CompoundBorder createCompoundBorder(...);
// 类似衬边的边框
static MatteBorder createMatteBorder(...);
// 共享斜面边框
static Border createSharedBevel(...)
// 软斜面边框
static Border createSoftBevelBorder(...);
// 画笔边框
static Border createStrokeBorder(...);


学习自

按钮

所有的按钮都继承与AbstractButton。按钮有:普通按钮(JButton)、触发器按钮(JToggleButton)、复选框(JCheckBox)、单选按钮(JRadioButton)、箭头按钮(BasicArrowButton)和菜单项(JMenuItem)等。

方法:

  • void setEnabled(boolean enable): 设置这个按钮是否可用
  • setRolloverEnabled(boolean enable): 设置是否要产生翻转
  • setContentAreaFilled(): 是否要绘制父类内容。设置这个是让按钮周围不会有界限。
  • setFocusPainted(): 时候绘制焦点
  • setBorderPainted(): 是否绘制边框
public class Calculate extends JFrame
{
JButton button;
JToggleButton togglebutton;
JCheckBox checkbox;
JRadioButton radiobutton;
BasicArrowButton arrowbutton;
JMenuItem menuitem;
public Calculate(String title)
{
super(title);
setLayout(new FlowLayout());
button = new JButton("button");
togglebutton = new JToggleButton("togglebutton");
checkbox = new JCheckBox("checkbox");
radiobutton = new JRadioButton("radiobutton");
JPanel panel = new JPanel();
panel.setBorder(new TitledBorder("arrow"));
arrowbutton = new BasicArrowButton(BasicArrowButton.NORTH);
panel.add(arrowbutton);
panel.add(new BasicArrowButton(BasicArrowButton.RIGHT));
menuitem = new JMenuItem("menuitem");
add(button);
add(togglebutton);
add(checkbox);
add(radiobutton);
add(panel);
add(menuitem);
pack();
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setVisible(true);
}

public static void main(String[] args)
{
new Calculate("Calculate");
}
}

注意togglebutton有两种状态,按下和弹出,普通按钮按下就会立刻弹出,但是toggle按下就变成按下状态,需要再按一下才会变成弹出状态。

可以设置选中或者未选中setSelected(boolean)。也可以通过isSelected()查看是否被选中

在按钮中可以显示图标,ImageIcon类表示图标。有以下设置图标的方法:

  • setIcon(Icon icon): 设置有效状态下的图标
  • setRolloverIcon(Icon icon): 设置鼠标移动到对应区域显示图标
  • setPressedIcon(Icon icon): 设置按下按钮时显示的图标
  • setDisabledIcon(Icon icon): 设置无效状态下的图标
  • setBorderPainted(boolean b): 是否绘制边框

监听器

JButton

  • void addActionListener(ActionListener listener)
  • void removeActionListener(ActionListener listener):移除监听器

JRadioButton

  • void addChangeListener(ChangeListener l)//状态改变监听器

JRadioButton/JCheckBox/JtoggleButton

从上面我们可以看出,这三者就是图形有所不同,大致功能还是相同的。

构造方法:

  • JRadioButton(String text, boolean selected): selected确定开始的状态
    例:
public class Calculate extends JFrame
{
private JRadioButton button;
private JRadioButton button2;

public Calculate(String text)
{
button = new JRadioButton("男");
button2 = new JRadioButton("女");
ButtonGroup group = new ButtonGroup();
button.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent actionEvent)
{
if(button.isSelected())
{
System.out.println("button has been selected");
}
else
{
System.out.println("Button hasn't been selected");
}
}
});
button.setSelected(true);
group.add(button);
group.add(button2);
JPanel panel = new JPanel();
panel.add(button);
panel.add(button2);
add(panel);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
pack();
setVisible(true);
}

public static void main(String[] args)
{
new Calculate("Hello");
}
}

这里有个问题,使用actionListener的话只会显示button has been selected.因为点击另外一个按钮时button按钮会自动关闭,而actionListener不检查,只有当按下button时才会输出。

如果用ChangeListener的话当鼠标移动到这两个按钮上面的时候就会输出,点击时又会输出,这样可能会使输出过于庞杂。

按钮组

当有多个单选按钮时,可以把他们加入到一个按钮组中。这个歌时候一次最多只能选择按钮组中一个按钮。

创建:

  • ButtonGroup b = new ButtonGroup();

把按钮添加到按钮组中用add。

JTextField文本框

JTextField与PlainDocument关联,后者保存前者的文档。当用户向文本框中输入文本时,AWT线程会自动调用PlainDocument的insertString()方法,把用户输入的文本存到PlainDocument中。

文本框只能储存一行文本,不能多行。

构造方法:

  • JTextField(String text): 显示默认文本
  • JTextField(int col): 设定首选列数,如果是零,就是默认列数。

方法:

  • String getText(): 获得文本
  • setCaretColor(Color c): 设置光标颜色
  • setSelectionColor(Color c): 设置选中背景颜色
  • setSelectedTextColor(Color c): 设置选中文本颜色
  • setDisabledTextColor(Color c): 设置不可用时文本颜色
  • setHorizontalAlignment(int alignment): 设置文本对齐方式
  • setEditable(boolean b): 设置文本框是否可以编辑
  • boolean isFocusOwner(): 查看当前组件是否拥有焦点
  • setSelectionStart(int selectionStart):设置光标开始位置
  • setSelectionEnd(int selectionEnd): 设置光标结束位置
  • copy(): 复制选中文本
  • cut(): 剪切选中文本
  • paste(): 将复制/剪切得到的文本复制到文本框

监听器

void addFocusListener(FocusListener listener): 焦点事件监听器

textField.getDocument().addDocumentListener(DocumentListener listener):文本框内文本改变监听器

void addKeyListener(KeyListener listener):按键监听器

例:

public class Calculate extends JFrame
{
private JTextField field;
private JTextField log;

public Calculate(String text)
{
super(text);
log = new JTextField();
field = new JTextField(8);
field.setFont(new Font(null, Font.PLAIN, 20));

field.setCaretColor(Color.BLUE);
field.setSelectionColor(Color.BLACK);
field.setSelectedTextColor(Color.GREEN);
field.setDisabledTextColor(Color.RED);

field.setHorizontalAlignment(SwingConstants.RIGHT);

JPanel panel = new JPanel();
JButton button_copy = new JButton("copy");
JButton button_paste = new JButton("paste");
JButton button_cut = new JButton("cut");
JToggleButton button_enabled = new JToggleButton("edit disable");

button_copy.addActionListener(new actioncopy());
button_cut.addActionListener(new actioncut());
button_paste.addActionListener(new actionpaste());
button_enabled.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent actionEvent)
{
if(field.isEditable())
{
button_enabled.setText("edit enable");
field.setEditable(false);
}
else
{
button_enabled.setText("edit disable");
field.setEditable(true);
}
}
});
panel.add(button_copy);
panel.add(button_cut);
panel.add(button_paste);
panel.add(button_enabled);

field.addFocusListener(new FocusAdapter()
{
@Override
public void focusGained(FocusEvent e)
{
super.focusGained(e);
log.setText("your focus is in the text field");
}
});
field.addFocusListener(new FocusAdapter()
{
@Override
public void focusLost(FocusEvent e)
{
super.focusLost(e);
log.setText("yout focus is out of the text field");
}
});

add(panel, BorderLayout.NORTH);
add(log, BorderLayout.SOUTH);
add(field, BorderLayout.CENTER);
setVisible(true);
pack();
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}

public class actioncopy implements ActionListener
{
@Override
public void actionPerformed(ActionEvent actionEvent)
{
field.copy();
}
}

public class actioncut implements ActionListener
{

@Override
public void actionPerformed(ActionEvent actionEvent)
{
field.cut();
}
}

public class actionpaste implements ActionListener
{

@Override
public void actionPerformed(ActionEvent actionEvent)
{
field.paste();
}
}

public static void main(String[] args)
{
new Calculate("Hello");
}
}

JLabel标签

标签主要用于展示文本和图片。

构造方法:

  • JLabel()
  • JLabel(String text, int horizontalAlignment): text是文本,horizontalAlignment是对齐方式
  • JLabel(Icon Image): 图片
  • 上面三种可以组合,也就是说可以同时显示图片和文本

方法:

  • setText(String text)
  • setIcon(Icon icon)

// 设置文本相对于图片的位置(文本默认在图片右边垂直居中)

  • void setHorizontalTextPosition(int textPosition)
  • void setVerticalTextPosition(int textPosition)

// 设置标签内容(在标签内)的对其方式(默认左对齐并垂直居中)

  • void setHorizontalAlignment(int alignment)
  • void setVerticalAlignment(int alignment)
  • setIconTextGap(int gap): 设置文本和图片之间的间隙

构造方法中的图片还可以直接填URL从网络中获取。此外,Icon一般用的是ImageIcon

image实例创建

// 方法一: 通过 java.awt.Toolkit 工具类来读取本地、网络 或 内存中 的 图片(支持 GIF、JPEG 或 PNG)
Image image = Toolkit.getDefaultToolkit().getImage(String filename);
Image image = Toolkit.getDefaultToolkit().getImage(URL url);
Image image = Toolkit.getDefaultToolkit().createImage(byte[] imageData);

// 方法二: 通过 javax.imageio.ImageIO 工具类读取本地、网络 或 内存中 的 图片(BufferedImage 继承自 Image)
BufferedImage bufImage = ImageIO.read(File input);
BufferedImage bufImage = ImageIO.read(URL input);
BufferedImage bufImage = ImageIO.read(InputStream input);

/*
* PS_01: 图片宽高: BufferedImage 可以通过 bufImage.getWidth() 和 bufImage.getHeight() 方法直接获取图片的宽高;
* Image 获取宽高需要另外传入一个 ImageObserver 参数。
*
* PS_02: 图片裁剪: BufferedImage 通过 bufImage.getSubimage(int x, int y, int w, int h) 方法可以截取图片的
* 任意一部分,返回一个新的 BufferedImage 实例。
*
* PS_03: 图片缩放: Image 通过 image.getScaledInstance(int width, int height, int hints) 方法可以对图片进行
* 缩放,返回新的一个 Image 实例。
*/

几乎照搬

例:

public class Calculate extends JFrame
{
private JLabel label ;
public Calculate(String text, String image)
{
JPanel panel = new JPanel();
label = new JLabel(image);
label.setFont(new Font(null, Font.PLAIN, 25));
JLabel label2 = new JLabel();
label2.setIcon(new ImageIcon("D:\\截图\\捕获.PNG"));
label2.setText("only an image");
label2.setHorizontalTextPosition(SwingConstants.CENTER);
label2.setVerticalTextPosition(SwingConstants.BOTTOM);
panel.add(label);
panel.add(label2);
add(panel);
setVisible(true);
pack();
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}

public static void main(String[] args)
{
new Calculate("Hello", "This is an image");
}
}

JPasswordField 密码框

JPasswordField的构造方法和JTextField相同。

方法:

  • char[] getpassword(): 获取输入的密码
  • setEchoChar(char c): 设置默认显示的字符
  • setEditable()
  • setEnabled()

常用的监听器和JTextField相同。

密码框的特点就是输入字符不可见

JTextArea 文本区域

文本区域可以编辑多行文本。

构造方法:

  • JTextArea(String text, int rows, int cols): 默认显示多少行多少列

方法:

  • setLineWrap(boolean b): 设置是否自动换行, 默认是false
  • setWrapStyleWord(boolean word): 设置换行方式,如果是true,就在单词边界换行。如果是false,就在字符边界换行(也就是说到了上限就一定换行)
  • append(String str): 追加字符串到文末
  • replaceRange(String str, int start, int end): 替换文本
  • getLineCount(): 获取行数
  • getLineEndOfOffset(int line): 获取某一行行尾在文中偏移量
  • getLineOfOffset(int line)
  • setCaretColor(Color c)
  • setSelectionColor(Color c)
  • void setMinimum(int min)
  • void setMaximum(int max)
  • void setValue(int n)
  • setSelectedTextColor(Color c)
  • setDisabledTextColor(Color c)

大致方法和监听器和JTextField相同

JComboBox 下拉列表

下拉列表中选项内容由ComboBoxModel 实例来维护。

构造方法:

  • JComboBox(ComboBoxModel model)
  • JComboBox(Object[] items)
  • JComboBox(Vector<?> items)

ComboBoxModel 实例可以直接创建,也可以通过把 数组 或 集合 传递到 JComboBox 中间接创建。

常用方法:

  • setSelectedIndex(int index): 设置选中索引
  • getSelectedIndex(): 获得当前选中的索引
  • Object getSelectedItem(): 获得当前选中的数据项
  • setModel(ComboBoxModel<?> model): 设置当前模型
  • ComboBoxModel<?> getModel(): 获得模型。再通过 model.getElementAt(int index) 和 model.getSize() 获得索引和选项数量
  • setEditable(boolean flag): 设置是否可以编辑,默认false。如果设置成true,那么用户自己可以自行输入值。

监听器:

  • addItemListener(ItemListener listener):选项选中状态改变

comboBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
// 只处理选中的状态
if (e.getStateChange() == ItemEvent.SELECTED) {
System.out.println("选中: " + comboBox.getSelectedIndex() + " = " + comboBox.getSelectedItem());
}
}
});

JList 列表框

列表框和下拉列表不同之处在于列表框一次把所有选项都显示并且可以多选(按ctrl),而下拉列表一次只能选择一个。同样内容有ListModel维护。

构造方法大致和JComboBox相同

方法:

  • setListData(Object[] listData): 设置列表元素
  • setListData(Vector<?> listData)
  • setModel(ListModel<?> model)
  • setSelectionMode(int selectionMode):设置选择模式,有三种模式,单选,可间断多选,可连续多选。ListSelectionModel.MULTIPLE_INTERVAL_SELECTION,等。
  • setSelectedIndex(int index): 设置某个选项被选中
  • setSelectedIndices(int[] indices)
  • getSelectedIndex(): 获得第一个被选中的索引
  • int[] getSelectedIndices(): 获得所有被选中的索引
  • setForeground(Color fg): 未选中时字体颜色
  • setSelectionForeground(Color selectionForeground):选中选项字体颜色
  • setSelectionBackground(Color selectionBackground):选中条颜色

监听器: addListSelectionListener(ListSelectionListener listener)。选项选中状态改变监听器

JPrograssBar 进度条

当进度未知的时候,可以设置成不确定模式,不确定模式下也会持续显示动画。当确定就可以转换成确定模式。

构造方法:

  • JPrograssBar(int orient, int min, int max): 进度条当前值,最大值,最小值。这些参量可以减少

  • void setMinimum(int min)

  • void setMaximum(int max)
  • void setValue(int n):设置当前进度值
  • getValue()
  • getPercentComplete(): 获得当前进度百分比
  • setStringPainted(boolean b): 是否以百分比显示文本
  • setIndeterminate(boolean newValue): 是否设置成不确定模式
  • setOrientation(int newOrientation): SwingConstants.VERTICAL 或 SwingConstants.HORIZONTAL
  • setMajorTickSpacing(int n): 设置主刻度线间隔
  • setMinorTickSpacing(int n): 设置主标记线内次标记线间隔
  • setPaintTicks(boolean b): 是否绘制刻度线
  • setInverted(boolean b): 是否让刻度值从大到小
  • setSnapToTicks(boolean b): 是否让滑块对齐刻度。true滑块只能取刻度值
  • setLabelTable(Dictionary labels):绘制特定的标签代替刻度值
  • setPaintTrack(boolean b): 是否绘制滑道

监听器:addChangeListener(ChangeListener l): 进度改变监听器

例:

public class Calculate extends JFrame
{
public Calculate(String text)
{
super(text);
JProgressBar progressBar = new JProgressBar(0, 100);
progressBar.setValue(0);
progressBar.setStringPainted(true);
progressBar.setIndeterminate(false);
progressBar.setOrientation(SwingConstants.HORIZONTAL);
Timer timer = new Timer(true);
TimerTask task = new TimerTask()
{
@Override
public void run()
{
progressBar.setValue(progressBar.getValue() + 1);
}
};
timer.schedule(task, 0, 1000);
add(progressBar);
setVisible(true);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
pack();
}

public static void main(String[] args)
{
new Calculate("Hello");
}
}

这里就可以解释为什么进度条为什么忽快忽慢的了。当某一部分任务完成的时候就会设置进度条向前进。

JSlider

通过滑块来选择不同的值。当鼠标焦点移到滑块上时,也可以通过上下左右移动滑块。

构造方法 :

  • JSlider(int orientation): 滑块方向,有SwingConstants.HORIZONAL和SwingConstants.VERTICAL.
  • JSlider(int min, int max): 滑块初始值可以是min到max中间任意一个值。
  • JSlider(int orientation, int min, int max, int value)

方法:

  • void setMinimum(int min)
  • void setMaximum(int max)
  • void setValue(int n)
  • setMajorTickSpacing(int n): 设置主刻度线间隔
  • setMinorTickSpacing(int n): 设置主标记线内次标记线间隔
  • setPaintTicks(boolean b): 是否绘制刻度线
  • setPaintLabels(boolean b): 是否绘制标签
  • setInverted(boolean b): 是否让刻度值从大到小
  • setSnapToTicks(boolean b): 是否让滑块对齐刻度。true滑块只能取刻度值
  • setLabelTable(Dictionary labels):绘制特定的标签代替刻度值。Integer是刻度值,JComponent可以使JLabel等。
  • setPaintTrack(boolean b): 是否绘制滑道
  • setOrientation(int orientation): 方向

监听器:addChangeListener(ChangeListener l): 滑道值改变监听

public class Calculate extends JFrame
{
public Calculate(String text)
{
super(text);
JTextField textField = new JTextField();
JSlider slider = new JSlider(0, 20);

slider.setMajorTickSpacing(5);
slider.setMajorTickSpacing(1);
slider.setOrientation(SwingConstants.HORIZONTAL);
slider.setPaintLabels(true);
slider.setPaintTrack(true);
slider.setPaintTicks(true);
slider.setSnapToTicks(true);
Hashtable<Integer, JComponent> hashtable = new Hashtable<Integer, JComponent>();
hashtable.put(0, new JLabel("Start")); // 0 刻度位置,显示 "Start"
hashtable.put(10, new JLabel("Middle")); // 10 刻度位置,显示 "Middle"
hashtable.put(20, new JLabel("End")); // 20 刻度位置,显示 "End"
slider.setLabelTable(hashtable);
slider.addChangeListener(new ChangeListener()
{
@Override
public void stateChanged(ChangeEvent changeEvent)
{
textField.setText("now is " + slider.getValue());
}
});

add(slider);
add(textField, BorderLayout.SOUTH);

setVisible(true);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
pack();
}

public static void main(String[] args)
{
new Calculate("Hello");
}
}

Robot 模拟鼠标,键盘输入

这个类主要是为了方便自动测试

构造方法:

  • Robot(GraphicsDevice screen): 给指定屏幕创建一个对象
  • Robot(): 给默认屏幕创建一个对象

方法:

  • mouseMove(int x, int y): 把鼠标移动到某个位置
  • mousePress(int buttons): 按下某个键。有InputEvent.BUTTON1_MASK (鼠标左键)和InputEvent.BUTTON2_MASK (鼠标中键)和 InputEvent.BUTTON3_MASK (鼠标右键)
  • mouseRelease(int buttons)
  • mouseWheel(int wheelAmt):旋转滚轮

键盘输入:

  • keyPress(int keycode): keycode定义在KeyEvent.VK_xxx中
  • keyRelease(int keycode)

屏幕相关:

  • Color getPixelColor(int x, int y): 获得像素颜色
  • BufferedImage createScreenCapture(Rectangle screenRect): 截屏

控制:

  • delay(int ms): 睡眠指定时间
  • waitForIdle(): 在当前队列中时间完成之前一直等待
  • setAutoWaitForIdle(boolean isOn): 生成一个事件之后是否自动调用waitForIdle
  • boolean isAutoWaitForIdle(): 设置为true,按次序执行
  • setAutoDelay(int ms): 每个事件完成后自动等待ms秒。
  • int getAutoDelay()
一般测试步骤
public class Main {

public static void main(String[] args) throws AWTException {
// 创建 Robot 实例
Robot robot = new Robot();

// 执行完一个事件后再执行下一个
robot.setAutoWaitForIdle(true);

// 移动鼠标到指定屏幕坐标
robot.mouseMove(100, 100);

// 按下鼠标左键
robot.mousePress(InputEvent.BUTTON1_MASK);

// 延时100毫秒
robot.delay(100);

// 释放鼠标左键(按下后必须要释放, 一次点击操作包含了按下和释放)
robot.mouseRelease(InputEvent.BUTTON1_MASK);
}

}