2014-02-07 3 views
2

Здравствуйте у меня есть что-то вроде этогоJCheckBox значения параметров в другом классе

public class GUI{ 
    public JCheckBox box; 
    public boolean value; 

    void init(){ 
     box.addActionListener(new BoxListener(this)); 
    } 
} 

public class BoxListener implements ActionListener{ 
    GUI gui; 
    public BoxListener(GUI gui){ 
     this.gui = gui; 
    } 

    @override 
    public void actionperformed(ActionEvent a){ 
     gui.value = true; 
    } 

} 

Теперь я хочу, чтобы изменить значение BOOL, когда флажок получает щелчок. Я ищу лучшие решения, чем передать Class GUI в качестве входного параметра для самостоятельного письменного слушателя.

Есть ли лучшие решения?

+0

Существует множество примеров того, как это сделать. Попробуйте и google это! – ohlmar

+0

Зачем вам нужно передать 'A' в качестве параметра? Я не понимаю, что вы пытаетесь сделать. –

+0

Потому что actionlistener на коробке ничего не знает о GUI. – Gobliins

ответ

2

Я бы бросить в некоторых MVC это намного больше работы, но это делает для более гибкого кодирования ,

Сначала ModelBean с boolean checked и propertyChangeSupport для стрельбы события изменения свойства

import java.beans.*; 
import java.io.Serializable; 

public class ModelBean implements Serializable { 

    private boolean checked; 

    private PropertyChangeSupport propertySupport; 

    public ModelBean() { 
     propertySupport = new PropertyChangeSupport(this); 
    } 

    public boolean getChecked() { 
     return checked; 
    } 

    public void setChecked(boolean checked) { 
     boolean oldValue = this.checked; 
     this.checked = checked; 
     propertySupport.firePropertyChange("checked", oldValue, this.checked); 
    } 

    public void addPropertyChangeListener(PropertyChangeListener listener) { 
     propertySupport.addPropertyChangeListener(listener); 
    } 

    public void removePropertyChangeListener(PropertyChangeListener listener) { 
     propertySupport.removePropertyChangeListener(listener); 
    } 
} 

Тогда у вас есть свой главный GUI класса, который принимает ModelBean в качестве аргумента

class GUI extends JFrame { 
    private ModelBean model; 
    private JCheckBox cbox; 

    public GUI(ModelBean model) { 
     this.model = model; 
     cbox = new JCheckBox("Check and watch me print"); 
     cbox.addItemListener(new CheckListener(model)); 

     setLayout(new GridBagLayout()); 
     add(cbox); 
     setSize(300, 300); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setVisible(true); 
    } 
} 

И вы ItemListener класса принимает тот же ModelBean в качестве аргумента, а также добавляет PropertyChangeListener к model

class CheckListener implements ItemListener { 

    private ModelBean model; 

    public CheckListener(ModelBean newModel) { 
     this.model = newModel; 
     model.addPropertyChangeListener(new PropertyChangeListener() { 
      public void propertyChange(PropertyChangeEvent e) { 
       System.out.println(model.getChecked()); 
      } 
     }); 
    } 

    @Override 
    public void itemStateChanged(ItemEvent e) { 
     JCheckBox source = (JCheckBox) e.getSource(); 
     if (source.isSelected()) { 
      model.setChecked(true); 
     } else { 
      model.setChecked(false); 
     } 
    } 
} 

Затем класс запустить программу

public class TestMVC { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       final ModelBean model = new ModelBean(); 
       GUI gui = new GUI(model); 
      } 
     }); 
    } 
} 

Похоже, много работы только за глупый boolean но концепция лучше общий дизайн для больших программ, где много разных данных нужно манипулировать и прослушивать изменения.


UPDATE

Другой вариант, если ваш GUI является родительским контейнером, и вы не хотите, чтобы выставить его, передавая его по ссылке, вы можете создать interface и иметь GUI реализовать

public interface BooleanInterface { 
    public void setBoolean(boolean bool); 
} 

public class GUI extends JFrame implements BooleanInterface { 
    boolean bool; 

    @Override 
    public void setBoolean(boolean bool) { 
     this.bool = bool; 
    } 
} 

public BoxListener implements ActionListener { 
    BooleanInterface boolFace; 

    public BoxListener(BooleanInterface boolFace) { 
     this.boolFace = boolFace; 
    } 
} 

Вы можете затем передать GUI к слушателю. Хотя он выглядит так же, как то, что вы уже делаете, на самом деле не, так как он больше не предоставляет GUI, а использует интерфейс.

+0

Да MVC в большинстве случаев является хорошим дизайном. Но, как сказано, просто вся эта реализация для настройки bool. более быстрый (даже когда более грязный) взломать. – Gobliins

+0

@Goblin вам необязательно нужно «PropertyChangeSupport», я просто добавил это. Вы можете просто просто иметь класс с булевым, getter и setter и делиться тем же классом. означают, что вы делаете _is_ взломать, но то, что оно подвергает ваш графический интерфейс без необходимости –

+0

@Goblins См. мое ** ОБНОВЛЕНИЕ **. Это еще одно решение, чтобы не выставлять «GUI» –

1

Почему мы не берем то, что у вас есть и изменить его немного:

Во-первых, создать (DefaultController) класс контроллер, который будет обрабатывать инициализации приложения и будет содержать ссылку на графический интерфейс (или Просмотр)

public class DefaultController 
{ 
    private final GUI view = new GUI(); // The view 

    private void init() 
    { 
     // ... 

     this.view.addBoxListener(new BoxListener(this.view)); 

     // ... 
    } 

    public static void main(String[] args) 
    { 
     // ... Start up code ... 
    } 
} 

Затем измените GUI класс включать методы для взаимодействия с JCheckBox и зарегистрировать слушатель:

public class GUI 
{ 
    private JCheckBox box; 

    // ... 

    public void addBoxListener(ItemListener listener) 
    { 
     box.addItemListener(listener); 
    } 

    public void setBoxValue(boolean selected) 
    { 
     box.setSelected(selected); 
    } 

    // ... 
} 

Теперь ваш BoxListener имеет экземпляр представления (GUI) и может совершать звонки, чтобы установить значение флажка через предоставленный интерфейс. Вы больше не получаете доступ к переменной-члену box (инкапсуляция). Это позволит вам вносить изменения в метод setBoxValue, не влияя на вызывающего.

В вашем BoxListener классе:

@Override 
public void itemStateChanged(ItemEvent evt) 
{ 
    view.setBoxValue(true); // For example... 
} 

Примечание: view переменная член BoxListener - private GUI view;

+0

Разве это не будет таким же, как мое текущее решение? – Gobliins

+0

@ Гоблинс Не совсем. Во-первых, в вашем решении не используется инкапсуляция (вам следует избегать переменных 'public'. Во-вторых, был введен класс' Controller' для обработки регистрации между 'ActionListener' и 'GUI' (чтение в Model-View- Controller). Единственной частью, которую я не включил, была модель «Model» в этом решении. – bblincoe

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