Как изменить цвет фона JPanel, когда мышь входит в другую JPanel

Я новичок в java Swing, и это мой первый вопрос, поэтому извините за мои ошибки. Я пытаюсь создать JPanel (контейнер), который имеет GridBagLayout и содержит несколько меньших Jpanels, которые будут служить кнопками. Я устанавливаю на каждую маленькую JPanel слушателя mouseEntered, который меняет цвет фона на тот, который входит. Можно ли изменить цвет также в строке и столбце этой панели? Например, если я введу мышь в ячейку (4,3), я хочу, чтобы фон ячеек (4,0) и (0,3) также изменился.

это мой Контейнер:

public class CellPane extends JPanel{

   private List<Cell> cellList;
   private final GridBagConstraints gbc;
   private Cell cell;
   private int counter;

   public CellPane(){

     this.setLayout(new GridBagLayout()); 
     gbc = new GridBagConstraints();
     cellList = new ArrayList<>();
     counter = 0;
        for(int row=0;row<15;row++)
            for(int col=0;col<31;col++){
                gbc.gridx = col;
                gbc.gridy = row;

                cell = new Cell(col ,row);

                Border border = null;
                if (row < 14) {
                    if (col < 30) {
                        border = new MatteBorder(1, 1, 0, 0, new Color(153,204,204));
                    } else {
                        border = new MatteBorder(1, 1, 0, 1, new Color(153,204,204));
                    }
                } else {
                    if (col < 30) {
                        border = new MatteBorder(1, 1, 1, 0, new Color(153,204,204));
                    } else {
                        border = new MatteBorder(1, 1, 1, 1, new Color(153,204,204));
                    }
                }

                cell.setBorder(border);
                cellList.add(counter, cell);
                counter++;
                this.add(cell,gbc);                   
            }  
        System.out.println("Count: " + this.getComponentCount());
        for(Cell c: cellList){
            System.out.println(c.getCellCol()+" "+c.getCellRow());
        }
   }

   public List getCellList(){
       return cellList;
   }
   public int getCellCount(){
       return counter;
   }}

А вот и класс ячейки

class Cell extends JPanel implements MouseListener, PropertyChangeListener{

    private final Color defaultBackground = new Color(240,240,240);
    private final Color clickedColor = new Color(204,0,102);
    private final Color movingColor = new Color(153,255,153);
    private final int row ,col;
    //private CellPane cp = new CellPane();

    public Cell(int x, int y) {
      this.col = x;
      this.row = y;

      if (col>0 & row>0){
        addMouseListener(this);           
      }
      if(col==0 | row == 0){
          addPropertyChangeListener(this);
      }
      if (col == 0){
          this.setPreferredSize(new Dimension(100,35));
      }
      else{
          this.setPreferredSize(new Dimension(35,35));
      }
    }

@Override
public void mouseClicked(MouseEvent me) {
}

@Override
public void mousePressed(MouseEvent me) {
    if(col>0 & row>0 & this.getBackground().equals(movingColor)){
        this.setBackground(clickedColor);        
    }
    else if(this.getBackground().equals(clickedColor)){
        this.setBackground(defaultBackground);
    }
}

@Override
public void mouseReleased(MouseEvent me) {
}

@Override
public void mouseEntered(MouseEvent me) {
    if(col>0 & row>0 & this.getBackground().equals(defaultBackground)){
        this.setBackground(movingColor);
        System.out.println("You clicked on: " + col +" " +row);
        System.out.println("List Size:  " );
    }       
}

@Override
public void mouseExited(MouseEvent me) {
    if(col>0 & row>0 & this.getBackground().equals(movingColor)){
        this.setBackground(defaultBackground);        
    }       
}

@Override
public void propertyChange(PropertyChangeEvent pce) {

}

public int getCellCol(){
    return this.col;
}
public int getCellRow(){
    return this.row;
}}

а вот и основной класс

public class ScheduleForm {

private JFrame mainFrame;
private JPanel pnlButtons;
private JPanel pnlCalendar;
private CellPane cellPane;


    public ScheduleForm(){
        initButtonPanel();
        initCalendarPane();
        initFrame();
    }                    

    private void initCalendarPane(){
       pnlCalendar = new JPanel(new BorderLayout());
       pnlCalendar.setPreferredSize(new Dimension(100,500));
       pnlCalendar.setBorder(BorderFactory.createLineBorder(Color.ORANGE));
       cellPane = new CellPane();
       pnlCalendar.add(cellPane,BorderLayout.CENTER);
    }

    private void initButtonPanel(){
       pnlButtons = new JPanel(new BorderLayout());
       pnlButtons.setPreferredSize(new Dimension(100,100));
       pnlButtons.setBorder(BorderFactory.createTitledBorder("Buttons"));  
            }

    private void initFrame(){                                            
       mainFrame = new JFrame("Schedule");
       mainFrame.setLayout(new BorderLayout());
       mainFrame.add(pnlButtons, BorderLayout.NORTH);
       mainFrame.add(pnlCalendar,BorderLayout.CENTER);
       mainFrame.pack();
       mainFrame.setLocationRelativeTo(mainFrame);
       mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       mainFrame.setVisible(true);
       mainFrame.setExtendedState(java.awt.Frame.MAXIMIZED_BOTH);                
    }

    public static void main(String args[]) {
    /* Set the Nimbus look and feel */
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(PopTest.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {                                
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
            }
            ////EDW tha mpei to neo antikeimeno
            ScheduleForm scheduleForm = new ScheduleForm();
        }
    });
}}

person Kostas    schedule 14.09.2015    source источник
comment
Вы можете создать 2D-массив и хранить в нем все свои ячейки. (тогда просто позвоните array[row][col].setBackground(...))   -  person Lukas Rotter    schedule 14.09.2015
comment
Можете ли вы быть немного более конкретным, потому что я уже храню ячейку в списке.. но я не знаю, как получить список из класса контейнера и использовать его внутри enterMouseListener.. Или моя логика полностью не по теме?   -  person Kostas    schedule 14.09.2015
comment
Пожалуйста, дайте мне знать, если мой ответ имеет смысл или если у вас есть какие-либо вопросы по этому поводу.   -  person Hovercraft Full Of Eels    schedule 14.09.2015


Ответы (1)


Возможное решение:

  1. Дайте Cell общедоступные методы, чтобы позволить внешним классам изменять состояние цвета фона.
  2. В MouseListener ячейки срабатывает изменение свойства всякий раз, когда мышь входит или уходит.
  3. Пусть ваша модель (если используется рекомендуемый чистый шаблон MVC) прослушивает эти изменения и уведомляет представление об изменениях, чтобы цвет строки и столбца мог измениться.
  4. Если не используется чистый MVC, а довольно быстрый и грязный графический интерфейс, то пусть CellPane добавит в ячейки прослушиватель PropertyChangeListener, чтобы он уведомлялся об изменениях состояния отдельных ячеек. WRT ввод/вывод мыши, а затем CellPane может изменять цвета строк и столбцов, вызывая общедоступные методы в пункте 1 выше.
person Hovercraft Full Of Eels    schedule 14.09.2015
comment
Поскольку я не знаком с MVC (намереваюсь быть), я использовал 4-е решение. Большое Вам спасибо - person Kostas; 15.09.2015