JOptionPane displaying HTML problems in Java

前端 未结 2 1512
醉话见心
醉话见心 2020-12-06 23:40

Okay, so I have this code, it prompts a month and a year from the user and prints the calendar for that month. I\'m having some problems though.

  1. the HTML fon
相关标签:
2条回答
  • 2020-12-07 00:19

    Here's a rather stupid idea.

    Rather then formatting your results using spaces, which may be affected by variance in the individual font widths of a variable width font...use a HTML table instead, or a JTable, or JXMonthView from the SwingX project

    HTML Table

    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 Example

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

    Or you can go have a look at JXMonthView

    0 讨论(0)
  • 2020-12-07 00:24

    There are a couple issues I noticed. For one, instead of getting your own days in the month or leap year info, you could use the java.util.Calendar class, which will do that for you.

    Also, \n newlines don't behave well when interspersed with HTML formatting, so try using < br/> instead. This is causing the font choice to work improperly.

    It looks like extra spaces also get stripped, so surrounding everything with a < pre> tag will fix that.

    0 讨论(0)
提交回复
热议问题