Доступ к одному классу из другого
У меня есть определенный класс, который публикует метод, позволяющий доступ к частному объекту в:
public class HexBoard {
[...]
public HexBoard(int Width, int Height, boolean Wrap) {
SetSize(Width, Height); // inherently calls Reset()
SetWrap(Wrap);
} // HexBoard constructor
public Polygon GetHexagon(int CellIndex) {
Polygon p = new Polygon();
for (int i = 0; i < 6; i++) {
p.addPoint((int) (HexCentres.X(CellIndex) + HexPoints.X(i)), (int) (HexCentres.Y(CellIndex) + HexPoints.Y(i)));
}
return p;
} // GetHexagon
public int Cells() { return CellCount; }
} // HexBoard
Вы можете видеть, что метод создает многоугольник и возвращает его. Этот бит работает хорошо. Теперь у меня есть другой класс, который публикует расширенную JPanel, чтобы нарисовать игровое поле на основе шестиугольника, состоящее из множества шестиугольников.
import java.awt.*;
import javax.swing.*;
public class PCinterface extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
int CellCount = HexBoard.Cells();
for (int i = 0; i < HexBoard.Cells(); i++) {
g.drawPolygon(HexBoard.GetHexagon(i));
}
} // paintBoard
} // PCinterface
Проблема в том, что PCinterface ничего не знает о HexBoard, поэтому он не может получить доступ к HexBoard.Cells() или HexBoard.GetHexagon().
Когда выполняется следующее
public class Test {
public static void main(String args[]) {
BreadBoard Board = new BreadBoard(12,12,false);
Board.SetCellRadius(25);
JFrame frame = new JFrame();
frame.setTitle("BreadBoard");
frame.setSize(600, 600);
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
Container contentPane = frame.getContentPane();
contentPane.add(new PCinterface());
frame.setVisible(true);
*/
} // main
} // Test
Я надеюсь, что он откроет окно и нарисует несколько шестиугольников, но я вижу, что основанная на шестиугольнике плата, созданная в основном с помощью HexBoard, не существует в контексте PCinterface.
Я вижу, что я мог бы легко включить PCInterface в main, и это решило бы проблему: я пытаюсь разрабатывать для нескольких платформ и надеялся, что это подходящий способ для разделения классов, зависящих от платформы.
Как я могу использовать данные, хранящиеся в BreadBoard в классе PCInterface, пожалуйста?
2 ответа
Вам нужен экземпляр HexBoard. Вы можете добавить один к себе ваш PCinterface
public class PCinterface extends JPanel {
public HexBoard hexBoard
public PCinterface(HexBoard board)
{
this.hexBoard = board;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
int CellCount = this.hexBoard.Cells();
for (int i = 0; i < this.hexBoard.Cells(); i++) {
g.drawPolygon(this.hexBoard.GetHexagon(i));
}
} // paintBoard
} // PCinterface
при условии, что тип Board
, BreadBoard
продолжается HexBoard
, вы можете передать его в конструктор, как это
contentPane.add(new PCinterface(Board));
Как прокомментировал @HunterMcMillen, вам нужно создать экземпляр HexBoard
для того, чтобы использовать метод Cells()
:
...
HexBoard hexBoard = new HexBoard(width, height, wrap);
int cellCount = hexBoard.Cells();
...