gpt4 book ai didi

java - JButton 的 ActionListener 正在响应,但代码显然没有被执行,但是当我直接调用方法时,它却被执行了。非常奇怪的行为?

转载 作者:行者123 更新时间:2023-12-02 05:22:41 27 4
gpt4 key购买 nike

当我添加 ActionListener 并将代码放入调用方法的 actionPerformed 中时,该方法被调用得很好,但其中的代码应该是这样的动态添加各种​​Swing组件,似乎没有响应。然而,当我在 ActionListener 外部添加该行时,会运行相同的代码,并且会很好地添加组件。这很奇怪,我不确定问题是什么。

当我在操作执行方法中添加类似 System.out.println 语句来添加设备时,显然正在调用它,但没有任何内容添加到 JPanel。当我将 System.out.println 放入 addAppliance() 方法中时,它也可以正常调用。就像我说的,这是一个非常奇怪的问题。这是到目前为止我的整个程序:

package Main;    
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

@SuppressWarnings("serial")
public class ElectricPanel extends JPanel
{
private static final int WIDTH = 360;
private static final int HEIGHT = 600;
private ArrayList<JTextField> description;
private ArrayList<JTextField> volts;
private ArrayList<JTextField> current;
private ArrayList<JTextField> power;
private JButton addButton;
private JButton subtractButton;
private JLabel[] labels;
private int numOfAppliances;
public ElectricPanel()
{
setPreferredSize(new Dimension(WIDTH, HEIGHT));
setFocusable(true);
requestFocus();
setLayout(null);
description = new ArrayList<JTextField>();
volts = new ArrayList<JTextField>();
current = new ArrayList<JTextField>();
power = new ArrayList<JTextField>();
labels = new JLabel[]{new JLabel("Description"),
new JLabel("Volts"),
new JLabel("Current"),
new JLabel("Power")};
Dimension size = labels[0].getPreferredSize();
labels[0].setBounds(10, 10, size.width, size.height);
size = labels[1].getPreferredSize();
labels[1].setBounds(125, 10, size.width, size.height);
size = labels[2].getPreferredSize();
labels[2].setBounds(185, 10, size.width, size.height);
size = labels[3].getPreferredSize();
labels[3].setBounds(245, 10, size.width, size.height);
for (int i = 0; i < 4; i++)
{
add(labels[i]);
}
numOfAppliances = 0;
addAppliance();
setupAddAndSubtractButtons();
}
private void setupAddAndSubtractButtons()
{
Insets insets = new Insets(0, 0, 0, 0);
addButton = new JButton("+");
subtractButton = new JButton("-");
addButton.setBounds(305, 30, 24, 18);
subtractButton.setBounds(305, 50, 24, 18);
subtractButton.setVisible(false);
addButton.setMargin(insets);
subtractButton.setMargin(insets);
addButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
addAppliance();
}
});
subtractButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent arg0)
{
subtractAppliance();
}
});
add(addButton);
add(subtractButton);
addAppliance();
}
private void tryToAdd()
{
addAppliance();
}
private void addAppliance()
{
description.add(new JTextField(10));
volts.add(new JTextField(5));
current.add(new JTextField(5));
power.add(new JTextField(5));

Dimension size = description.get(numOfAppliances).getPreferredSize();
description.get(numOfAppliances).setBounds(10, 30 + 20 * numOfAppliances, size.width, size.height);
size = volts.get(numOfAppliances).getPreferredSize();
volts.get(numOfAppliances).setBounds(125, 30 + 20 * numOfAppliances, size.width, size.height);
size = current.get(numOfAppliances).getPreferredSize();
current.get(numOfAppliances).setBounds(185, 30 + 20 * numOfAppliances, size.width, size.height);
size = power.get(numOfAppliances).getPreferredSize();
power.get(numOfAppliances).setBounds(245, 30 + 20 * numOfAppliances, size.width, size.height);

add(description.get(numOfAppliances));
add(volts.get(numOfAppliances));
add(current.get(numOfAppliances));
add(power.get(numOfAppliances));

numOfAppliances++;
}
private void subtractAppliance()
{
int index = numOfAppliances - 1;
description.remove(index);
volts.remove(index);
current.remove(index);
power.remove(index);
}
}

感谢任何和所有的帮助和建议!

最佳答案

如果在单击按钮后调整窗口大小(当然,如果它可以调整大小),您会注意到按钮单击正在生效。发生的情况是您正在添加组件,但没有重新绘制面板。只需在 actionPerformed() 方法中添加一个 repaint() 调用,您的更改就会显示出来。

这些方法在操作监听器之外工作的原因是方法调用是在首次绘制面板之前发生的。然而,当方法调用位于操作监听器内部时,一旦您单击按钮,在绘制面板后,它们就会被执行。

除此之外,您绝对不应该使用空布局,这将使您的 GUI 仅限于您正在使用的计算机。另外,请阅读 Java Swing .

关于java - JButton 的 ActionListener 正在响应,但代码显然没有被执行,但是当我直接调用方法时,它却被执行了。非常奇怪的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26372726/

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