Java 在JFrame中绘制网格

Java 在JFrame中绘制网格,java,swing,Java,Swing,我现在有一个9x9的按钮网格,我想在这些按钮之间画一些线,将它们分开,形成一个3x3的网格 我在另一个窗口的JPanel中尝试了我的方法,效果很好,但我无法在按钮旁边的JFrame中使用它,因为它什么也没画。 每个按钮之间已经有一些空间,所以我们可以看到线是否在那里 非常感谢你以后的帮助 代码如下: import javax.swing.*; import java.awt.*; public class ButtonGrid extends JPanel{ JFrame frame=new

我现在有一个9x9的按钮网格,我想在这些按钮之间画一些线,将它们分开,形成一个3x3的网格

我在另一个窗口的JPanel中尝试了我的方法,效果很好,但我无法在按钮旁边的JFrame中使用它,因为它什么也没画。 每个按钮之间已经有一些空间,所以我们可以看到线是否在那里

非常感谢你以后的帮助

代码如下:

import javax.swing.*;
import java.awt.*;

public class ButtonGrid extends JPanel{

JFrame frame=new JFrame();
int t = 9;

public ButtonGrid(){ //constructor
    frame.setLayout(new GridLayout(t, t, 3, 3));
    addButtons(frame, t);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.pack(); 
    frame.setVisible(true); 

}

@Override public void paint(Graphics g) {
    g.setColor(getBackground());
    g.fillRect(0, 0, getWidth(), getHeight());
    g.setColor(Color.BLACK);
    for (int i = 0; i <= 9; i++) {
        if (i % 3 == 0) {
            int coord = i * 58;
            coord++;
            g.drawLine(coord, 0, coord, 58*9);
            g.drawLine(0, coord, 58*9, coord);
        }
    }
}

private void addButtons(JFrame frame, int t){
    JButton grid;
    for(int y=0; y<t; y++){
        for(int x=0; x<t; x++){
            grid=new JButton(x+","+y); //creates new button
            grid.setPreferredSize(new Dimension(55,55));
            frame.add(grid); //adds button to grid

        }
    }
}

public static void main(String[] args) {
    new ButtonGrid();
}
import javax.swing.*;
导入java.awt.*;
公共类ButtonGrid扩展了JPanel{
JFrame=新JFrame();
int t=9;
public ButtonGrid(){//构造函数
frame.setLayout(新的GridLayout(t,t,3,3));
添加按钮(帧,t);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
@替代公共空白绘制(图形g){
g、 setColor(getBackground());
g、 fillRect(0,0,getWidth(),getHeight());
g、 设置颜色(颜色为黑色);

对于(int i=0;i永远不要像您尝试做的那样直接在JFrame上绘制。如果您不知道自己在做什么(例如,您没有调用super的paint方法,并且无意中以这种方式破坏了绘制链),那么绘制的图像将不会显示,因为它们将被不透明的contentPane覆盖

如果您需要绘制,请在JFrame内显示的JPanel中进行绘制,但同样根据下面的示例,如果您想要的只是网格中的黑色直线,则无需绘制

使用GridLayout,并在布局中设置一些间隙。请理解GridLayout构造函数的第3个和第4个参数将为您提供间隙。然后为基础JPanel提供一个Color.BLACK背景,您就可以看到:lines!例如JTextFields:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class SudokuMCVE extends JPanel {
    private static final int CLUSTER = 3;
    private static final int MAX_ROWS = 9;
    private static final float FIELD_PTS = 32f;
    private static final int GAP = 3;
    private static final Color BG = Color.BLACK;
    private static final Color SOLVED_BG = Color.LIGHT_GRAY;
    public static final int TIMER_DELAY = 2 * 1000;
    private JTextField[][] fieldGrid = new JTextField[MAX_ROWS][MAX_ROWS];

    public SudokuMCVE() {
        JPanel mainPanel = new JPanel(new GridLayout(CLUSTER, CLUSTER));
        mainPanel.setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
        mainPanel.setBackground(BG);
        JPanel[][] panels = new JPanel[CLUSTER][CLUSTER];
        for (int i = 0; i < panels.length; i++) {
            for (int j = 0; j < panels[i].length; j++) {
                panels[i][j] = new JPanel(new GridLayout(CLUSTER, CLUSTER, 1, 1));
                panels[i][j].setBackground(BG);
                panels[i][j].setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
                mainPanel.add(panels[i][j]);
            }
        }

        for (int row = 0; row < fieldGrid.length; row++) {
            for (int col = 0; col < fieldGrid[row].length; col++) {
                fieldGrid[row][col] = createField(row, col);
                int i = row / 3;
                int j = col / 3;
                panels[i][j].add(fieldGrid[row][col]);
            }
        }

        setLayout(new BorderLayout());
        add(mainPanel, BorderLayout.CENTER);
        add(new JButton(new SolveAction("Solve")), BorderLayout.PAGE_END);
    }

    private JTextField createField(int row, int col) {
        JTextField field = new JTextField(2);
        field.setHorizontalAlignment(JTextField.CENTER);
        field.setFont(field.getFont().deriveFont(Font.BOLD, FIELD_PTS));

        return field;
    }

    private class SolveAction extends AbstractAction {

        public SolveAction(String name) {
            super(name);
            int mnemonic = (int) name.charAt(0);
            putValue(MNEMONIC_KEY, mnemonic);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            new Timer(TIMER_DELAY, new ActionListener() {
                private int i = 0;
                private int j = 0;

                @Override
                public void actionPerformed(ActionEvent e) {
                    // MAX_ROWS is 9
                    if (i == MAX_ROWS) {
                        ((Timer) e.getSource()).stop();
                    }
                    if (j == MAX_ROWS) {
                        i++;
                        j = 0;
                    }
                    int number = (int) (MAX_ROWS * Math.random()) + 1;
                    fieldGrid[i][j].setBackground(SOLVED_BG);
                    fieldGrid[i][j].setText(String.valueOf(number));

                    j++;
                }
            }).start();
        }
    }

    private static void createAndShowGui() {
        SudokuMCVE mainPanel = new SudokuMCVE();

        JFrame frame = new JFrame("SudokuMCVE");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            createAndShowGui();
        });
    }
}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Font;
导入java.awt.GridLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.*;
公共类SudokuMCVE扩展了JPanel{
私有静态final int CLUSTER=3;
私有静态最终int MAX_行=9;
专用静态最终浮点字段_PTS=32f;
专用静态最终内部间隙=3;
专用静态最终颜色BG=Color.BLACK;
私有静态最终颜色已解决\u BG=Color.LIGHT\u GRAY;
公共静态最终整数定时器延迟=2*1000;
私有JTextField[][]fieldGrid=新JTextField[MAX_ROWS][MAX_ROWS];
公共SudokuMCVE(){
JPanel主面板=新JPanel(新网格布局(集群,集群));
mainPanel.setBorder(BorderFactory.createEmptyByOrder(间隙,间隙,间隙));
主面板立根接地(BG);
JPanel[][]面板=新的JPanel[集群][集群];
对于(int i=0;i{
createAndShowGui();
});
}
}
显示为:

或使用JButtons:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.*;

@SuppressWarnings("serial")
public class JPanelGrid extends JPanel {
    private static final int SML_SIDE = 3;
    private static final int SIDE = SML_SIDE * SML_SIDE;
    private static final int GAP = 3;
    private static final Color BG = Color.BLACK;
    private static final Dimension BTN_PREF_SIZE = new Dimension(80, 80);
    private JButton[][] buttons = new JButton[SIDE][SIDE];

    public JPanelGrid() {
        setBackground(BG);
        setLayout(new GridLayout(SML_SIDE, SML_SIDE, GAP, GAP));
        setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
        JPanel[][] smallPanels = new JPanel[SML_SIDE][SML_SIDE];
        for (int i = 0; i < smallPanels.length; i++) {
            for (int j = 0; j < smallPanels[i].length; j++) {
                smallPanels[i][j] = new JPanel(new GridLayout(SML_SIDE, SML_SIDE));
                add(smallPanels[i][j]);
            }
        }
        for (int i = 0; i < buttons.length; i++) {
            int panelI = i / SML_SIDE;
            for (int j = 0; j < buttons[i].length; j++) {
                int panelJ = j / SML_SIDE;
                String text = String.format("[%d, %d]", j, i);
                buttons[i][j] = new JButton(text);
                buttons[i][j].setPreferredSize(BTN_PREF_SIZE);
                smallPanels[panelI][panelJ].add(buttons[i][j]);
            }
        }
    }

    private static void createAndShowGui() {
        JPanelGrid mainPanel = new JPanelGrid();

        JFrame frame = new JFrame("JPanelGrid");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            createAndShowGui();
        });
    }
}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.GridLayout;
导入javax.swing.*;
@抑制警告(“串行”)
公共类JPanelGrid扩展了JPanel{
专用静态最终int SML_侧=3;
专用静态最终内部侧=SML\U侧*SML\U侧;
专用静态最终内部间隙=3;
专用静态最终颜色BG=Color.BLACK;
专用静态最终尺寸BTN_PREF_SIZE=新尺寸(80,80);
私有JButton[][]按钮=新JBut
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;

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

public class ButtonGrid extends JPanel {

    JFrame frame = new JFrame();
    int t = 9;

    public ButtonGrid() { // constructor
        frame.setContentPane(this);
        setLayout(new GridLayout(t, t, 3, 3));
        addButtons(t);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);

    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
//      g.setColor(getBackground());
//      g.fillRect(0, 0, getWidth(), getHeight());
        g.setColor(Color.RED);
        for (int i = 0; i <= 9; i++) {
            if (i % 3 == 0) {
                int coordx = getWidth() * i / 9;
                int coordy = getHeight() * i / 9;
                g.drawLine(coordx, 0, coordx, getHeight());
                g.drawLine(0, coordy, getWidth(), coordy);
            }
        }
    }

    private void addButtons(int t) {
        JButton grid;
        for (int y = 0; y < t; y++) {
            for (int x = 0; x < t; x++) {
                grid = new JButton(x + "," + y); // creates new button
                grid.setPreferredSize(new Dimension(55, 55));
                add(grid); // adds button to grid

            }
        }
    }

    public static void main(String[] args) {
        new ButtonGrid();
    }
}