gpt4 book ai didi

从不同的类调用时 Java repaint() 不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 10:30:23 25 4
gpt4 key购买 nike

我的重绘在同一个类中调用时有效,但在另一个类中则无效。我在其他地方找不到这个问题。我已将我的代码放在下面。谢谢你!该代码用于在带有 2 个 JPanel 的 JFrame 中制作一个计算器,一个显示用户的输入,另一个显示所有按钮。我想调用 repaint,以便 drawString() 方法在用户输入输入时发生变化。

public class Calculator
{
public static void main(String[] args)
{
Calculator c = new Calculator();
}

public Calculator()
{
JFrame frame = new JFrame("Calculator");
frame.setSize(800, 800);
frame.setResizable(false);
Buttons b = new Buttons();
Display d = new Display();
frame.setLayout(new GridLayout(2, 1));
frame.add(d);
frame.add(b);
frame.setVisible(true);
}

public class Buttons extends JPanel implements ActionListener
{
private int z;
public JButton[] buttons;
public Display d;`enter code here`
public String[] values;
public String clickedButton;

public Buttons()
{
setBackground(Color.BLACK);
setLayout(new GridLayout(5, 4));
values = new String[100];
for(int i = 0; i < values.length; i++)
{
values[i] = new String("");
}
addButtons();
}

public void addButtons()
{
Font courier = new Font("Courier", Font.BOLD, 20);
buttons = new JButton[20];

for(int i = 0; i < buttons.length; i++)
{
buttons[i] = new JButton(Integer.toString(i));
buttons[i].setBackground(Color.BLUE);
buttons[i].setForeground(Color.WHITE);
buttons[i].setFont(courier);
buttons[i].setFocusable(false);
buttons[i].addActionListener(this);
buttons[i].setBorder(BorderFactory.createLineBorder(new Color(0, 100, 175, 255)));
add(buttons[i]);
}

buttons[10].setVisible(false);
buttons[10].setEnabled(false);
buttons[11].setVisible(false);
buttons[11].setEnabled(false);

buttons[12].setText("C");
buttons[13].setText("+");
buttons[14].setText("-");
buttons[15].setText("*");
buttons[16].setText("/");

buttons[17].setText("+/-");
buttons[18].setText("^");
buttons[19].setText("=");
}

public void actionPerformed(ActionEvent e)
{
String action = e.getActionCommand();
d = new Display();
for(int i = 0; i < 10; i++)
{
if(action.equals(Integer.toString(i)))
{
values[d.i]+=Integer.toString(i);
System.out.println("should be repainting");
d.repaint();
}
}
}
}

public class Display extends JPanel
{
public Buttons b;
public Font courier;
public int i;

public Display()
{
i = 0;
b = new Buttons();
setBackground(Color.BLACK);
courier = new Font("Courier", Font.BOLD, 50);
}

public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.BLUE);
g.setFont(courier);
g.drawString(b.values[i], 50, 50);
repaint();
}
}
}

最佳答案

您似乎每次都创建一个新的显示并告诉它重新绘制而不是真正的显示。将 Display d 变量作为字段移至 Calculator 类中,并且不要声明新变量。

您将原始 Display 对象创建为局部变量,因此无法从其他地方访问它,因此请让这部分改用类字段:

Display d = new Display();

此外,actionPerformed 中的这一行正在创建一个新实例,应将其删除:

d = new Display();

关于从不同的类调用时 Java repaint() 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50073540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com