Как изменить строки в двумерном массиве кнопок JButton? - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь создать двумерный массив кнопок, но все созданные мной кнопки находятся в одной строке.Я могу изменить строки в двумерных массивах int и float с помощью System.out.println ().Что я должен так для кнопок?(строки с 67 по 75) Также я не знаю, как создавать actionListener для кнопок в цикле.Должен ли я создать метод для acctionLisener?У них один и тот же слушатель действий?

import java.awt.*;
import javax.swing.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JInternalFrame;

public class Hanoi {

    private JFrame frame;
    JButton[][] buttons= new JButton[3][3];

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Hanoi window = new Hanoi();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public Hanoi() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 901, 696);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panelone = new JPanel();
        frame.getContentPane().add(panelone, BorderLayout.CENTER);
        panelone.setBackground(Color.WHITE);
        GridBagLayout gbl_panelone = new GridBagLayout();
        gbl_panelone.columnWidths = new int[]{0};
        gbl_panelone.rowHeights = new int[]{0};
        gbl_panelone.columnWeights = new double[]{Double.MIN_VALUE};
        gbl_panelone.rowWeights = new double[]{Double.MIN_VALUE};
        panelone.setLayout(gbl_panelone);

        JPanel paneltwo = new JPanel();
        frame.getContentPane().add(paneltwo, BorderLayout.NORTH);
        paneltwo.setBackground(Color.WHITE);

        JLabel lblFunHanoiTower = new JLabel("Fun Hanoi Tower");
        lblFunHanoiTower.setForeground(Color.BLACK);
        lblFunHanoiTower.setBackground(SystemColor.activeCaption);
        lblFunHanoiTower.setFont(new Font("Viner Hand ITC", Font.PLAIN, 36));
        paneltwo.add(lblFunHanoiTower);

        //JButton[][] buttons = new JButton[3][3];

        for(int row = 0; row < buttons.length ; row++) {
            for(int col= 0; col < buttons[0].length ;col++) {
                buttons[row][col] = new JButton(String.valueOf((row+3)+(col*3)));
                buttons[row][col].setFont(new Font("Tempus Sans ITC", Font.BOLD, 16));
                buttons[row][col].setBackground(SystemColor.controlHighlight);
                buttons[row][col].setSize(66, 66);
                panelone.add(buttons[row][col]);
                }
            }

        }

}

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Вместо того, чтобы изменить ваш код, я привел пример GridLayout.
GridLayout делит область JPanel на сетку, то есть таблицу строк и столбцов, где каждая «ячейка» в сетке может содержать один компонент, и каждая ячейка имеет одинаковый размер. Вот полный, компилируемый и запускаемый пример.

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

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

public class Hanoi implements Runnable {

    @Override // java.lang.Runnable
    public void run() {
        showGui();
    }

    private JPanel createGridPanel() {

        // Number of rows will be calculated depending on total number
        // of components added but each row will contain no more than
        // three components.
        GridLayout gridLayout = new GridLayout(0, 3);

        JPanel gridPanel = new JPanel(gridLayout);
        for (int row = 0; row < 3; row++) {
            for (int col = 0; col < 3; col++) {
                int number = (row + 3) + (col * 3);
                String text = String.valueOf(number);
                JButton button = new JButton(text);
                gridPanel.add(button);
            }
        }
        return gridPanel;
    }

    private void showGui() {
        JFrame frame = new JFrame("Hanoi");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(createGridPanel(), BorderLayout.CENTER);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        Hanoi instance = new Hanoi();
        EventQueue.invokeLater(instance);
    }
}

А вот снимок экрана запущенного приложения.
(Обратите внимание, что я использую JDK 12 в Windows 10.)

Hanoi

0 голосов
/ 07 июня 2019

Вы можете использовать сетку, я изменяю ваш исходный код (как вы можете видеть ниже). Я рекомендую использовать какой-нибудь дизайнер для графического интерфейса, он более легкий и чистый. У сетевых бинов есть хороший конструктор интерфейсов.

public class Hanoi {

private JFrame frame;
JButton[][] buttons= new JButton[3][3];

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Hanoi window = new Hanoi();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public Hanoi() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 901, 696);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel panelone = new JPanel();
    panelone.setLayout(new GridLayout(3,3));
    frame.getContentPane().add(panelone);
    panelone.setBackground(Color.WHITE);
    /*GridBagLayout gbl_panelone = new GridBagLayout();
    gbl_panelone.columnWidths = new int[]{0};
    gbl_panelone.rowHeights = new int[]{0};
    gbl_panelone.columnWeights = new double[]{Double.MIN_VALUE};
    gbl_panelone.rowWeights = new double[]{Double.MIN_VALUE};*/
   // panelone.setLayout(gbl_panelone);

    JPanel paneltwo = new JPanel();
    frame.getContentPane().add(paneltwo, BorderLayout.NORTH);
    paneltwo.setBackground(Color.WHITE);

    JLabel lblFunHanoiTower = new JLabel("Fun Hanoi Tower");
    lblFunHanoiTower.setForeground(Color.BLACK);
    lblFunHanoiTower.setBackground(SystemColor.activeCaption);
    lblFunHanoiTower.setFont(new Font("Viner Hand ITC", Font.PLAIN, 36));
    paneltwo.add(lblFunHanoiTower);

    //JButton[][] buttons = new JButton[3][3];

    for(int row = 0; row < buttons.length ; row++) {
        for(int col= 0; col < buttons[0].length ;col++) {
            buttons[row][col] = new JButton(String.valueOf((row+3)+(col*3)));
            buttons[row][col].setFont(new Font("Tempus Sans ITC", Font.BOLD, 16));
            buttons[row][col].setBackground(SystemColor.controlHighlight);
            buttons[row][col].setSize(66, 66);
            panelone.add(buttons[row][col]);
            }
        }

    }

}

...