簡體   English   中英

在Java中用數組創建多個標簽時出現異常(Swing)

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

就像標題所說的那樣,當我嘗試在一個數組中為100x100單元的GridLayout創建多個標簽時,我遇到了很多異常,我相信它應該很合適,但是當我嘗試創建Tiles時( JLabel的一個例外,它在表示地圖的面板內有x,y和類型變量),似乎有些東西在將它們繪制到某處時遇到了麻煩,試圖使用debug卻沒有獲得任何有關其發生原因的有用信息。

這是相關的代碼(不知道pastebin是否違反規則,但這會讓我的生活更輕松地向大家展示)

GUI類:

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

這是一個隔離的GUIJuego類,顯示了我認為引起問題的內容:

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

}

我認為問題出在GUI類之內,我的應用程序從第50行開始消亡。這是給我的錯誤的轉儲:

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)

編輯:平鋪類

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

}

新的信息:

那黑塊是什么?

在此處輸入圖片說明

這就是我應該在地圖應該位於的面板中看到的內容,我不知道這是否使我的問題更加清楚。

謝謝閱讀!

Tile類中,不要重寫getX()getY()方法。 這些是由JComponent()定義的方法。

相反,可以將getRow()和getColumn()以及setRow()和setColumn()一起使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM