矩阵方括号

Matrix square brackets

我正在使用 Java Swing,我需要显示一个带有方括号的矩阵(普通方括号就像我们在数学中使用的跨越多行的方括号),矩阵大小不固定,这取决于输入。

这是我用来显示矩阵的代码:

public static void printMatrix(String[][] matrix) {
        String output = "";
        for (int x = 0; x < matrix.length; x++) {
            output += Arrays.toString(matrix[x]) + "\n";
        }
        JOptionPane.showMessageDialog(null, output, "Matrix",
                JOptionPane.INFORMATION_MESSAGE);
    }

输出:

但是我需要一个大的连接方括号如下:

所以我正在搜索如何执行此操作,我找到了这个 link https://docs.oracle.com/javase/tutorial/uiswing/components/border.html but it doesn't contain the brackets that I need and also found this https://team.mumie.net/mumie/mathletfactory_lib_apidocs/net/mumie/mathletfactory/display/noc/matrix/MatrixBorder.html#MatrixBorder%28java.awt.Component,%20int%29 但我没有找到任何有关如何使用它的示例。

基于nIcE cOw的answer on one of my above comments, you need to create your own CustomBorder class that extends AbstractBorder and override its paintBorder()方法绘制括号的各个部分

在这种情况下,我将此任务分为 3 个部分,两个括号的顶部/底部/左侧和右侧部分。

internalGap变量是应该在内容和边框之间的space

以下是输出结果的一些屏幕截图:

有 2 个、6 个和 10 个元素

产生上述输出的代码是:

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Insets;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.AbstractBorder;

public class EquationMatrixBorder {

    private JPanel pane;
    private CustomBorder customBorder;
    private static final int ROWS_AND_COLS = 1;

    private void displayGUI() {
        JFrame frame = new JFrame("Custom Border Example");

        customBorder = new CustomBorder(Color.RED, 15, 10);
        pane = new JPanel();
        
        pane.setLayout(new GridLayout(ROWS_AND_COLS, ROWS_AND_COLS, 15, 15));
        //Used to fill the grid, not relevant to question
        Random random = new Random();
        for (int i = 0; i < ROWS_AND_COLS; i++) {
            for (int j = 0; j < ROWS_AND_COLS; j++) {
                int r = 0;
                if (j % 2 == 0) {
                    r = random.nextInt(2);
                } else {
                    r = random.nextInt(2) - 1;
                }
                pane.add(new JLabel(String.valueOf(r)));
            }
        }
        
        pane.setBorder(customBorder);
        frame.add(pane);
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                new EquationMatrixBorder().displayGUI();
            }
        };
        EventQueue.invokeLater(runnable);
    }
}

class CustomBorder extends AbstractBorder {
    
    private Color color;
    private int gap;
    private int bracketsTopAndBottom = 10;
    private int internalGap;
    
    public CustomBorder(Color color, int gap, int internalGap) {
        this.color = color;
        this.gap = gap;
        this.internalGap = internalGap;
    }
    
    @Override
    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
        super.paintBorder(c, g, x, y, width, height);
        Graphics2D g2d = null;
        if (g instanceof Graphics2D) {
            g2d = (Graphics2D) g;
            g2d.setColor(color);
            g2d.setStroke(new BasicStroke(3));
            
            //top part of brackets
            g2d.drawLine(x + gap, y + gap, x + gap + bracketsTopAndBottom, (y +  gap));
            g2d.drawLine(width - x - gap - bracketsTopAndBottom, y + gap, width - gap - x, (y +  gap));
            
            //bottom part of brackets
            g2d.drawLine(x + gap, height - gap, x + gap + bracketsTopAndBottom, height - gap);
            g2d.drawLine(width - x - gap - bracketsTopAndBottom, height - gap, width - gap - x, height - gap);
            
            //left and right part of brackets
            g2d.drawLine(x + gap, y + gap, x + gap, height - gap);
            g2d.drawLine(width - x - gap, y + gap, width - x - gap, height - gap);
        }
    }
    
    @Override
    public Insets getBorderInsets(Component c) {
        return getBorderInsets(c, new Insets(gap, gap, gap, gap));
    }
    
    @Override
    public Insets getBorderInsets(Component c, Insets insets) {
        insets.left = insets.top = insets.right = insets.bottom = gap + internalGap;
        return insets;
    }
}

备注

我没有完成 OP 所需输出中显示的行数和列数,我将其省略,因为这个问题仅与方括号有关