首先包括一个带有文本字段的框架,一个用于提交名称,一个提交按钮以及用于眼睛,鼻子和嘴巴的复选框。单击该按钮时,显示您的面部,包括面部下方的已提交名称。如果仅检查眼睛和鼻子,则为每个设置大小并绘制组件以表示这些特征。
import java.awt.EventQueue;
import javax.swing.JFrame;
import java.awt.FlowLayout;
import javax.swing.JCheckBox; import javax.swing.JTextArea;
import javax.swing.JTextField; import java.awt.Color;
import java.awt.Graphics; import java.awt.SystemColor;
import javax.swing.JButton; import javax.swing.SwingConstants;
import java.awt.Font; import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JLabel;import javax.swing.JSplitPane;
import java.awt.Canvas;
import java.awt.GridLayout;import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.BoxLayout;
public class FACE extends JFrame {
private JFrame frame;
private JTextField textField;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
FACE window = new FACE();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}});
}
public FACE() {
initialize();
}
//Initialize the contents of the frame & set layout, meets requirement 5.5,
//Use layout managers to arrange user-interface components in a container
//Requirement 5.2 Add buttons, text fields, and other components to a frame window
private void initialize() {
FaceGraphic component = new FaceGraphic(rootPaneCheckingEnabled, rootPaneCheckingEnabled, rootPaneCheckingEnabled);
frame = new JFrame();
frame.setTitle("Face O Matic");
frame.setBounds(100, 100, 352, 310);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTextArea txtrName = new JTextArea();
txtrName.setBounds(69, 5, 51, 26);
txtrName.setFont(new Font("Comic Sans MS", Font.PLAIN, 15));
txtrName.setEditable(false);
txtrName.setBackground(SystemColor.control);
txtrName.setText("Name :");
JLabel label = new JLabel("");
label.setBounds(125, 18, 0, 0);
textField = new JTextField();
textField.setBounds(130, 8, 126, 20);
textField.setColumns(15);
JLabel lblPlease = new JLabel("Please choose from the following to create a face!");
lblPlease.setBounds(5, 36, 305, 19);
lblPlease.setFont(new Font("Comic Sans MS", Font.PLAIN, 13));
// create check boxes
JCheckBox chckbxEyes = new JCheckBox("Eyes");
chckbxEyes.setBounds(17, 76, 51, 27);
chckbxEyes.setFont(new Font("Comic Sans MS", Font.PLAIN, 12));
chckbxEyes.setSelected(false);
JCheckBox chckbxNose = new JCheckBox("Nose");
chckbxNose.setBounds(69, 76, 53, 27);
chckbxNose.setFont(new Font("Comic Sans MS", Font.PLAIN, 12));
chckbxNose.setSelected(false);
JCheckBox chckbxMouth = new JCheckBox("Mouth");
chckbxMouth.setBounds(130, 76, 59, 27);
chckbxMouth.setFont(new Font("Comic Sans MS", Font.PLAIN, 12));
chckbxMouth.setSelected(false);
// label that states "Nice face" and than name once user hits submit
JLabel lblNiceFace = new JLabel("Nice face");
lblNiceFace.setFont(new Font("Comic Sans MS", Font.PLAIN, 13));
lblNiceFace.setBounds(177, 240, 133, 20);
frame.getContentPane().add(lblNiceFace);
JButton btnSubmit = new JButton("Submit");
btnSubmit.setBounds(220, 75, 90, 27);
btnSubmit.addActionListener(new ActionListener() {
// Handle events that are generated by buttons, meets
// Requirement 5.3
public void actionPerformed(ActionEvent event) {
// print name to niceFace label from textField once user inputs and hits submit
String name = textField.getText();
lblNiceFace.setText("Nice face " + name + "!");
}
});
//add button, labels, check boxes, etc.. to contentPane
btnSubmit.setFont(new Font("Comic Sans MS", Font.PLAIN, 13));
frame.getContentPane().setLayout(null);
frame.getContentPane().add(txtrName);
frame.getContentPane().add(textField);
frame.getContentPane().add(lblPlease);
frame.getContentPane().add(chckbxEyes);
frame.getContentPane().add(chckbxNose);
frame.getContentPane().add(chckbxMouth);
frame.getContentPane().add(btnSubmit);
frame.getContentPane().add(component);
}
}
你好,我是GUI的新手,这是我到目前为止所做的。我遇到的问题是能够连接并创建一个事件监听器到我的复选框,一旦我点击提交,创建一个笑脸的图形出现在给定的坐标;这就是我对面部图形课的要求。
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
public class FaceGraphic extends JPanel {
private boolean hasEyes;
private boolean hasNose;
private boolean hasMouth;
public FaceGraphic(boolean hasEyes, boolean hasNose, boolean hasMouth) {
setParameters(hasEyes, hasNose, hasMouth);
}
public void setParameters(boolean hasEyes, boolean hasNose, boolean hasMouth) {
this.hasEyes = hasEyes;
this.hasNose = hasNose;
this.hasMouth = hasMouth;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.yellow);
g.fillOval(100, 100, 100, 100); // head
g.setColor(Color.black);
if (hasEyes) {
g.fillOval(120, 125, 20, 20); // left eye
g.fillOval(160, 125, 20, 20); // right eye
}
if (hasNose)
g.drawLine(150, 165, 150, 150); // nose
if (hasMouth)
g.drawArc(120, 130, 60, 60, 0, -180); // mouth
}
}
如何让我的提交按钮绘制图像,无论头部,眼睛,鼻子或嘴巴或所有等等。
自2016年10月27日起更新
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CheckBoxDemo extends JPanel
implements ItemListener {
JCheckBox eyes;
JCheckBox nose;
JCheckBox mouth;
StringBuffer choices;
private JTextField textField;
public CheckBoxDemo() {
choices = new StringBuffer("cght");
setLayout(null);
nose = new JCheckBox("Nose");
nose.setBounds(92, 57, 69, 23);
add(nose);
//nose.setMnemonic(KeyEvent.VK_G);
nose.setSelected(false);
nose.addItemListener(this);
mouth = new JCheckBox("Mouth");
mouth.setBounds(186, 57, 69, 23);
add(mouth);
//mouth.setMnemonic(KeyEvent.VK_H);
mouth.setSelected(false);
mouth.addItemListener(this);
//Create the check boxes.
eyes = new JCheckBox("Eyes");
eyes.setBounds(6, 57, 69, 23);
add(eyes);
//eyes.setMnemonic(KeyEvent.VK_C);
eyes.setSelected(false);
eyes.addItemListener(this);
JLabel lblNewLabel = new JLabel("Please choose from the following to create a face!");
lblNewLabel.setBounds(6, 11, 312, 14);
add(lblNewLabel);
JLabel lblPleaseEnterYour = new JLabel("Please enter your name: ");
lblPleaseEnterYour.setBounds(6, 36, 155, 14);
add(lblPleaseEnterYour);
textField = new JTextField();
textField.setBounds(153, 30, 100, 20);
add(textField);
textField.setColumns(10);
JLabel lblNiceFace = new JLabel("");
lblNiceFace.setFont(new Font("Tahoma", Font.PLAIN, 13));
lblNiceFace.setBounds(153, 240, 133, 20);
add(lblNiceFace);
JButton btnSubmit = new JButton("Submit");
btnSubmit.setBounds(28, 240, 89, 23);
btnSubmit.addActionListener(new ActionListener() {
// Handle events that are generated by buttons, meets
// Requirement 5.3
public void actionPerformed(ActionEvent event) {
// print name to niceFace label from textField once user inputs and hits submit
String name = textField.getText();
lblNiceFace.setText("Nice face " + name + "!");
}});
add(btnSubmit);
}
/** Listens to the check boxes. */
public void itemStateChanged(ItemEvent e) {
int index = 0;
char c = '-';
Object source = e.getItemSelectable();
if (source == eyes) {
index = 0;
c = 'c';
} else if (source == nose) {
index = 1;
c = 'g';
} else if (source == mouth) {
index = 2;
c = 'h';
}
//Now that we know which button was pushed, find out
//whether it was selected or not.
if (e.getStateChange() == ItemEvent.DESELECTED) {
c = '-';
}
//Apply the change to the string.
choices.setCharAt(index, c);
repaint();
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.yellow);
g.fillOval(100, 100, 100, 100); // head
g.setColor(Color.black);
if (eyes.isSelected()) {
g.fillOval(120, 125, 20, 20); // left eye
g.fillOval(160, 125, 20, 20); // right eye
}
if (nose.isSelected())
g.drawLine(150, 165, 150, 150); // nose
if (mouth.isSelected())
g.drawArc(120, 130, 60, 60, 0, -180); // mouth
}
public static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("FaceOMatic");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setPreferredSize(new Dimension (350, 325));
//Create and set up the content pane.
JComponent newContentPane = new CheckBoxDemo();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
答案 0 :(得分:2)
当你想画脸时,你需要这个名字以及是否画眼睛,鼻子和/或嘴巴。我将为可以使用这些参数构造的FaceGraphic
创建一个单独的类。您可以使用drawString
方法将名称添加到图形中。
例如:
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
public class FaceGraphic extends JPanel {
private String name;
private boolean hasEyes;
private boolean hasNose;
private boolean hasMouth;
public FaceGraphic(String name, boolean hasEyes, boolean hasNose, boolean hasMouth) {
setParameters(name, hasEyes, hasNose, hasMouth);
}
public void setParameters(String name, boolean hasEyes, boolean hasNose, boolean hasMouth) {
this.name = name;
this.hasEyes = hasEyes;
this.hasNose = hasNose;
this.hasMouth = hasMouth;
}
@Override
protected void paintComponent(Graphics graphics) {
super.paintComponent(graphics);
graphics.setColor(Color.yellow);
// head
graphics.fillOval(100, 100, 100, 100);
graphics.setColor(Color.black);
// name
graphics.drawString(name, 150, 50);
if (hasEyes) {
// left eye
graphics.fillOval(120, 125, 20, 20);
// right eye
graphics.fillOval(160, 125, 20, 20);
}
if (hasNose)
// nose
graphics.drawLine(150, 165, 150, 150);
if (hasMouth)
// mouth
graphics.drawArc(120, 130, 60, 60, 0, -180);
}
}
修改:调用setParameters
您可以在提交按钮的事件处理程序中添加对setParameters
方法的调用:
JButton btnSubmit = new JButton("Submit");
btnSubmit.setBounds(220, 75, 90, 27);
btnSubmit.addActionListener(new ActionListener() {
// Handle events that are generated by buttons, meets
// Requirement 5.3
public void actionPerformed(ActionEvent event) {
// print name to niceFace label from textField once user inputs and hits submit
String name = textField.getText();
lblNiceFace.setText("Nice face " + name + "!");
component.setParameters(name, chckbxEyes.isSelected(),
chckbxNose.isSelected(), chckbxMouth.isSelected());
component.repaint();
}
});