这个事件监听有问题吗ActionListener listener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int year = comboBoxYear.getSelectedIndex(); int month = comboBoxMonth.getSelectedIndex(); Calendar firstDayOfMonth = Calendar.getInstance(); firstDayOfMonth.set(year,month-1,1); int firstDayOfWeek = firstDayOfMonth.get(Calendar.DAY_OF_WEEK); int numOfMonth = firstDayOfMonth.getActualMaximum(Calendar.DAY_OF_MONTH); int k,num = 1; String number; for(k = 0;k < 42;k++){ if(k < firstDayOfWeek - 2||k >= firstDayOfWeek + numOfMonth-2){ panel2.add(new JLabel("",SwingConstants.CENTER)); } else{ number = String.valueOf(num); panel2.add(new JLabel(number,SwingConstants.CENTER)); num++; } } } }; comboBoxYear.addActionListener(listener); comboBoxMonth.addActionListener(listener);
时间: 2023-12-26 14:06:41 浏览: 84
这段代码监听了两个下拉框,每次下拉框的选项改变都会触发 actionPerformed 方法,对应的操作是根据当前选中的年份和月份,计算出该月份的第一天是星期几,以及该月份总共有多少天。然后将这些数据填充到一个面板中。
从代码来看,也没有明显的问题。但是需要注意的是,在该方法中使用了一个 panel2 对象,但是并没有看到该对象的初始化过程,因此需要确保该对象已经被正确地初始化。
此外,还需要注意在计算第一天是星期几的时候,月份需要减 1,因为 Calendar 类中月份从 0 开始计数。
相关问题
import javax.swing.*; import java.awt.*; import java.awt.event.*; //import java.awt.event.ActionEvent; //import java.awt.event.ActionListener; public class JRadionButton_Exercise { public static void main(String[] args) { //首先创建一个面板 JFrame jf=new JFrame("JRadionButton"); jf.setLayout(new BorderLayout()); jf.setSize(300,200); jf.setVisible(true); jf.setLocation(300,200); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //创建标签文字 JLabel label=new JLabel("Hello WOrld!",Label.CENTER); label.setFont(new Font("宋体",Font.PLAIN,30)); //创建管理单选的组 JPanel panel=new JPanel(); ButtonGroup group=new ButtonGroup(); //设置单选组 JRadioButton italic=new JRadioButton("ITALIC"); JRadioButton bold=new JRadioButton("BOLD"); //将组件添加到单选组 group.add(italic); group.add(bold); //设置监视器 ActionListener listener=new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int mode=0; if(bold.isSelected()) { mode+=Font.BOLD; } if(italic.isSelected()) { mode+=Font.ITALIC; } label.setFont(new Font("宋体",mode,30)); } }; //添加监视器 italic.add(listener); bold.add(listener) panel.add(bold); panel.add(italic); jf.add(label,BorderLayout.PAGE_START); jf.add(panel,BorderLayout.PAGE_END); } }为什么报错
这段代码存在两个问题:
1. 在设置监视器时,应该将监听器对象添加到单选按钮上,而不是将单选按钮添加到监听器上。应该将下面两行代码:
```
//添加监视器
italic.add(listener);
bold.add(listener)
```
改为:
```
//添加监视器
italic.addActionListener(listener);
bold.addActionListener(listener);
```
2. 在创建面板后应该立即设置可见性。将下面这行代码:
```
jf.setVisible(true);
```
移动到创建面板的下面即可。
修改以下代码,使得对于table的若干对键值输入由文件一键读入:package Practise; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.HashMap; class Listener implements ActionListener{ Window window; Listener(Window window){ this.window = window; } @Override public void actionPerformed(ActionEvent e) { if(window.table.containsKey(window.text1.getText())) { window.text2.setText(window.table.get(window.text1.getText())); } else window.text2.setText("Can not translate!"); } } class Window extends JFrame{ JTextField text1 = new JTextField(10); JTextField text2 = new JTextField(10); JButton button1 = new JButton("Translate"); HashMap<String,String> table; Listener listener = new Listener(this); Window(HashMap<String,String> table){ this.table = table; setBounds(160,100,400,300); add(text1); add(button1); button1.addActionListener(listener); add(text2); setDefaultCloseOperation(3); setLayout(new FlowLayout()); setVisible(true); } } public class practise5 { public static void main(String[] args){ HashMap<String,String> table = new HashMap<String, String>(); table.put("one","1"); table.put("two","2"); table.put("three","3"); Window window = new Window(table); } }
以下是修改后的代码:
```java
package Practise;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.Scanner;
class Listener implements ActionListener {
Window window;
Listener(Window window) {
this.window = window;
}
@Override
public void actionPerformed(ActionEvent e) {
if (window.table.containsKey(window.text1.getText())) {
window.text2.setText(window.table.get(window.text1.getText()));
} else
window.text2.setText("Can not translate!");
}
}
class Window extends JFrame {
JTextField text1 = new JTextField(10);
JTextField text2 = new JTextField(10);
JButton button1 = new JButton("Translate");
HashMap<String, String> table;
Listener listener = new Listener(this);
Window(HashMap<String, String> table) {
this.table = table;
setBounds(160, 100, 400, 300);
add(text1);
add(button1);
button1.addActionListener(listener);
add(text2);
setDefaultCloseOperation(3);
setLayout(new FlowLayout());
setVisible(true);
}
public void readFrom(String fileName) throws FileNotFoundException {
Scanner scanner = new Scanner(new File(fileName));
while (scanner.hasNextLine()) {
String[] pair = scanner.nextLine().split(",");
if (pair.length == 2) {
table.put(pair[0], pair[1]);
}
}
scanner.close();
}
}
public class Practise5 {
public static void main(String[] args) {
HashMap<String, String> table = new HashMap<String, String>();
try {
Window window = new Window(table);
window.readFrom("input.txt");
} catch (FileNotFoundException e) {
System.out.println("File not found!");
}
}
}
```
修改后的代码中,我们添加了一个 `readFrom()` 方法,该方法接受一个文件名作为输入,从文件中读取键值对并将其存储在 `HashMap` 中。
在 `main()` 方法中,我们首先创建了一个空的 `HashMap`,然后创建了一个 `Window` 对象,并调用 `readFrom()` 方法从文件中读取键值对并存储到 `HashMap` 中。最终,我们将 `HashMap` 传递给 `Window` 对象,并显示窗口。
阅读全文