Java actionListener未激活paintComponent()

Java actionListener未激活paintComponent(),java,actionlistener,paintcomponent,Java,Actionlistener,Paintcomponent,我目前正在为学校编写一段代码,我被卡住了。所以我试图通过一个JTextField,让用户输入“rektangel”或“cirkel”,然后按下一个按钮。之后,程序应该打印出一个矩形或一个圆形 所以我让一个ActionListener连接到这个按钮,这个按钮反过来激活一个方法来决定用户想要打印什么。然后,我尝试通过创建painter类的实例来访问paintComponent方法。然而,它似乎不起作用,因为它从不打印任何东西 很抱歉,我的描述不好,但我真的迷路了,不知道问题出在哪里,只知道它可能与重

我目前正在为学校编写一段代码,我被卡住了。所以我试图通过一个JTextField,让用户输入“rektangel”或“cirkel”,然后按下一个按钮。之后,程序应该打印出一个矩形或一个圆形

所以我让一个ActionListener连接到这个按钮,这个按钮反过来激活一个方法来决定用户想要打印什么。然后,我尝试通过创建painter类的实例来访问paintComponent方法。然而,它似乎不起作用,因为它从不打印任何东西

很抱歉,我的描述不好,但我真的迷路了,不知道问题出在哪里,只知道它可能与重新绘制()有关;不激活颜料成分

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

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);
        }
    }
}
我很抱歉回答得太晚,但代码如下:

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-Rektangel
String-Cirkel
,但在其他方面,原始代码仍然保持不变

我已经将
mainPanel
的布局设置为两行一列的
GridLayout
,只是为了更好的视觉效果:)
记住向面板中添加必要的组件,如JButton和JTextField,如下所示:
mainPanel.add(registerrabutton)
,以便它们实际出现在面板上

另一件事是,您成功地在JPanel上绘制了形状,但没有将面板添加到任何JFrame。我冒昧地使用以下方法:

JFrame NewFrame = new JFrame("Cirkel");
NewFrame.setVisible(true);
NewFrame.setSize(500, 500);
NewFrame.add(rita);
对于这两种情况,无论用户输入“rektangel”还是“cirkel”


最后,我删除了用于检查输入的
input.matches()
,并将其替换为
input.equalsIgnoreCase()
,它检查输入是否与“rektangel”或“cirkel”相同,输入是否大写(不区分大小写)

您是否可以将其缩进正确,以便于他人帮助您?我可以看到一些问题。首先,当您执行
FigurRitare myForm=newfigurritare()时,必须使用
nullpointerexception
因为您试图在实例化之前调用
JButton
registerrautton
上的
addActionListener()
。是的,很抱歉代码太乱了。我很快会用MCVE更新。