paintComponent()未被actionListener激活

时间:2018-04-05 11:18:31

标签: java actionlistener paintcomponent

我目前正在为学校编写一段代码而且我严重陷入困境。所以我想要做的是通过一个JTextField让用户输入" rektangel"或者" cirkel"然后按一下按钮。之后,该程序应打印出矩形或圆形。

所以我得到了一个连接到按钮的ActionListener,它又激活了一个决定用户想要打印的方法。那么我已经尝试通过创建我所拥有的画家类的实例来访问paintComponent方法。但是,它似乎无法工作,因为它从不打印任何东西。

很抱歉我的描述不好,但是我很失落,并且真的不知道问题可能在哪里,除非它可能与repaint()有关;没有激活paintCompontent。

这是我的代码,所以如果有人能帮我找到问题,我将非常感激。

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; 
public class FigurRitare {
public String Figur = " ";
public Boolean activator = false;
public int draw = 0;
private JPanel mainPanel;
private JButton registreraButton;
private JTextField textField1;
private JPanel DrawingBord;

public FigurRitare() {
    registreraButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            String inputString = textField1.getText();
            decider(inputString);
        }
    });
}

public static void main(String[] args) {
    //Skapa ditt fönster
    JFrame frame = new JFrame("Hello World!");
    //Tala om att du vill kunna stänga ditt förnster med krysset i högra hörnet
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //Ange storleken på ditt fönster och att det ska vara fast
    frame.setSize(500, 600);
    frame.setResizable(false);
    //Positionera ditt fönster i mitten av skärmen
    frame.setLocationRelativeTo(null);

    //Skapa en instans av din den här klassen som hanterar din panel
    FigurRitare myForm = new FigurRitare();
    //Lägg in din panel i programfönstret
    frame.setContentPane(myForm.mainPanel);
    //Visa programfönstret på skärmen
    frame.setVisible(true);

}

public void decider(String input) {
    ritPanel rita = new ritPanel();
    String Cirkel = "cirkel";
    String Rektangel = "rektangel";
    if (input.matches(Cirkel)) {
        rita.whatToDraw(1);
        textField1.setText("");
        textField1.requestFocusInWindow();
    } else if (input.matches(Rektangel)) {
        rita.whatToDraw(2);
        Figur = Rektangel;
        textField1.setText("");
        textField1.requestFocusInWindow();
    } else {
        JOptionPane.showMessageDialog(mainPanel, "Vänligen ange antingen cirkel eller rektangel i rutan ovanför");
        textField1.setText("");
        textField1.requestFocusInWindow();
    }
}

private void createUIComponents() {
    // TODO: place custom component creation code here
    DrawingBord = new ritPanel();
}

class ritPanel extends JPanel {

    public void whatToDraw(int toDraw) {
        draw = toDraw;
        repaint();
    }

    @Override
    public void paintComponent(Graphics grafik) {
        super.paintComponent(grafik);
        if (draw == 2) {
            grafik.fillRect(100, 100, 100, 100);
        }
        if (draw == 1) {
            grafik.fillOval(100, 100, 100, 100);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我为迟到的答案道歉,但这里是代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; 
public class FigurRitare
{
    public String Figur = " ";
    public Boolean activator = false;
    public int draw = 0;
    private JPanel mainPanel;
    private JButton registreraButton;
    private JTextField textField1;
    private JPanel DrawingBord;

    public FigurRitare() {
        registreraButton = new JButton("Submit");
        mainPanel = new JPanel();
        textField1 = new JTextField();

        mainPanel.setLayout(new GridLayout(2, 1));

        registreraButton.addActionListener(new ActionListener()
            {
                @Override
                public void actionPerformed(ActionEvent e) {
                    String inputString = textField1.getText();
                    decider(inputString);
                }
            });

        mainPanel.add(registreraButton);
        mainPanel.add(textField1);
    }

    public static void main()
    {
        //Skapa ditt fönster
        JFrame frame = new JFrame("Hello World!");
        //Tala om att du vill kunna stänga ditt förnster med krysset i högra hörnet
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //Ange storleken på ditt fönster och att det ska vara fast
        frame.setSize(500, 600);
        frame.setResizable(false);
        //Positionera ditt fönster i mitten av skärmen
        frame.setLocationRelativeTo(null);

        //Skapa en instans av din den här klassen som hanterar din panel
        FigurRitare myForm = new FigurRitare();
        frame.setLayout(null);
        //Lägg in din panel i programfönstret
        frame.setContentPane(myForm.mainPanel);
        //Visa programfönstret på skärmen
        frame.setVisible(true);
    }

    public void decider(String input)
    {
        ritPanel rita = new ritPanel();
        if (input.equalsIgnoreCase("Cirkel")) {
            JFrame NewFrame = new JFrame("Cirkel");
            NewFrame.setVisible(true);
            NewFrame.setSize(500, 500);
            NewFrame.add(rita);
            rita.whatToDraw(1);
            textField1.setText("");
            textField1.requestFocusInWindow();
        } else if (input.equalsIgnoreCase("Rektangel")) {
            JFrame NewFrame = new JFrame("Rektangel");
            NewFrame.setVisible(true);
            NewFrame.setSize(500, 500);
            NewFrame.add(rita);
            rita.whatToDraw(2);
            textField1.setText("");
            textField1.requestFocusInWindow();
        } else {
            JOptionPane.showMessageDialog(mainPanel, "Vänligen ange antingen cirkel eller rektangel i rutan ovanför");
            textField1.setText("");
            textField1.requestFocusInWindow();
        }
    }

    private void createUIComponents() {
        // TODO: place custom component creation code here
        DrawingBord = new ritPanel();
    }

    class ritPanel extends JPanel {

        public void whatToDraw(int toDraw) {
            draw = toDraw;
            repaint();
        }

        @Override
        public void paintComponent(Graphics grafik) {
            super.paintComponent(grafik);
            if (draw == 2) {
                grafik.fillRect(100, 100, 100, 100);
            }
            if (draw == 1) {
                grafik.fillOval(100, 100, 100, 100);
            }
        }
    }
}

如评论中所述,如果您的代码按原样执行,则会抛出NullPointerException。为避免这种情况,您应该在构造函数中初始化所有成员变量,此处为FigureRitare()

我删除了一些不必要的变量,例如String RektangelString Cirkel,但原始代码仍然保留。

我已将mainPanel的布局设置为GridLayout,其中包含两行一列,以获得更好的视觉吸引力:) 请记住将必要的组件(如JButton和JTextField)添加到面板中,如下所示:mainPanel.add(registreraButton),以便它们实际上在面板上显示

另一件事是你成功地在JPanel上绘制了形状,但你没有将面板添加到任何JFrame 。我通过使用:

冒昧地这样做
JFrame NewFrame = new JFrame("Cirkel");
NewFrame.setVisible(true);
NewFrame.setSize(500, 500);
NewFrame.add(rita);

对于这两种情况,用户是否进入了“rektangel”。或者' cirkel'。

最后,我删除了您用来检查输入的input.matches(),并将其替换为input.equalsIgnoreCase(),检查输入是否与" rektangel&#相同34;或" cirkel",输入是否为大写字母(不区分大小写)