Domanda

sto lavorando sulla costruzione di una partita a scacchi in Java, e sto attualmente avendo un po 'di difficoltà a raggiungere l'interfaccia grafica esattamente come voglio con Swing. Sto utilizzando un GridLayout per organizzare una griglia di 8x8 ChessButtons (che esclude la JButton modo che possa conservare informazioni supplementari all'interno di essi, come coordinate). In origine, i ChessButtons non apparirebbero meno che il mouse su di loro, ma ho risolto il problema mettendo ogni ChessButton all'interno di una JPanel separato e regolazione setPreferredSize() di ciascun pulsante ad un'altezza set e la larghezza.

Ora, il mio problema è che sembra che ci sia un piccolo margine o padding sopra (e / o sotto?) Ogni pulsante. Ho fatto in modo di setHgap(0) set e setVgap(0) per il GridLayout, quindi sono abbastanza sicuro che il margine misteriosa proviene da entrambi i tasti o le JPanels. Ma, io non riesco a sbarazzarsi di loro, e sembrano essere la causa di ogni ChessButton a spostare un po 'su / giù ogni volta che il mouse di loro.

mi rendo conto questa descrizione del problema potrebbe essere un po 'difficile da visualizzare, così ho preso uno screenshot (utilizzando JButtons piuttosto che ChessButtons così le lacune sono leggermente più facili da riconoscere): http://img3.imageshack.us/img3/6656/jbuttonmargins.png

Ecco il codice che ho usato per inizializzare ogni ChessButton:

    chessBoard = new JPanel(new GridLayout(8, 8, 0, 0));
    chessBoard.setBorder(BorderFactory.createEmptyBorder());

    for (int i = 0; i <= 65; i++) {
            //Create a new ChessButton
            ChessButton button = new ChessButton("hi");
            button.setBorder(BorderFactory.createEmptyBorder());
            button.setPreferredSize(new Dimension(75, 75));
            button.setMargin(new Insets(0, 0, 0, 0));

            //Create a new JPanel that the ChessButton will go into
            JPanel buttonPanel = new JPanel();
            buttonPanel.setPreferredSize(new Dimension(75, 75));
            buttonPanel.setBorder(BorderFactory.createEmptyBorder());
            buttonPanel.add(button);

            //Add the buttonPanel to the grid
            chessBoard.add(buttonPanel);
    }

Quindi, come posso liberarmi di questi spazi verticali tra i pulsanti? Sono relativamente nuovo a Swing, quindi mi dispiace se la risposta è estremamente ovvia, ma Apprezzerei tutto l'aiuto che chiunque potrebbe avere da offrire! Grazie in anticipo!

È stato utile?

Soluzione

  

In origine, i ChessButtons sarebbe non appare a meno che il mouse su di loro, ma ho risolto il problema mettendo ogni ChessButton all'interno di un JPanel separato e regolazione setPreferredSize di ciascun pulsante () ad un'altezza e larghezza set

Questa non è la soluzione corretta. Non v'è alcun motivo per utilizzare un JPanel per tenere premuti i pulsanti. In realtà, questa è probabilmente la causa del problema. I pulsanti dovrebbero mostrare quando li si aggiunge ad un GridLayout. Se essi non si presentano proprio probabilmente perché si è aggiunto i pulsanti per la GUI dopo aver effettuato la GUI visibile. I componenti dovrebbero essere aggiunti alla GUI prima che sia reso visibile.

  

Ora, il mio problema è che sembra che ci sia un piccolo margine o padding sopra (e / o sotto?) Ogni pulsante

Non capisco perché non c'è anche un gap orizzontale. Quando si crea un JPanel, per default utilizza una FlowLayout che contiene anche una distanza orizzontale / verticale di 5 pixel. Così ho capito perché si potrebbe avere la distanza verticale di 10 pixel. Non capisco il motivo per cui non vi sia spazio orizzontale.

Se avete bisogno di più Aiuto Inserisci SSCCE dimostrando il problema. E lo SSCCE dovrebbe usare JButtons regolari. Ottenere le basi che lavorano con componenti standard, prima di iniziare a giocare con i componenti personalizzati. In questo modo si sa se il problema è con il vostro codice personalizzato o no.

Altri suggerimenti

Non aggiungere un confine vuoto; fare uso setBorderPainted(false) .

Addendum: Come @camickr note, il layout del pannello può includere spazi vuoti predefiniti. L'esempio che segue usi non-gap GridLayout conseguenza.

alt text

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

/** @see http://stackoverflow.com/questions/4331699 */
public class ButtonBorder extends JPanel {

    private static final int N = 8;
    private static final int SIZE = 75;

    public ButtonBorder() {
        super(new GridLayout(N, N));
        this.setPreferredSize(new Dimension(N * SIZE, N * SIZE));
        for (int i = 0; i < N * N; i++) {
            this.add(new ChessButton(i));
        }
    }

    private static class ChessButton extends JButton {

        public ChessButton(int i) {
            super(i / N + "," + i % N);
            this.setOpaque(true);
            this.setBorderPainted(false);
            if ((i / N + i % N) % 2 == 1) {
                this.setBackground(Color.gray);
            }
        }
    }

    private void display() {
        JFrame f = new JFrame("ButtonBorder");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new ButtonBorder().display();
            }
        });
    }
}

Prova ad aggiungere chessBoard.setPreferredSize (600, 600) per creare un JPanel per la scheda che solo ha spazio per montare i pulsanti (8 tasti a corsa * 75 dimensioni a tratta sui pulsanti).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top