2012-10-03 83 views
1

好的,所以我有這個代碼,它會提示用戶一個月和一年,並打印該月的日曆。我有一些問題,但。JOptionPane在Java中顯示HTML問題

  1. HTML字體編輯隻影響月份。
  2. 星期幾沒有正確對齊。

謝謝!

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; 
} 
} 

回答

7

這是一個相當愚蠢的想法。

相反然後使用空間,其可以通過在方差的可變寬度字體的單個字體寬度受到影響...使用HTML表格來替代,或者一個JTable,或JXMonthView從SwingX項目格式化搜索結果

HTML表格

enter image description here

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>"); 

JTable的實施例

enter image description here

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()); 
    } 
} 

或者你可以去看看JXMonthView

+0

'這是一個相當愚蠢的想法。 ....':-)接受:-) – mKorbel

+0

謝謝!對不起,我對java很陌生:/你幫了太多忙! – Becksters

3

有我注意到一對夫婦的問題。首先,您可以使用java.util.Calendar類,而不是在本月或閏年信息中獲取自己的日子。

另外,\ n新換行在穿插HTML格式時表現不佳,因此請嘗試使用< br />。這會導致字體選擇無法正常工作。

它看起來像多餘的空間也被剝離,所以用一個< pre>標記包圍所有東西將解決這個問題。

+0

對於日曆的建議+1 – MadProgrammer