我编写了这个java应用程序,用于在启动计数器后从jtextfields中输入的值中提取一个随机值。编译并没有错误,但是( "" +randomElement
)不显示值。
我创造了 randomElement
内部的属性 TimerListener
班级 actionPerformed()
启动计数器的方法。在计数结束时,必须显示从四个jtextfields中获取的随机值(如下面的代码所示)。
你能告诉我哪里错了,我该怎么解决吗?
public class Merge extends JPanel {
public static final int TIMER_DELAY = 1000;
public static final String TEST_TEXT = "123456";
public JTextField textField = new JTextField(16);
public JButton button = new JButton(new ButtonAction());
public Timer timer;
JTextField t1Text = new JTextField();
JTextField t2Text = new JTextField();
JTextField t3Text = new JTextField();
JTextField t4Text = new JTextField();
JLabel f1Label = new JLabel("Filippo film 1");
JLabel f2Label = new JLabel("Filippo film 2");
JLabel l1Label = new JLabel("Laura film 1");
JLabel l2Label = new JLabel("Laura film 2");
public Merge() {
add(button);
add(textField);
}
public static void main(String[] args) {
Merge me = new Merge();
me.createAndShowGui();
}
public void createAndShowGui() {
Merge mainPanel = new Merge();
JFrame frame = new JFrame("Film roulette");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.setLayout(new GridLayout(11, 4));
frame.pack();
frame.setBounds(100, 10, 400, 400);
frame.add(f1Label);
frame.add(t1Text);
frame.add(f2Label);
frame.add(t2Text);
frame.add(l1Label);
frame.add(t3Text);
frame.add(l2Label);
frame.add(t4Text);
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public class ButtonAction extends AbstractAction {
public ButtonAction() {
super("The movie you will see...");
putValue(MNEMONIC_KEY, KeyEvent.VK_P);
}
@Override
public void actionPerformed(ActionEvent e) {
if (timer != null && timer.isRunning()) {
return;
}
textField.setText("");
timer = new Timer(TIMER_DELAY, new TimerListener());
timer.start();
}
}
private class TimerListener implements ActionListener {
private String text = "";
private int counter = 0;
@Override
public void actionPerformed(ActionEvent e) {
String filmFilippo1, filmFilippo2, filmLaura1, filmLaura2;
filmFilippo1 = t1Text.getText();
filmFilippo2 = t2Text.getText();
filmLaura1 = t3Text.getText();
filmLaura2 = t4Text.getText();
List<String> givenList = Arrays.asList(filmFilippo1, filmFilippo2, filmLaura1, filmLaura2);
Random rand = new Random();
String randomElement = givenList.get(rand.nextInt(givenList.size()));
text += TEST_TEXT.charAt(counter);
textField.setText(text);
counter++;
if (counter >= TEST_TEXT.length()) {
timer.stop();
textField.setText("" +randomElement);
}
}
}
}
1条答案
按热度按时间i86rm4rw1#
要回答你的实际问题,它是空的原因是因为你这样做
createAndShowGui
:您可以创建
Merge
类,然后将其添加到JFrame
你已经做过了main(string[] args)
:现在有两个
Merge
类,其中一个对用户不可见。你只需要在家里做这件事createAndShowGui
:然而
不要延伸
JPanel
不必要的通过在edt上创建所有swing组件
SwingUtilities.invokeLater
使用JFrame#setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
所以它完全退出应用程序,除非你只想处理?呼叫
JFrame#pack()
仅在添加所有组件之后不要打电话
setBounds
你自己你用的是LayoutManager
就这样吧!不用打电话了
JFrame#getContentPane()#add
打个电话就行了JFrame#add
你为计时器的每一个滴答声选择一个随机数,为什么不在计时器结束时选择一次呢?您可能还想禁用
textField
这算得上人们可以把输入放在那里,弄乱你的代码逻辑哈哈不要全局声明或初始化变量,除非在不同的方法中需要它们