简体   繁体   中英

Getting an exception as I create several labels off an array in Java (Swing)

as the title says, I'm getting a bunch of exceptions while trying to create several labels off an array into a GridLayout of a 100x100 cells, I believed it was supposed to fit perfectly but as I try to create the Tiles (which are merely an exception to JLabel with x,y and type variables) inside the panel which would represent the map, it seems that something is having trouble drawing them somewhere, been trying to use debug but haven't got any useful information about why it's happening.

This is the pertinent code (don't know if pastebin is against the rules, but it will make my life easier showing it to you all)

GUI class:

package gui;

import java.awt.BorderLayout;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class GUIJuego extends JFrame{

    private JButton botonConstruirEscuela = new JButton("Escuela");
    private JButton botonConstruirComisaria = new JButton("Comisaria");
    private JButton botonConstruirCuartel = new JButton("Cuartel de Bomberos");

    private JButton botonConstruirArbol = new JButton("Arbol");

    private JButton botonConstruirCasa = new JButton("Casa");
    private JButton botonConstruirComercio = new JButton("Comercio");
    private JButton botonConstruirIndustria = new JButton("Industria");

    private Tile[][] mapaTiles = new Tile[100][100];

    private JLabel arcaLabel = new JLabel("Arca");
    private JLabel puntosBellezaLabel = new JLabel("Puntos de Belleza");
    private JLabel habitantesLabel = new JLabel("Habitantes");

    public GUIJuego(){

        JPanel panelConstruccion = new JPanel(new GridLayout(7,1));
        JPanel panelDatosCiudad = new JPanel(new GridLayout(1,3));
        JPanel panelMapa = new JPanel(new GridLayout(100,100));

        add(panelConstruccion, BorderLayout.WEST);
        panelConstruccion.add(botonConstruirEscuela);
        panelConstruccion.add(botonConstruirComisaria);
        panelConstruccion.add(botonConstruirCuartel);
        panelConstruccion.add(botonConstruirArbol);
        panelConstruccion.add(botonConstruirCasa);
        panelConstruccion.add(botonConstruirComercio);
        panelConstruccion.add(botonConstruirIndustria);

        add(panelDatosCiudad, BorderLayout.NORTH);
        panelDatosCiudad.add(arcaLabel);
        panelDatosCiudad.add(puntosBellezaLabel);
        panelDatosCiudad.add(habitantesLabel);

        add(panelMapa, BorderLayout.CENTER);
        cargarTiles(panelMapa);

    }

    private void cargarTiles(JPanel panel){

        for(int i = 0; i < 100; i++){
            for(int j = 0; j < 100; j++){
                mapaTiles[i][j] = new Tile(i, j, 0);
                asignarTile(mapaTiles[i][j], panel);
            }
        }

    }

    private void asignarTile(Tile tile, JPanel panel){

        if(tile.getTipo() == 0){
            tile.setText("Pasto");
            panel.add(tile);
        }
    }
}

This is an isolated GUIJuego class, showing what I believe is causing problems:

public class GUIJuego extends JFrame{

    private Tile[][] mapaTiles = new Tile[100][100];

    public GUIJuego(){

        JPanel panelMapa = new JPanel(new GridLayout(100,100));
        add(panelMapa, BorderLayout.CENTER);
        cargarTiles(panelMapa);
    }

    private void cargarTiles(JPanel panel){

        for(int i = 0; i < 100; i++){
            for(int j = 0; j < 100; j++){
                mapaTiles[i][j] = new Tile(i, j, 0);
                asignarTile(mapaTiles[i][j], panel);
            }
        }

    }

    private void asignarTile(Tile tile, JPanel panel){

        if(tile.getTipo() == 0){
            tile.setText("Pasto");
            panel.add(tile);
        }
    }

}

I believe the issue is within the GUI Class, the demise of my application starting at line 50. This is the dump of the errors it gives me:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Comparison method violates its general contract!
        at java.util.TimSort.mergeLo(Unknown Source)
        at java.util.TimSort.mergeAt(Unknown Source)
        at java.util.TimSort.mergeCollapse(Unknown Source)
        at java.util.TimSort.sort(Unknown Source)
        at java.util.TimSort.sort(Unknown Source)
        at java.util.Arrays.sort(Unknown Source)
        at java.util.Collections.sort(Unknown Source)
        at javax.swing.SortingFocusTraversalPolicy.enumerateAndSortCycle(Unknown Source)
        at javax.swing.SortingFocusTraversalPolicy.getFocusTraversalCycle(Unknown Source)
        at javax.swing.SortingFocusTraversalPolicy.getFirstComponent(Unknown Source)
        at javax.swing.LayoutFocusTraversalPolicy.getFirstComponent(Unknown Source)
        at javax.swing.SortingFocusTraversalPolicy.getDefaultComponent(Unknown Source)
        at java.awt.FocusTraversalPolicy.getInitialComponent(Unknown Source)
        at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
        at java.awt.Component.dispatchEventImpl(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Window.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
        at java.awt.EventQueue.access$200(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.SequencedEvent.dispatch(Unknown Source)
        at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
        at java.awt.EventQueue.access$200(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Comparison method violates its general contract!
        at java.util.TimSort.mergeLo(Unknown Source)
        at java.util.TimSort.mergeAt(Unknown Source)
        at java.util.TimSort.mergeCollapse(Unknown Source)
        at java.util.TimSort.sort(Unknown Source)
        at java.util.TimSort.sort(Unknown Source)
        at java.util.Arrays.sort(Unknown Source)
        at java.util.Collections.sort(Unknown Source)
        at javax.swing.SortingFocusTraversalPolicy.enumerateAndSortCycle(Unknown Source)
        at javax.swing.SortingFocusTraversalPolicy.getFocusTraversalCycle(Unknown Source)
        at javax.swing.SortingFocusTraversalPolicy.getFirstComponent(Unknown Source)
        at javax.swing.LayoutFocusTraversalPolicy.getFirstComponent(Unknown Source)
        at javax.swing.SortingFocusTraversalPolicy.getDefaultComponent(Unknown Source)
        at java.awt.FocusTraversalPolicy.getInitialComponent(Unknown Source)
        at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
        at java.awt.Component.dispatchEventImpl(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Window.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
        at java.awt.EventQueue.access$200(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.SequencedEvent.dispatch(Unknown Source)
        at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
        at java.awt.EventQueue.access$200(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)

EDIT: Tile Class

import javax.swing.JLabel;

public class Tile extends JLabel{

    private int x, y, tipo;

    public int getX() {
            return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getTipo(){
        return tipo;
    }

    public void setTipo(int tipo){
        if(tipo >= 0 || tipo <= 6)
            this.tipo = tipo;
    }

    public Tile(int x, int y, int tipo) {
        this.setX(x);
        this.setY(y);
            this.setTipo(tipo);
    }

}

New information:

What is that black block?

在此处输入图片说明

That's what I get in the panel where the map is supposed to be, I don't know if that makes my issue clearer.

Thanks for reading!

In the Tile class don't override getX() and getY() methods. Those are methods defined by JComponent().

Instead maybe use getRow() and getColumn() along with setRow() and setColumn().

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM