Obraz nie pojawia się od razu po wciśnięciu przycisku.

0

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);
              
	}
} 
1

Musisz zrobić repaint panelu do którego dodano button.

0

Zadziałało, stokrotnie ci dziękuje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1