Java 横历
我对Java还是一个新手,所以请原谅我的新问题 我正在尝试做一个日历,除了,而不是在一个正常的6 x 7布局等,我希望它在月视图水平显示 这就是我目前所拥有的。我已经尝试过改变列和行以及帧宽度,但是我无法使窗格以水平方式正确显示 谢谢你的帮助Java 横历,java,swing,calendar,Java,Swing,Calendar,我对Java还是一个新手,所以请原谅我的新问题 我正在尝试做一个日历,除了,而不是在一个正常的6 x 7布局等,我希望它在月视图水平显示 这就是我目前所拥有的。我已经尝试过改变列和行以及帧宽度,但是我无法使窗格以水平方式正确显示 谢谢你的帮助 package Calendar_Test; /*Contents of CalendarProgran.class */ //Import packages import java.awt.*; import java.awt.event.*; imp
package Calendar_Test;
/*Contents of CalendarProgran.class */
//Import packages
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class Test_Code {
static JLabel lblMonth, lblYear;
static JButton btnPrev, btnNext;
static JTable tblCalendar;
static JComboBox<String> cmbYear;
static JFrame frmMain;
static Container pane;
static DefaultTableModel mtblCalendar; //Table model
static JScrollPane stblCalendar; //The scrollpane
static JPanel pnlCalendar;
static int realYear, realMonth, realDay, currentYear, currentMonth;
public static void main(String args[]) {
//Look and feel
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException e) {
} catch (InstantiationException e) {
} catch (IllegalAccessException e) {
} catch (UnsupportedLookAndFeelException e) {
}
//Prepare frame
frmMain = new JFrame("Key Dates Timeline"); //Create frame
frmMain.setSize(330, 375); //Set size to 400x400 pixels
pane = frmMain.getContentPane(); //Get content pane
pane.setLayout(null); //Apply null layout
frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Close when X is clicked
//Create controls
lblMonth = new JLabel("January");
lblYear = new JLabel("Change year:");
cmbYear = new JComboBox<String>();
btnPrev = new JButton("<<");
btnNext = new JButton(">>");
mtblCalendar = new DefaultTableModel() {
/**
*
*/
private static final long serialVersionUID = 1L;
public boolean isCellEditable(int rowIndex, int mColIndex) {
return false;
}
};
tblCalendar = new JTable(mtblCalendar);
stblCalendar = new JScrollPane(tblCalendar);
pnlCalendar = new JPanel(null);
//Set border
pnlCalendar.setBorder(BorderFactory.createTitledBorder("Calendar"));
//Register action listeners
btnPrev.addActionListener(new btnPrev_Action());
btnNext.addActionListener(new btnNext_Action());
cmbYear.addActionListener(new cmbYear_Action());
//Add controls to pane
pane.add(pnlCalendar);
pnlCalendar.add(lblMonth);
pnlCalendar.add(lblYear);
pnlCalendar.add(cmbYear);
pnlCalendar.add(btnPrev);
pnlCalendar.add(btnNext);
pnlCalendar.add(stblCalendar);
//Set bounds
pnlCalendar.setBounds(0, 0, 320, 335);
lblMonth.setBounds(160 - lblMonth.getPreferredSize().width / 2, 25, 100, 25);
lblYear.setBounds(10, 305, 80, 20);
cmbYear.setBounds(230, 305, 80, 20);
btnPrev.setBounds(10, 25, 50, 25);
btnNext.setBounds(260, 25, 50, 25);
stblCalendar.setBounds(10, 50, 300, 250);
//Make frame visible
frmMain.setResizable(false);
frmMain.setVisible(true);
//Get real month/year
GregorianCalendar cal = new GregorianCalendar(); //Create calendar
realDay = cal.get(GregorianCalendar.DAY_OF_MONTH); //Get day
realMonth = cal.get(GregorianCalendar.MONTH); //Get month
realYear = cal.get(GregorianCalendar.YEAR); //Get year
currentMonth = realMonth; //Match month and year
currentYear = realYear;
//Add headers
String[] headers = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; //All headers
for (int i = 0; i < 7; i++) {
mtblCalendar.addColumn(headers[i]);
}
tblCalendar.getParent().setBackground(tblCalendar.getBackground()); //Set background
//No resize/reorder
tblCalendar.getTableHeader().setResizingAllowed(false);
tblCalendar.getTableHeader().setReorderingAllowed(false);
//Single cell selection
tblCalendar.setColumnSelectionAllowed(true);
tblCalendar.setRowSelectionAllowed(true);
tblCalendar.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//Set row/column count
tblCalendar.setRowHeight(38);
mtblCalendar.setColumnCount(7);
mtblCalendar.setRowCount(6);
//Populate table
for (int i = realYear - 100; i <= realYear + 100; i++) {
cmbYear.addItem(String.valueOf(i));
}
//Refresh calendar
refreshCalendar(realMonth, realYear); //Refresh calendar
}
public static void refreshCalendar(int month, int year) {
//Variables
String[] months = {
"January", "February", "March", "April", "May", "June", "July",
"August", "September", "October", "November", "December"};
int nod, som; //Number Of Days, Start Of Month
//Allow/disallow buttons
btnPrev.setEnabled(true);
btnNext.setEnabled(true);
if (month == 0 && year <= realYear - 10) {
btnPrev.setEnabled(false);
} //Too early
if (month == 11 && year >= realYear + 100) {
btnNext.setEnabled(false);
} //Too late
lblMonth.setText(months[month]); //Refresh the month label (at the top)
lblMonth.setBounds(160 - lblMonth.getPreferredSize().width / 2, 25, 180, 25); //Re-align label with calendar
cmbYear.setSelectedItem(String.valueOf(year)); //Select the correct year in the combo box
//Clear table
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 7; j++) {
mtblCalendar.setValueAt(null, i, j);
}
}
//Get first day of month and number of days
GregorianCalendar cal = new GregorianCalendar(year, month, 1);
nod = cal.getActualMaximum(GregorianCalendar.DAY_OF_MONTH);
som = cal.get(GregorianCalendar.DAY_OF_WEEK);
//Draw calendar
for (int i = 1; i <= nod; i++) {
int row = new Integer((i + som - 2) / 7);
int column = (i + som - 2) % 7;
mtblCalendar.setValueAt(i, row, column);
}
//Apply renderers
tblCalendar.setDefaultRenderer(tblCalendar.getColumnClass(0), new tblCalendarRenderer());
}
static class tblCalendarRenderer extends DefaultTableCellRenderer {
/**
*
*/
private static final long serialVersionUID = 1L;
public Component getTableCellRendererComponent(JTable table, Object
value, boolean selected, boolean focused, int row, int column) {
super.getTableCellRendererComponent(
table, value, selected, focused, row, column);
if (column == 0 || column == 6) { //Week-end
setBackground(new Color(255, 220, 220));
} else { //Week
setBackground(new Color(255, 255, 255));
}
if (value != null) {
if (Integer.parseInt(value.toString()) == realDay
&& currentMonth == realMonth && currentYear == realYear) { //Today
setBackground(new Color(220, 220, 255));
}
}
setBorder(null);
setForeground(Color.black);
return this;
}
}
static class btnPrev_Action implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (currentMonth == 0) { //Back one year
currentMonth = 11;
currentYear -= 1;
} else { //Back one month
currentMonth -= 1;
}
refreshCalendar(currentMonth, currentYear);
}
}
static class btnNext_Action implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (currentMonth == 11) { //Foward one year
currentMonth = 0;
currentYear += 1;
} else { //Foward one month
currentMonth += 1;
}
refreshCalendar(currentMonth, currentYear);
}
}
static class cmbYear_Action implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (cmbYear.getSelectedItem() != null) {
String b = cmbYear.getSelectedItem().toString();
currentYear = Integer.parseInt(b);
refreshCalendar(currentMonth, currentYear);
}
}
}
}
包装日历\u测试;
/*CalendarProgran.class的内容*/
//导入包
导入java.awt.*;
导入java.awt.event.*;
导入java.util.*;
导入javax.swing.*;
导入javax.swing.table.*;
公共类测试代码{
静态JLabel lbl月,lbl月;
静态按钮btnPrev,btnNext;
静态JTable tblCalendar;
静态JComboBox;年度;
静态JMMAIN;
静态容器窗格;
静态DefaultTableModel mtblCalendar;//表模型
静态JScrollPane stblCalendar;//滚动窗格
静态JPanel pnlCalendar;
静态整数realYear、realMonth、realDay、currentYear、currentMonth;
公共静态void main(字符串参数[]){
//外观
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(classnotfounde异常){
}捕获(实例化异常e){
}捕获(非法访问例外e){
}捕获(无支持的LookandFeelException e){
}
//准备框架
frmMain=newjframe(“关键日期时间线”);//创建框架
frmMain.setSize(330375);//将大小设置为400x400像素
pane=frmMain.getContentPane();//获取内容窗格
pane.setLayout(null);//应用null布局
frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//单击X时关闭
//创建控件
lblMonth=新的JLabel(“一月”);
lblYear=新的JLabel(“变更年:”);
cmbYear=新的JComboBox();
btnPrev=新的JButton(“”);
mtblCalendar=新的DefaultTableModel(){
/**
*
*/
私有静态最终长serialVersionUID=1L;
公共布尔值可编辑(int行索引,int mColIndex){
返回false;
}
};
tblCalendar=新的JTable(mtblCalendar);
stblCalendar=新的JScrollPane(tblCalendar);
pnlCalendar=新JPanel(空);
//定界
pnlCalendar.setboorder(BorderFactory.createTitledBorder(“日历”);
//注册操作侦听器
addActionListener(新的btnPrev_Action());
addActionListener(新的btnNext_Action());
cmbYear.addActionListener(新cmbYear_Action());
//将控件添加到窗格
窗格。添加(pnlCalendar);
pnlCalendar.add(磅/月);
pnlCalendar.add(lblYear);
pnlCalendar.add(年度);
pnlCalendar.add(btnPrev);
pnlCalendar.add(btnNext);
pnlCalendar.add(stblCalendar);
//设定界限
pnlCalendar.立根(0,0320335);
lblMonth.setBounds(160-lblMonth.getPreferredSize().width/2,25,100,25);
lblYear.立根(10,305,80,20);
一年的挫折(230、305、80、20);
btnPrev.挫折(10,25,50,25);
b下一个立根(260,25,50,25);
立根(10,50,300,250);
//使框架可见
frmMain.setresizeable(false);
frmMain.setVisible(真);
//获得真实的月/年
GregorianCalendar cal=新的GregorianCalendar();//创建日历
realDay=cal.get(gregoriacalendar.DAY/u月);//get DAY
realmount=cal.get(gregorianalendar.MONTH);//get MONTH
realYear=cal.get(gregorianalendar.YEAR);//get YEAR
currentMonth=realMonth;//匹配月份和年份
currentYear=realYear;
//添加标题
String[]headers={“Sun”、“Mon”、“Tue”、“Wed”、“Thu”、“Fri”、“Sat”};//所有头
对于(int i=0;i<7;i++){
mtblCalendar.addColumn(标题[i]);
}
tblCalendar.getParent().setBackground(tblCalendar.getBackground());//设置背景
//无需调整大小/重新排序
tblCalendar.getTableHeader().SetResizenGallowed(false);
tblCalendar.getTableHeader().setReorderingAllowed(false);
//单细胞选择
tblCalendar.setColumnSelectionAllowed(真);
tblCalendar.setRowSelectionAllowed(真);
tblCalendar.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//设置行/列计数
tblCalendar.设置行高(38);
mtblCalendar.setColumnCount(7);
mtblCalendar.setRowCount(6);
//填充表
对于(int i=realYear-100;i如果您使用4x3(每季度一行),每个单元格都包含嵌套的6x7网格布局(为了保存日/月标题的值,我认为这会更好。您甚至可以将它们嵌套在其他容器中以保存按钮等等)
正如MadProgrammer所指出的,如果您使用空布局并更改字体、帧大小等,那么事情会很快变得不稳定。您的要求非常基本。考虑到您已经在使用JTable
的事实,您只需向视图提供一个新的TableModel
现在,这非常简单,但是这个概念应该让你开始
public class CalendarTableModel extends AbstractTableModel {
private Calendar cal;
public CalendarTableModel() {
this(new Date());
}
public CalendarTableModel(Date date) {
setMonthByDate(date);
}
public void setMonthByDate(Date date) {
cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.DAY_OF_MONTH, 1);
fireTableStructureChanged();
}
@Override
public String getColumnName(int column) {
String name = null;
if (cal != null) {
Calendar tmp = Calendar.getInstance();
tmp.setTime(cal.getTime());
tmp.set(Calendar.DAY_OF_MONTH, column + 1);
int date = tmp.get(Calendar.DAY_OF_MONTH);
int dow = tmp.get(Calendar.DAY_OF_WEEK);
switch (dow) {
case Calendar.MONDAY:
name = "Mon";
break;
case Calendar.TUESDAY:
name = "Tue";
break;
case Calendar.WEDNESDAY:
name = "Wed";
break;
case Calendar.THURSDAY:
name = "Thr";
break;
case Calendar.FRIDAY:
name = "Fri";
break;
case Calendar.SATURDAY:
name = "Sat";
break;
case Calendar.SUNDAY:
name = "Sun";
break;
}
name += " " + date;
}
return name;
}
@Override
public int getRowCount() {
return 10;
}
@Override
public int getColumnCount() {
return cal == null ? 0 : cal.getMaximum(Calendar.DAY_OF_MONTH);
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return null;
}
}
我的第一个建议是,不要使用null
layouts。当字体大小改变时会发生什么?没有布局和pack()
,许多组件看起来都像。谢谢大家。我会再玩一次。嗨,MadProgrammer,谢谢你的代码示例,非常感谢。你是说这段代码需要包含在我的代码中处理外观的部分?干杯。