Results 1 to 4 of 4
  1. #1
    Marcin is offline Member
    Join Date
    Nov 2011
    Posts
    8
    Rep Power
    0

    Default JComboBox displays incorrect year before clicking on it

    Hi!

    I've got the strange problem with JComboBox, cause it displays an incorrect year (avg. once per 3 calendar loading) before you click it. If i remove "refreshCalendar" from the last code line than the problem disappears but cannot change year by combo. Thanks in advance for any kind of advice.

    Full code length:

    Java Code:
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package calendarprogram;
    
    /**
     *
     * @author AR
     */
    //Import packages
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.table.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    
    public class CalendarProgram{
    	static JLabel lblMonth, lblYear;
    	static JButton btnPrev, btnNext;
    	static JTable tblCalendar;
    	static JComboBox 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 ("Terminarz - Kalendarz"); //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 ("Styczeń");
    		lblYear = new JLabel ("Zmień rok:");
    		cmbYear = new JComboBox();
    		btnPrev = new JButton ("<<");
    		btnNext = new JButton (">>");
    		mtblCalendar = new DefaultTableModel(){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("Kalendarz"));
    		
    		//Register action listeners
    		btnPrev.addActionListener(new btnPrev_Action());
    		btnNext.addActionListener(new btnNext_Action());
    		cmbYear.addActionListener(new cmbYear_Action());
    		btnPrev.setFocusPainted(false);
                    btnNext.setFocusPainted(false);
                
    		//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 = {"Nie", "Pon", "Wto", "Śro", "Czw", "Pią", "Sob"}; //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 =  {"Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec", "Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień"};
    		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{
    		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); 
                                   
                        }
                        
                        
                            
                        
                    
    		}
    	}
    }

  2. #2
    Fubarable's Avatar
    Fubarable is offline Moderator
    Join Date
    Jun 2008
    Posts
    19,316
    Blog Entries
    1
    Rep Power
    26

    Default Re: JComboBox displays incorrect year before clicking on it

    This is nothing more than a swag (silly wild-a...'d guess), but what if you add your JComboBox's ActionListener after adding all the data and selecting the current year?

  3. #3
    Marcin is offline Member
    Join Date
    Nov 2011
    Posts
    8
    Rep Power
    0

    Default Re: JComboBox displays incorrect year before clicking on it

    that swapping places has helped... thx

  4. #4
    Fubarable's Avatar
    Fubarable is offline Moderator
    Join Date
    Jun 2008
    Posts
    19,316
    Blog Entries
    1
    Rep Power
    26

Similar Threads

  1. Touch Displays
    By Ciwan in forum New To Java
    Replies: 4
    Last Post: 10-21-2010, 10:47 AM
  2. What in my function incorrect?
    By artemff in forum New To Java
    Replies: 5
    Last Post: 01-02-2010, 05:25 PM
  3. Replies: 2
    Last Post: 12-10-2009, 02:58 PM
  4. Date of first day, given the week in the year and the year...
    By Lee.J.Baxter in forum Advanced Java
    Replies: 1
    Last Post: 08-26-2009, 09:48 AM
  5. Incorrect Package? Help!
    By chaits86 in forum NetBeans
    Replies: 10
    Last Post: 12-17-2008, 04:08 AM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •