2017-04-09 21 views
0

当实例化网格对象时,会创建JFrame和JPanel。在JPanel上绘制线条以创建方形网格。理想情况下,如果窗口调整大小,网格将会缩放。尝试使用ComponentAdapter调整面板大小(不工作)

import javax.swing.JPanel; 
import javax.swing.JFrame; 
import java.awt.Graphics; 
import java.awt.Color; 
import java.awt.event.ComponentListener; 
import java.awt.event.ComponentEvent; 
import java.awt.event.ComponentAdapter; 

public class Grid { 
    private int lines; 
    private int space; 
    public static final int DEFAULT_LINES = 5; 
    public static final int DEFAULT_SPACE = 5; 

private JPanel panel = new GridPanel(); 
private JFrame frame; 

public Grid(String name, int lines, int space) { 
    this.frame = new JFrame(name); 
    this.lines = lines; 
    this.space = space; 
    this.frame.setSize((lines * space), (lines * space)); 
} 

private class GridPanel extends JPanel { 
    private int start = 0; 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     int end = (lines * space); 
     g.setColor(Color.BLACK); 
     for (int i = 0; i < lines; i++) { 
      int crawl = (space * i); 
      g.drawLine(start, crawl, end, crawl); 
      g.drawLine(crawl, start, crawl, end); 
     } 
    } 
} 

/*private class GridHandler extends ComponentAdapter { 

    @Override 
    public void componentResized(ComponentEvent e) { 
     super.componentResized(e); 
     setSpace(); 
     frame.repaint(); 
     frame.revalidate(); 
    } 
}*/ 

public void setSpace() { 
    space = (frame.getSize().width * frame.getSize().height)/lines; 
} 

public void run() { 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    frame.add(panel); 
    //frame.addComponentListener(new GridHandler()); 
    frame.setVisible(true); 
} 
} 


public class Run { 
    public static final int ONE_LINES = 15; 
    public static final int ONE_SPACE = 20; 

    public static final int TWO_LINES = 35; 
    public static final int TWO_SPACE = 16; 

    public static void main(String[] args) { 
     Grid grid1 = new Grid("Grid One", ONE_LINES, ONE_SPACE); 
     Grid grid2 = new Grid("Grid Two", TWO_LINES, TWO_SPACE); 
     grid1.run(); 
     grid2.run(); 
    } 
} 

这些是唯一使用的两个文件。 Handler目前已被注释掉,并且代码符合预期。两个带网格的窗口被创建。但是,当处理程序执行时,网格不再显示。处理程序的正确实现是什么?

+1

为什么不直接使用该组件的'width'和'height'和计算网格尺寸当过'paintComponent'叫?像[这个例子](http://stackoverflow.com/questions/34036216/drawing-java-grid-using-swing/34036397#34036397)? – MadProgrammer

+0

谢谢你的建议!我已经在下面发布了我的解决方案(它按照您的建议使用'width'和'height'),我发现代码更具可读性。再次感谢! –

回答

0

对于任何关心的人来说,这是一个可行的解决方案。事实证明,不需要componentResized事件处理程序。当JFrame重新调整大小时,paintComponent会自动执行。

以下代码创建两个单独的JFrame。每个JFrame包含一个JPanel。在JPanel上绘制一个独特的平方网格。如果JFrame重新调整大小,网格也将重新调整大小(同时仍然保留平方米)。

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

public class Grid extends JPanel { 
    private static final int DEFAULT_COUNT = 10; 
    private static final int DEFAULT_SIZE = 100; 

    private int count; 

    public Grid(int count, int size) { 
     if (size < 1) { 
      this.count = DEFAULT_COUNT; 
      this.setPreferredSize(new Dimension(DEFAULT_SIZE, DEFAULT_SIZE)); 
     } else { 
      this.count = count; 
      this.setPreferredSize(new Dimension(size, size)); 
     } 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D graphics = (Graphics2D) g; 
     graphics.setColor(Color.black); 

     Dimension size = getSize(); 
     int w = size.width; 
     int h = size.height; 

     if (w > h) { 
      w = h; 
     } else if (h > w) { 
      h = w; 
     } 

     int spaceWidth = (int)((double)w/count); 
     int spaceHeight = (int)((double)h/count); 
     for (int row = 0; row <= count; row++) { 
      int y = (row * spaceHeight); 
      int x = (row * spaceWidth); 
      graphics.drawLine(0, y, (spaceWidth * count), y); 
      graphics.drawLine(x, 0, x, (spaceHeight * count)); 
     } 
    } 
} 

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

public class Test { 
    public static final int COUNT_1 = (-5); 
    public static final int SIZE_1 = 4; 

    public static final int COUNT_2 = 35; 
    public static final int SIZE_2 = 16; 

    public static void main(String[] args) { 
     int area1 = COUNT_1 * SIZE_1; 
     int area2 = COUNT_2 * SIZE_2; 

     Grid grid = new Grid(COUNT_1, area1); 
     JFrame frame = new JFrame("Grid"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.add(grid); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 

     Grid grid2 = new Grid(COUNT_2, area2); 
     JFrame frame2 = new JFrame("Grid"); 
     frame2.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame2.add(grid2); 
     frame2.pack(); 
     frame2.setLocationRelativeTo(null); 
     frame2.setVisible(true); 
    } 
}