在我创建JPanel的同一部分绘制网格线?

我需要为填字游戏构建网格线。 我想知道我是否可以在创建JPanel的同一部分和它的属性中执行它而不是在方法中执行它?

class CrosswordWindow extends JFrame { public JPanel crossPanel; public CrosswordWindow() { super("Crossword"); setLayout(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setResizable(false); /* bunch of buttons, labels, JLists etc. */ int size; crossPanel = new JPanel(); crossPanel.setBounds(240, 40, 680, 360); crossPanel.setBackground(Color.white); crossPanel.setBorder(BorderFactory.createEtchedBorder(1, Color.lightGray, Color.lightGray)); add(crossPanel); 

我正在努力为填字游戏绘制网格线。

首先,永远不要这样做: setLayout(null); 。 虽然null布局和setBounds()看起来像Swing新手一样,是创建复杂GUI的最简单和最好的方法,但是你创建的Swing GUI越多,在使用它们时就会遇到更严重的困难。 当GUIresize时,它们不会调整组件的大小,它们是增强或维护的皇室女巫,当它们被放置在滚动窗格中时它们完全失败,当它们在所有平台上观看时或者与原始平台不同的屏幕分辨率时它们看起来很糟糕。

但更多的是你原来的观点,我的建议不是绘制网格线。 相反,考虑使用包含GridLayout的JPanel,可以给它一个水平和垂直间隙为1,如果要显示网格线,则将背景设置为黑色,然后用接受单个字符的JLabel或JTextField填充它。

有一种方法可以做到这一点,我能想到的最简单的方法之一就是为每个单元格使用某种组件,并将一系列MatterBorder用作“网格线”

我也同意HovercraftFullOfEels,避免使用null布局,像素完美布局是现代UI设计中的错觉。 影响组件个体大小的因素太多,您无法控制。 Swing旨在与布局管理器一起工作,放弃这些将导致问题和问题的终结,您将花费越来越多的时间来纠正

在此处输入图像描述

 import java.awt.Color; import java.awt.EventQueue; import java.awt.GridLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.border.Border; import javax.swing.border.MatteBorder; public class Test { public static void main(String[] args) { new Test(); } public Test() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public static class TestPane extends JPanel { protected static final Border TOP_LEFT = new MatteBorder(1, 1, 1, 0, Color.DARK_GRAY); protected static final Border TOP_RIGHT = new MatteBorder(1, 1, 1, 1, Color.DARK_GRAY); protected static final Border BOTTOM_LEFT = new MatteBorder(0, 1, 1, 0, Color.DARK_GRAY); protected static final Border BOTTOM_RIGHT = new MatteBorder(0, 1, 1, 1, Color.DARK_GRAY); public TestPane() { setLayout(new GridLayout(10, 10)); for (int row = 0; row < 10; row++) { for (int col = 0; col < 10; col++) { Border border = null; int index = (row * 10) + col; if (row == 0) { if (col == 9) { border = TOP_RIGHT; } else { border = TOP_LEFT; } } else if (row == 9) { if (col == 9) { border = BOTTOM_RIGHT; } else { border = BOTTOM_LEFT; } } else if (col == 9) { border = BOTTOM_RIGHT; } else { border = BOTTOM_LEFT; } JLabel cell = new JLabel(" "); cell.setBorder(border); add(cell); } } } } } 

请查看如何使用边框 , 在容器中布置组件以及如何使用GridLayout获取更多详细信息