【问题标题】:JOptionPane displaying HTML problems in JavaJOptionPane 在 Java 中显示 HTML 问题
【发布时间】:2012-09-24 00:55:22
【问题描述】:

好的,所以我有了这段代码,它会提示用户一个月和一年,并打印该月的日历。不过我遇到了一些问题。

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

【问题讨论】:

    标签: java html swing calendar joptionpane


    【解决方案1】:

    这是一个相当愚蠢的想法。

    而不是使用空格来格式化您的结果,这可能会受到可变宽度字体的各个字体宽度变化的影响...改用 HTML 表格,或者来自 SwingX 项目的 JTableJXMonthView

    HTML 表格

    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 示例

    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

    【讨论】:

    • 谢谢!抱歉,我是 java 新手:/ 你帮了很多忙!
    【解决方案2】:

    我注意到了几个问题。一方面,您可以使用 java.util.Calendar 类,而不是获取您自己的月份或闰年信息,它会为您做到这一点。

    另外,\n 换行符在穿插 HTML 格式时表现不佳,因此请尝试改用
    。这导致字体选择无法正常工作。

    看起来多余的空格也被删除了,所以用 标记将所有内容包围起来就可以解决这个问题。

    【讨论】:

      猜你喜欢
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2013-03-05
      相关资源
      最近更新 更多