gpt4 book ai didi

java - JPanel radioButton 不使用计时器更改文本但单击时

转载 作者:行者123 更新时间:2023-11-30 08:08:06 26 4
gpt4 key购买 nike

经过 1 小时的谷歌搜索和 4 小时的调试都没有得到答案,我不得不问:

我尝试更改每个计时器的两个单选按钮的文本,但它不会以某种方式更改,即使您单击它们时也会更改。

public class JTestinf extends JPanel implements ActionListener {

JRadioButton one = new JRadioButton();
JRadioButton two = new JRadioButton();
int i = 0;

public static void main(String[] args) {
JFrame window = new JFrame("RadioButtonDemo");
JComponent ContentPane = new JTestinf();

window.setContentPane(ContentPane);
window.pack();
window.setVisible(true);
Timer time = new Timer(500, new JTestinf());
time.start();
}

public JTestinf() {
one.setText(""+ i++);
two.setText(""+ i++);
ButtonGroup group = new ButtonGroup();
group.add(one);
group.add(two);

one.addActionListener(this);
two.addActionListener(this);

JPanel radioPanel = new JPanel(new GridLayout(0, 1));
radioPanel.add(one);
radioPanel.add(two);

add(radioPanel, BorderLayout.LINE_START);
}

public void actionPerformed(ActionEvent e) {
one.setText(""+ i++);
two.setText(""+ i++);
System.err.println("actionPerformed: ActionEvent="+e.getActionCommand()+" i="+i);
}
}

此外,i 包含两个不同的整数,一个用计时器计数,一个用点击计数。这是怎么发生的?

最佳答案

您有两个 JTestInf 对象:

    JFrame window = new JFrame("RadioButtonDemo");
JComponent ContentPane = new JTestinf(); // **** one

window.setContentPane(ContentPane);
window.pack();
window.setVisible(true);
Timer time = new Timer(500, new JTestinf()); // **** two

只用一个!

即,

    JFrame window = new JFrame("RadioButtonDemo");
// JComponent ContentPane = new JTestinf();
JTestinf jTestinf = new JTestinf();

window.setContentPane(jTestinf);
window.pack();
window.setVisible(true);
Timer time = new Timer(500, jTestinf);

更好的是,不要让您的 GUI View 类实现您的监听器控制接口(interface)。将它们分开。

此外,您的 Timer 应该有自己的 ActionListener,与 JRadioButton 监听器不同,因为它们的 Action 非常不同。此外,通常您不提供 JRadioButton 的 ActionListener,而是将它们添加到 ButtonGroup 并在另一个事件中从 ButtonGroup 中提取所选按钮,例如来自另一个 JButton 的 ActionListener。


你问,

But why (and how) should I keep them seperate?

因为否则你会给一个类(class)太多的责任。例如,通过使您的 GUI 实现 ActionListener,它几乎会促使您为 Timer 和 JRadioButtons 提供相同 监听器,这是您不想做的事情,因为它们具有非常不同的操作。如果监听器代码很小,请考虑使用匿名内部类。


例如

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class JTestinf extends JPanel {

JRadioButton one = new JRadioButton();
JRadioButton two = new JRadioButton();
int i = 0;

public static void main(String[] args) {
JFrame window = new JFrame("RadioButtonDemo");
// JComponent ContentPane = new JTestinf();
JTestinf jTestinf = new JTestinf();

window.setContentPane(jTestinf);
window.pack();
window.setVisible(true);
TimerListener timerListener = new TimerListener(jTestinf);
Timer time = new Timer(500, timerListener);
time.start();
}

public JTestinf() {
one.setText("" + i++);
two.setText("" + i++);
ButtonGroup group = new ButtonGroup();
group.add(one);
group.add(two);

one.addActionListener(new RadioListener());
two.addActionListener(new RadioListener());

JPanel radioPanel = new JPanel(new GridLayout(0, 1));
radioPanel.add(one);
radioPanel.add(two);
one.setActionCommand("one");
two.setActionCommand("two");

add(radioPanel, BorderLayout.LINE_START);
}

private class RadioListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// TODO put in code for radio button
System.out.println("JRadioButton Pressed: " + e.getActionCommand());
}
}

public void setRadioText(int index) {
one.setText("" + index);
two.setText("" + (index + 1));
}
}

class TimerListener implements ActionListener {
private int index = 0;

private JTestinf jTestinf;

public TimerListener(JTestinf jTestinf) {
this.jTestinf = jTestinf;
}

public void actionPerformed(ActionEvent e) {
index++;
jTestinf.setRadioText(index);
}
}

关于java - JPanel radioButton 不使用计时器更改文本但单击时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33320514/

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