Перекрашивание JPanel из JCheckBox ActionListener в другом пакете

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

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 I есть JCheckBox, который при выборе должен вызывать перерисовку графа в пакете А. Этот класс не инициализирует класс 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 из класса действий JCheckBox. Если этот вопрос не ясен, пожалуйста, дайте мне знать, чтобы я мог его пересмотреть. Заранее спасибо, ребята, это мой первый вопрос, но я пользуюсь вами уже несколько лет.

1 ответ

Решение

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

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

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

В вашем случае тот факт, что CheckBoxClass не в той же упаковке не имеет ничего общего с тем, что вы не можете позвонить DrawGraph.updateGraph(), updateGraph() это метод экземпляра (нестатический), поэтому у вас должен быть экземпляр для его вызова. Теперь, если вы знаете, что в вашей программе будет только один экземпляр DrawGraph, вы можете использовать шаблон синглтона: 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
    }
Другие вопросы по тегам