【问题标题】:drawing simple rectangles on a Jframe in java在java中的Jframe上绘制简单的矩形
【发布时间】:2012-03-31 14:08:31
【问题描述】:

我正在像这样扩展 JFrame:

public GameFrame() {
    this.setBounds(30, 30, 500, 500);
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    initializeSquares();
}

private void initializeSquares(){
    for(int i = 0; i < 5; i++){
        this.getContentPane().add(new Square(i*10, i*10, 100, 100));
    }
    this.setVisible(true);
}

但是,屏幕上只绘制了一个正方形,有人知道为什么吗?

My Square 类也是这样的:

private int x;
private int y;
private int width;
private int height;
public Square(int x, int y, int width, int height){
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawRect(x, y, width, height);
}

【问题讨论】:

    标签: java swing graphics jframe awt


    【解决方案1】:

    JFrame 的 contentPane 默认使用 BorderLayout。当您向其中添加一个 Square 时,它​​会默认添加 BorderLayout.CENTER 并覆盖任何以前添加的 Squares。您需要阅读 Swing GUI 可用的所有布局管理器。

    例如,从这里开始:Laying Out Components within a Container

    但话虽如此,我会做不同的事情。我将只创建一个 JPanel 并使其能够绘制多个正方形。例如这样的:

    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Rectangle;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.swing.*;
    
    public class GameFrame extends JFrame {
       public GameFrame() {
          super("Game Frame");
          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          Squares squares = new Squares();
          getContentPane().add(squares);
          for (int i = 0; i < 15; i++) {
             squares.addSquare(i * 10, i * 10, 100, 100);
          }
    
          pack();
          setLocationRelativeTo(null);
          setVisible(true);
    
       }
    
       public static void main(String[] args) {
          new GameFrame();
       }
    
    }
    
    class Squares extends JPanel {
       private static final int PREF_W = 500;
       private static final int PREF_H = PREF_W;
       private List<Rectangle> squares = new ArrayList<Rectangle>();
    
       public void addSquare(int x, int y, int width, int height) {
          Rectangle rect = new Rectangle(x, y, width, height);
          squares.add(rect);
       }
    
       @Override
       public Dimension getPreferredSize() {
          return new Dimension(PREF_W, PREF_H);
       }
    
       @Override
       protected void paintComponent(Graphics g) {
          super.paintComponent(g);
          Graphics2D g2 = (Graphics2D) g;
          for (Rectangle rect : squares) {
             g2.draw(rect);
          }
       }
    
    }
    

    【讨论】:

    • 好吧,好像是这样,有没有办法不使用布局管理器而只使用绝对定位?
    • 您可以通过将容器的布局设置为null,但不建议这样做。最好做类似上面例子的事情。
    【解决方案2】:

    对于绝对定位,调用 setLayout(null)。然后图标将在其 getLocation() 方法返回的位置绘制,因此您可能需要先调用 setLocation()。

    【讨论】:

    • 您需要做的不止这些,因为您将完全负责设置组件的位置它的大小。但同样,不建议这样做。
    【解决方案3】:

    即使我在绝对布局的 jframe 上显示多个矩形时也遇到了问题,即布局设置为 null。

    JFrame frame = new JFrame("hello");
    frame.setLayout(null);
    frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
    frame.setSize(600, 600);
    frame.getContentPane().setBackground(Color.red);
    frame.getContentPane().add(new Square(10,10,100,100));//My rectangle class is similar to the Square mentioned in the question and it extends JComponent.
    

    由于没有显示矩形,我仍然遇到问题。除非您在 Square(JComponent) 上明确设置边界,否则它将不起作用。即使 Square 在构造函数中传递了位置,setbounds 也只能解决问题.所以下面解决了这个问题,这个问题是针对绝对布局的jframe。

    Square square = new Square(10,10,100,100);
    square.setBounds(10,10,100,100);
    frame.getContentPane().add(square);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-23
      相关资源
      最近更新 更多