2016-12-02 10 views
0

Хорошо, я попытаюсь объяснить это как можно лучше. Я достаточно разбираюсь в Java, но не могу найти логического решения для этого после обширного поиска. Допустим, что у меня есть класс JPanel внутри пакета A, который будет содержать график, который будет нарисован.Перекрашивание JPanel из JCheckBox ActionListener в другом пакете

package A 

public class DrawGraph extends JPanel 
{ 
    public DrawGraph() 
    { 
    } 

    @Override 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 

     // other stuff 
    } 

    public void updateGraph() 
    { 
     repaint(); 
    } 
} 

В другом классе внутри пакета B У меня есть JCheckBox, что при выборе должно вызывать перерисовки графика в пакете A. Этот класс не инициализирует класс DrawGraph. Этот класс инициализируется в другом месте.

package B 

public class CheckBoxClass extends JPanel 

public CheckBoxClass 
{ 
    graphicsCheckBox.addActionListener(new ActionListener() 
    { 
     @Override 
     public void actionPerformed(ActionEvent cb) 
     { 
      GUI_Data.graphics = true; 
      DrawGraph.updateGraph(); // Calls Update Graph function 
     } 
    }); 
} 

Теперь, как я вызываю функцию updateGraph в моем классе DrawGraph без того, чтобы создать новый экземпляр класса DrawGraph? Я знаю, что я не могу сделать метод updateGraph статическим, поскольку repaint() не является статическим. Я чувствую, что должен быть способ сделать это, не перерисовывая таймер или какой-либо другой запутанный и неэффективный метод. Я рассматриваю эту проблему не так? В принципе, мне нужен способ вызвать перерисовку класса DrawGraph из класса actionClient класса JCheckBox. Если этот вопрос не ясен, сообщите мне, чтобы я мог его пересмотреть. Спасибо, ребята, заранее, это мой первый вопрос, но я уже несколько лет использую вас, ребята.

ответ

0

Здесь, кажется, есть путаница концепций, позвольте мне попытаться объяснить.

Статические методы против экземпляра: Класс может иметь статические и нестатические методы. нестатические методы могут быть вызваны только на экземпляр класса. static можно вызвать только в классе (хотя вы можете вызвать их через переменную, содержащую instnace класса).

метод видимости: метод может быть закрытым, защищенным, защищенным пакетом или публичным. частные методы могут быть вызваны только из одного класса). protected может быть вызван только из класса или подкласса. защищенный пакетом (без какого-либо классификатора) можно вызывать из классов внутри одного пакета. общественность может быть вызвана из любого места.

В вашем случае тот факт, что CheckBoxClass не находится в одном пакете, не имеет ничего общего с тем фактом, что вы не можете позвонить DrawGraph.updateGraph(). updateGraph() - это метод экземпляра (нестатический), поэтому у вас должен быть экземпляр для его вызова. Теперь, если вы знаете, что в вашей программе будет только один экземпляр DrawGraph, вы можете использовать шаблон singleton: 1) в классе DrawGraph имеют статическую переменную, инициализированную экземпляром самого класса. Кроме того, есть статический метод, который возвращает такой экземпляр:

public class DrawGraph { 
    private static DrawGraph singleton = new DrawGraph(); 

    public static getInstance() { 
    return singleton; 
    } 
} 

Теперь вы можете сделать следующее из CheckBoxClass:

@Override 
    public void actionPerformed(ActionEvent cb) 
    { 
     GUI_Data.graphics = true; 
     DrawGraph.getInstance().updateGraph(); // Calls Update Graph function 
    } 
+0

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

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

  • Нет связанных вопросов^_^