2014-02-02 3 views
0

Я пытаюсь привлечь рыбу в любом месте, пользователь вводит, но это будет либо сказатьСоздание нескольких панелей в кадре?

drawFish.java:38: error: cannot find symbol 
    outer.add(sPanel1); 

Или

Exception in thread "main" java.lang.IllegalArgumentException: adding a window to a container 
at java.awt.Container.checkNotAWindow(Container.java:483) 
at java.awt.Container.addImpl(Container.java:1084) 
at java.awt.Container.add(Container.java:410) 
at drawFish.main(drawFish.java:38) 

Я думал, что мне нужно сделать новую панель для каждой рыбы, но как создать цикл для создания нескольких панелей? Если это даже проблема? Кроме того, я должен использовать метод, который принимает координату x и y, чтобы пользователь мог изменить местоположение рыбы и нарисовать несколько рыб в разных местах. Но это не то, что я делаю. Я попытался сделать метод, включающий вопросы x и y, но затем он говорит, что переменные не являются общедоступными и поэтому не могут использоваться в методе paint. Я был бы благодарен за объяснения всего, потому что я хочу понять все, что я делаю.

public class drawFish extends JPanel { 

int x = Integer.parseInt(JOptionPane.showInputDialog(null, "What is the x location of the fish? ")); 
int y = Integer.parseInt(JOptionPane.showInputDialog(null, "What is the y location of the fish? ")); 
int w = 200; 
int h = 100; 
int a = x + 20; 
int b = y + 30; 
int d = 50; 

public drawFish() { 
    setPreferredSize(
     new Dimension(400,400)); 
} 

public void paint(Graphics g) { 
    g.setColor(Color.GREEN); 
    g.fillOval(x, y, w, h); 
    g.fillOval((w-5), y, d, h); 
    g.setColor(Color.BLACK); 
    g.fillOval(a, b, 25, 25); 
} 

public static void main(String[] args) { 
    MyFrame frame1 = new MyFrame("Drawing Fish"); 
    JPanel outer = new JPanel(); 

    int fn = Integer.parseInt(JOptionPane.showInputDialog(null, "How many fish would you like to draw? ")); 

    for(int i=0; i<fn; i++){ 
    drawFish sPanel1 = new drawFish(); 
    } 

    outer.add(sPanel1); 
    frame1.add(outer); 
    frame1.pack(); 
    frame1.setVisible(true); 
} 
} 

ответ

3
  • Не делайте много JPanels, просто сделать один рисунок JPanel.
  • Создайте класс Fish, который не является JPanel или компонентом, но имеет метод draw(Graphics g), так что он может рисовать себя в своем текущем местоположении по запросу.
  • Дайте JPanel ArrayList<Fish> и заполните список Fish objects.
  • В методе JPanel paintComponent(Graphics g) (а не в методе рисования) проведите цикл по вызову ArrayList draw(g) на каждый содержащийся в нем объект Fish.
  • Обязательно позвоните super.paintComponent(g) в качестве первой строки вашего метода JPanel paintComponent(Graphics g), чтобы старые чертежи были удалены.
  • Ваша логика цикла отключена. Если вы собираетесь создавать объекты внутри цикла for, вам нужно добавить их к чему-то изнутри цикла. Иначе все, что вы делаете, создает объекты и отбрасывает их, чтобы их не использовать.
  • Вам нужно научиться и придерживаться соглашений об именах Java. Имена классов, такие как DrawFish, должны начинаться с буквы верхнего регистра, а также методов и переменных с строчной буквой.
0

Область видимости переменной sPanel1 заканчивается, как только вы выходите из цикла.

Поэтому заменить

for(int i=0; i<fn; i++){ 
    drawFish sPanel1 = new drawFish(); 
} 

outer.add(sPanel1); 

с

for(int i=0; i<fn; i++){ 
    drawFish sPanel1 = new drawFish(); 
    outer.add(sPanel1); 
} 

Теперь будут добавлены все панели.

Также рассмотрите возможность использования LayeredPane. Надеюсь, это поможет.

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