java - JCheckBox,提交选择后创建一个事件并将图形打印到 GUI 框架

标签 java swing jcheckbox

首先包含一个带有文本字段的框架,一个用于提交姓名的框架,一个提交按钮以及眼睛、 Nose 和嘴巴的复选框。单击该按钮时,显示您的脸部,包括脸部下方提交的姓名。如果仅检查眼睛和 Nose ,则设置每个的大小并绘制组件来表示这些特征。

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
    }
}

我如何让我的提交按钮绘制图像,无论头部是什么,以及眼睛、 Nose 或嘴巴或全部等。

更新截至 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();
        }
    });
}

}

最佳答案

当你想画脸时,你需要名字以及是否画眼睛、 Nose 和/或嘴巴。我将为可以使用这些参数构造的 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();
    }
});

关于java - JCheckBox,提交选择后创建一个事件并将图形打印到 GUI 框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40183993/

相关文章:

java - 如果函数引发异常,如何避免返回值?

java - Spring Data Rest 覆盖存储库( Controller 与 AOP)

java - 使用 DnD 创建图像

java - 处理点击任意 Swing 组件

java - java代码中的复选框

java - 我们如何操作被选中的 Jcheckbox 的数量?

java - 如何伪装窃听接口(interface)流量

java - 是否可以让 BitmapFactory.decodeFile() 尊重 EXIF?

java - 在 JTextPane 中取消选择选定的文本

java - JTextField 无法正常工作