繁体   English   中英

矩阵方括号

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

输出: 输出矩阵

但我需要有一个大的连接方括号如下: 在此输入图像描述

所以我正在寻找如何做到这一点,我发现这个链接https://docs.oracle.com/javase/tutorial/uiswing/components/border.html但它不包含我需要的括号,也找到了这https://team.mumie.net/mumie/mathletfactory_lib_apidocs/net/mumie/mathletfactory/display/noc/matrix/MatrixBorder.html#MatrixBorder%28java.awt.Component,%20int%29但我没有找到任何如何使用它的例子。

基于nIcE cOw对上述注释之一的回答 ,您需要创建自己的CustomBorder类,该类扩展AbstractBorder并覆盖其paintBorder()方法以绘制括号的每个部分。

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

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

以下是输出结果的截图:

有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的期望输出中显示行和列号,我将其留下,因为这个问题只与方括号有关

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM