[英]Creating a visible grid in a JPanel
我想創建一個API(個人),允許我輸入一個尺寸(例如10x10),並創建一個由10平方乘10平方的可見網格,並具有增加的“功能”,可以更改任何通過方法調用平方。 不嘗試使用mouse listener
或任何類型的任何listener
。
我的想法過程是這樣的:讓主JPanel
遞歸地保存網格,添加“框” objects
並用array
位置引用每個objects
。 我的問題不是主要的JPanel
,我已經很輕松地JPanel
了下來。 我的問題是它添加的object
。 我不知道這應該是哪種component
。 我嘗試使用JPanel
但看不到任何東西。 此外,“網格”外觀也不會出現。
我猜想我將不得不利用swing.Graphics
或Graphics2D
但是我在網上找到的每個示例對我來說都不是一件swing.Graphics
。 尋找有關使用Graphics
建議,或者如果有一種更好的方法來獲得我想要的東西,我很樂意嘗試一下。
有一個MainPanel
類,該類接受尺寸標注,並根據指定的尺寸將其布局設置為GridLayout
。
public class MainPanel extends JPanel { public MainPanel(int rows, int cols) { setLayout(new GridLayout(rows, cols)); } }
創建一個具有draw()
方法的接口
public interface Drawable { void draw(Graphics g); }
創建一個具有Drawable
屬性的自定義面板,在其中將其稱為draw方法
public class DrawPanel extends JPanel { private Drawable drawable; public DrawPanel() {} public DrawPanel(Drawable drawable) { this.drawable = drawable; } public void setDrawable(Drawable drawable) { this.drawable = drawable; repaint(); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (drawable != null) { drawable.draw(g); } } }
創建的二維數組DrawPanels
在MainPanel
類,只是你可以通過索引來訪問他們,如果你需要到
public class MainPanel extends JPanel { private DrawPanel[][] panels; public MainPanel(int rows, int cols) { setLayout(new GridLayout(rows, cols)); panels = new DrawPanel[rows][cols]; } }
用new DrawPanel
填充數組並將其添加到MainPanel
for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { DrawPanel panel = new DrawPanel(); panels[i][j] = panel; MainPanel.this.add(panel); } }
使用您想要的任何/多少個實現來實現Drawable
接口。 喜歡
public class Ball implements Drawable { private int x, y; private JPanel surface; public Ball(int x, int y, JPanel surface) { this.x = x; this.y = y; this.surface = surface; } @Override public void draw(Graphics g) { g.fillOval(x, y, sirface.getWidth(), surface.getHeight()); } }
將可繪制對象添加到面板
JPanel panel = panels[3][4]; panel.setDrawable(new Ball(0, 0, panel));
您可以根據需要創建Drawable
許多不同實現,並且每個面板可以繪制一個不同的對象。
public class Midget implements Drawable { @Override public void draw(Graphics g) { // draw midget } } .... panels[5][5].setDrawable(new Midget());
使用JLabel
嘗試以下示例代碼
JPanel panel = new JPanel(new GridLayout(10, 10));
JLabel[] labels = new JLabel[20];
Color[] colors = new Color[] { Color.GREEN, Color.RED, Color.BLUE };
Random random = new Random();
for (int i = 0; i < labels.length; i++) {
JLabel label = new JLabel();
label.setBackground(colors[random.nextInt(colors.length)]);
label.setOpaque(true);
panel.add(label);
labels[i] = label;
}
快照:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.