在JButton的2D数组中,如何更改线?

时间:2019-06-07 01:12:53

标签: java arrays swing jbutton

我正在尝试创建2D按钮数组,但是我创建的按钮都在同一行中。我可以使用System.out.println()来更改int和float的2D数组中的行。我应该如何处理按钮? (第67至75行) 同样,我也不知道如何为循环中的按钮创建actionListeners。我应该为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 :(得分:0)

您可以使用网格布局,我可以更改原始代码(如下所示)。我建议为gui使用一些设计器,它更容易清洁。 Net Bean具有一个不错的grafic接口生成器。

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

    }

}

答案 1 :(得分:0)

我提供了GridLayout的示例,而不是修改您的代码。
GridLayoutJPanel的区域划分为一个网格,即一个行和列的表,其中网格中的每个“单元”可以包含一个组件,并且每个单元具有相同的大小。这是一个完整,可编译且可运行的示例。

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

这是正在运行的应用程序的屏幕截图。
(请注意,我在Windows 10上使用的是JDK 12。)

Hanoi