尝试在 JFrame 中显示 2 个 JPanel
Trying to display 2 JPanels in a JFrame
我的目标是在日历下方创建一个方框,当我在我的程序中进行时单击日期时,我可以在其中显示事件。首先,我需要创建那个盒子。这是我当前的代码:
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;
}
}
}
这是我当前的输出:
如您所见,事件面板是底部的一个小矩形,我希望它是日历右侧的正方形,但底部也很好。
谁能帮我弄清楚如何实现这个
我会说你的代码的问题是你的日历占用太多 space。您的日历将只占用 5 行。
您应该让“红色”面板增长以填充额外的 space。因此应该是面板加到边框布局的“CENTER”。
因此您需要创建另一个“包装器”面板:
this.add(panel,BorderLayout.NORTH);
//this.add(pane,BorderLayout.CENTER);
JPanel wrapper = new JPanel( new BorderLayout() );
this.add(wrapper, BorderLayout.CENTER);
wrapper.add(pane, BorderLayout.PAGE_START);
//this.add(events,BorderLayout.SOUTH);
wrapper.add(events, BorderLayout.CENTER);
this.monthUpdate();
table.setPreferredScrollableViewportSize(table.getPreferredSize());
最后一条语句将允许滚动窗格自行调整大小以完全显示 table 而没有额外的 space。
我的目标是在日历下方创建一个方框,当我在我的程序中进行时单击日期时,我可以在其中显示事件。首先,我需要创建那个盒子。这是我当前的代码:
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;
}
}
}
这是我当前的输出:
如您所见,事件面板是底部的一个小矩形,我希望它是日历右侧的正方形,但底部也很好。
谁能帮我弄清楚如何实现这个
我会说你的代码的问题是你的日历占用太多 space。您的日历将只占用 5 行。
您应该让“红色”面板增长以填充额外的 space。因此应该是面板加到边框布局的“CENTER”。
因此您需要创建另一个“包装器”面板:
this.add(panel,BorderLayout.NORTH);
//this.add(pane,BorderLayout.CENTER);
JPanel wrapper = new JPanel( new BorderLayout() );
this.add(wrapper, BorderLayout.CENTER);
wrapper.add(pane, BorderLayout.PAGE_START);
//this.add(events,BorderLayout.SOUTH);
wrapper.add(events, BorderLayout.CENTER);
this.monthUpdate();
table.setPreferredScrollableViewportSize(table.getPreferredSize());
最后一条语句将允许滚动窗格自行调整大小以完全显示 table 而没有额外的 space。