Piszę taki program w którym są jakieś miasta na mapie a za pomocą przycisków tworzą się postacie, które później będą się poruszały po tej mapie pomiędzy miastami. Napisałam już klasę z panelem w którym ustawiłam miasta i zrobiłam klasę z przyciskiem który dodaje obrazek na mapie ( na razie jakiś tam byle się pokazywał) i ogólnie wszystko działa, miasta są na mapie od razu, poza tym, że obrazek od przycisku nie pojawia się od razu na mapie tylko muszę zmniejszyć rozmiar okna i dopiero wtedy się pojawia. Próbowałam już różnych sposobów z ustawianiem setVisible w różnych miejscach ale nic nie pomogło. Nie chce za bardzo ustawiać jakiegoś Layouta, bo te obrazki nie mogą być tak sztywno ustawione gdzieś. Tutaj jest mój kod:
Klasa z ramką:
package superworld;
import java.awt.*;
import javax.swing.*;
public class SuperWorld {
public static void main(String[] args) {
JFrame frame= new JFrame();
frame.setSize(1050,650);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(new SuperPanel(frame));
frame.pack();
frame.setVisible(true);
frame.setLayout(null);
// frame.setResizable(false);
}
}
Klasa z Panelem:
package superworld;
import javax.swing.*;
import java.awt.*;
import java.util.*;
import java.awt.event.*;
import javax.swing.Timer;
public class SuperPanel extends JPanel implements ActionListener{
JFrame frame;
Timer mainTimer;
public static final int HEIGHT = 550;
public static final int WIDTH = 1050;
int i;
int w=-100;
int h=-50;
ArrayList<SuperMiasto> miasta = new ArrayList<SuperMiasto>();
private JButton heroButton;
private JButton cywilButton;
public SuperPanel(JFrame frame) {
mainTimer = new Timer(10,this);
heroButton = new HeroButton(this);
cywilButton = new CywilButton(this);
setLayout(null);
setPreferredSize(new Dimension(WIDTH, HEIGHT));
setBackground(Color.GREEN);
for(i=0;i<10;i++)
{
miasta.add( new SuperMiasto() );
miasta.get(i).x=w;
miasta.get(i).y=h;
miasta.get(i).imagelabel = new JLabel(miasta.get(i).image);
miasta.get(i).imagelabel.setBounds(miasta.get(i).x,miasta.get(i).y,miasta.get(i).image.getIconWidth(),miasta.get(i).image.getIconHeight());
add(miasta.get(i).imagelabel);
w=w+200;
if (w > WIDTH-200)
{
h=h+200;
w=-100;
}
}
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
add(heroButton);
add(cywilButton);
frame.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
repaint();
}
}
A tutaj przycisk:
package superworld;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
class HeroButton extends JButton implements ActionListener {
private JPanel buttonPanel;
HeroButton(JPanel buttonPanel) {
super("Dodaj hero");
this.buttonPanel = buttonPanel;
setBounds(0,500,150,50);
addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
SuperLudzie batman = new SuperLudzie();
batman.imagelabel = new JLabel(batman.image);
batman.imagelabel.setBounds(50,50,batman.image.getIconWidth(),batman.image.getIconHeight());
buttonPanel.add(batman.imagelabel);
buttonPanel.setVisible(true);
}
}