尝试在 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。