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