【发布时间】:2021-07-30 09:39:43
【问题描述】:
我的目标是在日历下方创建一个方形框,当我在程序进行中单击日期时,我可以在其中显示事件。首先,我需要创建那个盒子。这是我当前的代码:
package calendar;
import javax.swing.JFrame;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class CalendarView extends JFrame {
DefaultTableModel table;
Calendar cal = new GregorianCalendar();
JLabel label;
JLabel eventsLabel;
CalendarView() {
this.setTitle("Sai's Calendar :}");
this.setSize(400, 400);
this.setResizable(false);
this.setLayout(new BorderLayout());
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
label = new JLabel("Sais Calendar :)");
eventsLabel = new JLabel("EVENTS");
//label.setHorizontalAlignment(SwingConstants.CENTER);
JButton create = new JButton("CREATE");
create.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
}
});
JButton quit = new JButton("QUIT");
create.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
}
});
//making prev & next buttons
JButton prev = new JButton("<<");
prev.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
cal.add(Calendar.MONTH, -1);
monthUpdate();
}
});
JButton next = new JButton(">>");
next.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
cal.add(Calendar.MONTH, +1);
monthUpdate();
}
});
JPanel root = new JPanel(new BorderLayout());
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(prev,BorderLayout.WEST);
panel.add(label,BorderLayout.SOUTH);
panel.add(next,BorderLayout.EAST);
panel.add(create,BorderLayout.NORTH);
panel.add(quit,BorderLayout.CENTER);
JPanel events = new JPanel();
events.setLayout(new BorderLayout());
events.setBackground(Color.red);
events.setPreferredSize(getPreferredSize());
String[] days = {"Sun", "Mon", "Tue", "Wed", "Thurs", "Fri", "Sat"};
table = new DefaultTableModel(null, days);
JTable caltable = new JTable(table);
caltable.setCellSelectionEnabled(true);
caltable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// listen for cell selections using mouse listener to listen for clicks
caltable.addMouseListener(new MouseListener() {
public void mousePressed(MouseEvent e) {
int row = caltable.getSelectedRow();
int column = caltable.getSelectedColumn();
//going to have to this to get stuff done on this date on calendar metohod
Object data = table.getValueAt(row, column);
}
public void mouseClicked(MouseEvent e) { }
public void mouseReleased(MouseEvent e) { }
public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
});
JScrollPane pane = new JScrollPane(caltable);
this.add(panel,BorderLayout.NORTH);
this.add(pane,BorderLayout.CENTER);
this.add(events,BorderLayout.SOUTH);
this.monthUpdate();
}
protected void monthUpdate() {
cal.set(Calendar.DAY_OF_MONTH, 1);
String month = cal.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.US);
int year = cal.get(Calendar.YEAR);
label.setText(month + " " + year);
int firstDay = cal.get(Calendar.DAY_OF_WEEK);
int daysInMonth = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
int weeksInMonth = cal.getActualMaximum(Calendar.WEEK_OF_MONTH);
table.setRowCount(0);
table.setRowCount(weeksInMonth);
int x = firstDay - 1;
for(int i=1;i <=daysInMonth; i++){
table.setValueAt(i, x/7 , x%7 );
x = x + 1;
}
}
}
这是我当前的输出:
如您所见,事件面板是底部的一个小矩形,我希望它是一个比日历右侧更可取的正方形,但底部也可以。
谁能帮我弄清楚如何实现这个
【问题讨论】:
-
“我希望这是一个正方形” 向其中添加一些东西,让它们成为它们的自然大小。删除
events.setPreferredSize(getPreferredSize());和this.setSize(400, 400);。然后将this.setVisible(true);移动到最后一条语句并在其前面添加this.pack();。 -
this.add(panel,BorderLayout.NORTH); this.add(pane,BorderLayout.CENTER); this.add(events,BorderLayout.SOUTH); this.monthUpdate(); this.pack(); this.setVisible(true);@AndrewThompson -
仍然是相同的输出.. 我没有看到任何红色方块@AndrewThompson
-
停止使用 GUI。创建一个包含一个事件的纯 Java getter/setter 类。创建一个 CalendarEvent 普通 Java getter/setter 类,它包含一个 java.util.List 事件实例。一旦你有了你的模型,你就可以创建一个日历 JPanel 和一个由 JTable 或 JTextArea 组成的日历事件 JPanel,具体取决于你希望如何格式化 Event 实例。
-
我现在只是在做 GUI 工作......@GilbertLeBlanc