Połączenie n-JLabeli w jedno? Czy jest to możliwe?

0

Cześć,

pytanie krótkie choć być może treściwe. Da się połączyć np. dwa JLabele w jednego?

Mam mapę, która składa się z 25x25 kratek o wymiarach 32px x 32px. Tworzę ją w funkcji, która jako wynik ostateczny zwraca pojedynczego JLabela. I właśnie utworzoną mapę chciałbym wrzucić jako jeden, duży obrazek. Jest to możliwe?

Mniej więcej w pseudokodzie wyglądało by to tak:

    public JLabel loadMap(int number_map)
    {        
        int mapaIntow[][];       //tu sa wrzucane numerki odpowiadajace obrazkom, ktore za chwile zostana wczytane
        JLabel mapaJLabeli[][];  //tu sa wrzucane JLabele, ktore wyswietlaja obrazki
        JLabel mapa;
        
        mapaIntow = wczytajMapeZPlikuTekstowego(number_map+".txt");
        mapaLabeli = polaczTabliceIntowZObrazkami(mapaIntow);
        mapa = polaczObrazkiWJeden(mapaLabeli);
        
        return mapa;
    }
0

A dlaczego Twoja funkcja zwraca JLabel a nie obrazek? Jeśli tak musi zostać, to pobierz obrazki z JLabel, posklejaj je i przekonwertuj na JLabel.

0

Dopiero co zacząłem korzystać z bibliotek swinga (bo chyba to zawiera w sobie labele itd.) i postanowiłem obrazki wrzucać do JLabela - spośród wszystkich innych typów przeznaczonych do obrazków jak np. BufferedImage, ten wydawał się najłatwiejszy i spełniający moje wymagania.

Ale nie do tego dążymy. Napisałeś "Posklejaj je". No właśnie po to powstał ten wątek. Jak?

Być może bardzo źle podchodzę do tego typu sprawy. Powinienem zrezygnować z JLabel i zastąpić to np. Graphics?

Ewentualnie mogę zrobić coś takiego, ale nie rozumiem, czemu mi tego obrazka nie wyświetla na ekranie.

package test;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

import javax.swing.JFrame;

/**
 *
 * @author Lukasz
 */    

public class Test extends JFrame {
  public Test() throws IOException, Exception {
     setSize(800, 600);
     setResizable(false);
     setLocation(300, 300);
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
     File plik1 = new File("test.jpg");
     
     BufferedImage img = ImageIO.read(plik1);
     
     img.createGraphics().drawImage(img, 0, 0, null);
      setVisible(true);
  }

  public static void main(String[] args) {
    try{
      Test okno = new Test();
    }
    catch (Exception e)
    {
        System.out.println();
    }
  }
}
0

Źle podchodzisz to tego zagadnienia. Zwracaj z funkcji obrazki, a nie obiekty JLabel.

1

Źle rysujesz, rysowanie powinno być w metodzie paintComponent jakiegoś panelu, ewentualnie w metodzie paint całego okna. Drugie rozwiązanie jest gorsze, bo współrzędne podajesz względem okna - musisz jakoś uwzględnić rozmiar belki tytułowej i obramowania.
Masz koszmarną obsługę obłędów - czego się dowiesz jeśli wystąpi jakiś wyjątek?

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.awt.*; 
import javax.swing.*;  
 
public class Test extends JFrame {
    BufferedImage img;  
    public Test(){
        setResizable(false);
        setLocation(300, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        try{
            File plik1 = new File("test.jpg");
            img = ImageIO.read(plik1);
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
        add(new MyPanel());
        pack();
        setVisible(true);
    }
    class MyPanel extends JPanel
    {
        public MyPanel()
        {
            setBackground(Color.WHITE);
            setPreferredSize(new Dimension(800,600));
        }
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            g.drawImage(img,0,0,null);
        }
    }
    public static void main(String[] args) {
        Test okno = new Test();
    }
}
0

Działa, dziękuję :)

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