用Java显示HTML问题的JOptionPane
好的,我有这个代码,它提示用户一个月和一年,并打印该月的日历。不过我有一些问题 HTML字体编辑仅影响月份。 一周中的几天在列中没有正确对齐。 谢谢用Java显示HTML问题的JOptionPane,java,html,swing,calendar,joptionpane,Java,Html,Swing,Calendar,Joptionpane,好的,我有这个代码,它提示用户一个月和一年,并打印该月的日历。不过我有一些问题 HTML字体编辑仅影响月份。 一周中的几天在列中没有正确对齐。 谢谢 package calendar_program; import javax.swing.JOptionPane; public class Calendar { public static void main(String[] args) { StringBuilder result=new StringBuilder();
package calendar_program;
import javax.swing.JOptionPane;
public class Calendar {
public static void main(String[] args) {
StringBuilder result=new StringBuilder();
// read input from user
int year=getYear();
int month=getMonth();
String[] allMonths={
"", "January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"
};
int[] numOfDays= {0,31,28,31,30,31,30,31,31,30,31,30,31};
if (month == 2 && isLeapYear(year)) numOfDays[month]=29;
result.append(" "+allMonths[month]+ " "+ year+"\n"+" S M Tu W Th F S"+"\n");
int d= getstartday(month, 1, year);
for (int i=0; i<d; i++){
result.append(" ");
// prints spaces until the start day
}
for (int i=1; i<=numOfDays[month];i++){
String daysSpace=String.format("%4d", i);
result.append(daysSpace);
if (((i+d) % 7==0) || (i==numOfDays[month])) result.append("\n");
}
//format the final result string
String finalresult= "<html><font face='Arial'>"+result;
JOptionPane.showMessageDialog(null, finalresult);
}
//prompts the user for a year
public static int getYear(){
int year=0;
int option=0;
while(option==JOptionPane.YES_OPTION){
//Read the next data String data
String aString = JOptionPane.showInputDialog("Enter the year (YYYY) :");
year=Integer.parseInt(aString);
option=JOptionPane.NO_OPTION;
}
return year;
}
//prompts the user for a month
public static int getMonth(){
int month=0;
int option=0;
while(option==JOptionPane.YES_OPTION){
//Read the next data String data
String aString = JOptionPane.showInputDialog("Enter the month (MM) :");
month=Integer.parseInt(aString);
option=JOptionPane.NO_OPTION;
}
return month;
}
//This is an equation I found that gives you the start day of each month
public static int getstartday(int m, int d, int y){
int year = y - (14 - m) / 12;
int x = year + year/4 - year/100 + year/400;
int month = m + 12 * ( (14 - m) / 12 ) - 2;
int num = ( d + x + (31*month)/12) % 7;
return num;
}
//sees if the year entered is a leap year, false if not, true if yes
public static boolean isLeapYear (int year){
if ((year % 4 == 0) && (year % 100 != 0)) return true;
if (year % 400 == 0) return true;
return false;
}
}
这是一个相当愚蠢的想法 而不是使用空格格式化结果,因为空格可能会受到可变宽度字体的单个字体宽度差异的影响…请改用HTML表,或SwingX项目中的JTable或JXMonthView HTML表格 JTable示例
或者你可以去看看这里有个相当愚蠢的主意 而不是使用空格格式化结果,因为空格可能会受到可变宽度字体的单个字体宽度差异的影响…请改用HTML表,或SwingX项目中的JTable或JXMonthView HTML表格 JTable示例
或者你可以去看看我注意到了几个问题。首先,您可以使用java.util.Calendar类,而不是在月份或闰年信息中获取自己的天数,它将为您提供这些信息 此外,\n新行在使用HTML格式时表现不佳,因此请尝试使用
。这会导致字体选择不正确
看起来额外的空间也会被剥离,所以用
标记将所有内容包围将解决这一问题。我注意到了几个问题。首先,您可以使用java.util.Calendar类,而不是在月份或闰年信息中获取自己的天数,它将为您提供这些信息 此外,\n新行在使用HTML格式时表现不佳,因此请尝试使用
。这会导致字体选择不正确
看起来额外的空间也会被剥离,所以用标记将所有东西包围起来将解决这个问题。谢谢!对不起,我对java还不太熟悉,你帮了我很多忙!非常感谢。对不起,我对java还不太熟悉,你帮了我很多忙!String dayNames[] = {"S", "M", "Tu", "W", "Th", "F", "S"}; result.append("<html><font face='Arial'>"); result.append("<table>"); result.append("<tr>"); for (String dayName : dayNames) { result.append("<td align='right'>").append(dayName).append("</td>"); } result.append("</tr>"); result.append("<tr>"); for (int i = 0; i < d; i++) { result.append("<td></td>"); } for (int i = 0; i < numOfDays[month]; i++) { if (((i + d) % 7 == 0)) { result.append("</tr><tr>"); } result.append("<td align='right'>").append(i + 1).append("</td>"); } result.append("</tr>"); result.append("</table>"); result.append("</html>");
MyModel model = new MyModel(); List<String> lstRow = new ArrayList<String>(7); for (int i = 0; i < d; i++) { lstRow.add(""); } for (int i = 0; i < numOfDays[month]; i++) { if (((i + d) % 7 == 0)) { model.addRow(lstRow); lstRow = new ArrayList<String>(7); } lstRow.add(Integer.toString(i + 1)); } if (lstRow.size() > 0) { while (lstRow.size() < 7) { lstRow.add(""); } model.addRow(lstRow); } JTable table = new JTable(model); // Kleopatra is so going to kill me for this :( Dimension size = table.getPreferredScrollableViewportSize(); size.height = table.getRowCount() * table.getRowHeight(); table.setPreferredScrollableViewportSize(size); JOptionPane.showMessageDialog(null, new JScrollPane(table)); public static class MyModel extends AbstractTableModel { public static final String[] DAY_NAMES = {"S", "M", "Tu", "W", "Th", "F", "S"}; private List<List<String>> lstRowValues; public MyModel() { lstRowValues = new ArrayList<List<String>>(25); } @Override public int getRowCount() { return lstRowValues.size(); } @Override public String getColumnName(int column) { return DAY_NAMES[column]; } @Override public int getColumnCount() { return 7; } @Override public Object getValueAt(int rowIndex, int columnIndex) { List<String> rowData = lstRowValues.get(rowIndex); return rowData.get(columnIndex); } public void addRow(List<String> lstValues) { lstRowValues.add(lstValues); fireTableRowsInserted(getRowCount(), getRowCount()); } }