2013-05-05 3 views
1

Я пытаюсь запустить несколько JFrames с настраиваемой панелью, которую я создал, с именем subpanel. [Если вам интересно об именовании, у меня есть еще один класс под названием masterpanel, который содержит кнопку, которая запускает новый кадр, содержащий новый экземпляр subpanel.Swing Panels Изменение цвета

Целью subpanel является то, что когда пользователь нажимает кнопку enter, цвет меняется. В настоящее время у меня есть каждый subpanel, содержащий внутренний класс под названием EnterAction, который вызывает setBackground, чтобы изменить цвет.

Мне было интересно, как я могу изменить это, чтобы я мог синхронизировать изменение цвета между всеми моими subpanels.

В настоящее время у меня есть переменная green, которая, я считаю, я могу пройти между всеми моими панелями. Однако, я не уверен, как я могу получить EnterAction, чтобы изменить все активные панели?

Я думал о создании списка активных subpanels? Но это вызовет дополнительную проблему, которая мне понадобится для поддержания списка, если пользователь закрывает subpanel?

Вот мой код:

import java.awt.event.ActionEvent; 
import javax.swing.AbstractAction; 
import javax.swing.Action; 
import javax.swing.KeyStroke; 

public class SubPanel extends javax.swing.JPanel 
{ 
    private Action enterAction; 

    public SubPanel() 
    { 
     initComponents(); 
     enterAction = new EnterAction(); 

      //KeyBindings on the enter button 
     this.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), "doEnterAction"); 
     this.getActionMap().put("doEnterAction", enterAction); 
    } 

    /** 
    * This method is called from within the constructor to initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is always 
    * regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 

     setForeground(new java.awt.Color(1, 1, 1)); 
     setToolTipText(""); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); 
     this.setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 400, Short.MAX_VALUE) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 300, Short.MAX_VALUE) 
     ); 
    }// </editor-fold>       
    // Variables declaration - do not modify      
    // End of variables declaration     

    private static int green = 240; 

    private class EnterAction extends AbstractAction 
    { 
     @Override 
     public void actionPerformed(ActionEvent ae) 
     { 
      //System.out.println("Enter button is pressed"); 
      green -= 5; 
      if (green <= 0) green = 0; 
      setBackground(new java.awt.Color(255, green, 255)); 
     } 
    } 
} 

EDIT: Там будет максимум 5 панелей. Это устраняет необходимость создания списка, поддерживающего активные панели.

+0

* "Я пытаюсь запустить несколько JFrames" * См [Использование нескольких JFrames, хороший/плохой практике?] (Http://stackoverflow.com/a/9554657/418556) –

+0

+1 для ['Action'] (http://docs.oracle.com/javase/tutorial/uiswing/misc/action.html). – trashgod

+0

@AndrewThompson Я создаю модель для чего-то. Думаю, я могу изменить сферу моего приложения. Будет открыто не более 5 окон. – Rhs

ответ

2

Вместо этого создайте PanelColorModel, который содержит текущий цвет. Пусть заинтересованные панели регистрируются в качестве слушателя для этой модели, используя одну из предложенных observer pattern реализаций here. Тогда ваш Action может обновить модель, и слушатели могут соответственно реагировать.

0

Вы можете попытаться определить атрибут цвета static, поэтому каждый раз, когда вы нажимаете Enter, каждая подпанель будет иметь тот же цвет. Что-то вроде:

static Color subpanelBackgroundColor; //Every instance will have this. 
+1

Я не думаю, что это точно. Даже если все панели имеют статическую переменную 'color', все равно должно существовать событие, которое вызывает setBackground для каждой панели. – Rhs

Смежные вопросы