【问题标题】:Trying to display 2 JPanels in a JFrame试图在 JFrame 中显示 2 个 JPanel
【发布时间】: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

标签: java swing jframe jpanel


【解决方案1】:

我想说您的代码的问题是您的日历占用了太多空间。您的日历将只占用 5 行。

您应该让“红色”面板变大以填充额外的空间。因此它应该是添加到边框布局的“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());

最后一条语句将允许滚动窗格自行调整大小以完全显示表格而无需额外空间。

【讨论】:

    猜你喜欢
    • 2011-07-18
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 2012-03-10
    相关资源
    最近更新 更多