سؤال

أنا أعمل على بناء لعبة شطرنج في Java ، وأواجه حاليًا بعض المتاعب في الحصول على واجهة المستخدم الرسومية تمامًا بالطريقة التي أريدها مع الأرجوحة. أنا أستخدم A. GridLayout لتنظيم شبكة 8x8 ChessButtonS (الذي تجاوز JButton حتى أتمكن من تخزين معلومات إضافية بداخلها مثل الإحداثيات). في الأصل ، ChessButtonلن يظهر S إلا إذا كنت أتعامل معهم ، لكنني حلت هذه المشكلة عن طريق وضع كل منها ChessButton داخل منفصلة JPanel ووضع كل زر setPreferredSize() إلى ارتفاع ارتفاع وعرض.

الآن ، مشكلتي هي أنه يبدو أن هناك هامشًا صغيرًا أو حشوة أعلاه (و/أو أدناه؟) كل زر. لقد حرصت على ضبط setHgap(0) و setVgap(0) ل GridLayout, ، لذلك أنا متأكد من أن الهامش الغامض يأتي من الأزرار أو JPanelس. لكن لا يمكنني التخلص منها ، ويبدو أنها تسبب كل منها ChessButton للتحول قليلا لأعلى/لأسفل كلما كنت ماوس منهم.

أدرك أن هذا الوصف للمشكلة قد يكون من الصعب تصوره ، لذلك أخذت لقطة شاشة (باستخدام JButtonS بدلا من ChessButtonS حتى تكون الفجوات أسهل قليلاً في التعرف عليها): http://img3.imageshack.us/img3/6656/jbuttonmargins.png

هنا هو الرمز الذي اعتدت عليه لتهيئة كل منهما 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);
    }

لذا ، كيف يمكنني التخلص من هذه المساحات الرأسية بين الأزرار؟ أنا جديد نسبيًا في التأرجح ، لذلك أنا آسف إذا كانت الإجابة واضحة للغاية ، لكنني أقدر أي مساعدة قد يتعين على أي شخص تقديمها! شكرا مقدما!

هل كانت مفيدة؟

المحلول

في الأصل ، لن يظهر Chessbuttons إلا إذا قمت بتشويشهم ، لكنني حلت هذه المشكلة عن طريق وضع كل Chessbutton داخل jpanel منفصل ووضع SetPreferredSize () على ارتفاع محدد

هذا ليس الحل المناسب. لا يوجد سبب لاستخدام jpanel لعقد الأزرار. في الواقع ، ربما هذا هو سبب المشكلة. يجب أن تظهر الأزرار عند إضافتها إلى GridLayout. إذا لم يظهروا على الأرجح لأنك أضفت الأزرار إلى واجهة المستخدم الرسومية بعد جعل واجهة المستخدم الرسومية مرئية. يجب إضافة المكونات إلى واجهة المستخدم الرسومية قبل أن تُظهر.

الآن ، مشكلتي هي أنه يبدو أن هناك هامشًا صغيرًا أو حشوة أعلاه (و/أو أدناه؟) كل زر

لا أفهم لماذا لا توجد أيضًا فجوة أفقية. عندما تقوم بإنشاء JPanel ، فإنه يستخدم بشكل افتراضي flowlayout يحتوي أيضًا على فجوة أفقية/عمودية تبلغ 5 بكسل. لذلك أفهم لماذا قد يكون لديك الفجوة الرأسية من 10 بكسل. لا أفهم لماذا لا توجد فجوة أفقية.

إذا كنت بحاجة إلى مزيد من المساعدة نشر SSCCE إظهار المشكلة. ويجب أن تستخدم SSCCE JButtons العادية. احصل على الأساسيات التي تعمل مع المكونات القياسية قبل البدء في اللعب بمكونات مخصصة. وبهذه الطريقة تعرف ما إذا كانت المشكلة مع رمزك المخصص أم لا.

نصائح أخرى

لا تضيف حدود فارغة. لا تستخدم setBorderPainted(false).

إضافة: كما يلاحظ Camickr ، قد يتضمن تخطيط اللوحة فجوات افتراضية. المثال أدناه يستخدم الفجوة GridLayout وفقاً لذلك.

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

حاول إضافة chessboard.setpreferredsize (600 ، 600) لإنشاء jpanel للوحة التي لديها مساحة فقط لتناسب الأزرار (8 أزرار في كل طريقة * 75 حجم في الأزرار).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top