Перекрашивание 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
}