【问题标题】:How to draw shapens inside shapes?如何在形状内绘制形状?
【发布时间】:2012-07-09 03:27:03
【问题描述】:

我正在尝试构建一个应用程序,我打算在其中创建一些基本动画。我的目标是在顶部有一个用于绘制图形的面板,在下方有一个带有常规按钮和标签的面板。

我已经完成了下面给出的代码,但是我无法在之前绘制的矩形内绘制矩形。我相信我的问题是我正在调用一个类(矩形)来绘制扩展 JPanel 的矩形,这意味着每次我尝试绘制一个新矩形时,都会创建一个新面板,而不是与前一个面板重叠!

编辑

我查看了更多示例,最后可以想出一个代码来生成形状(本例为矩形),因为我需要它们在同一个面板上。我对代码做了一些更改,下面是新代码。

L.java

import java.awt.Color;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

class L extends JFrame {

public static final int ww = 1000;
public static final int wh = 600;
public static final String wt = "Teste";
Container pane = getContentPane();
DrawRectangle rectangle = new DrawRectangle();

public L() {
    setSize(ww,wh);
    this.setTitle(wt);
    Sim();
    pane.add(rectangle);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
}

public void addRectangle(int px, int py, int pwh, Color pc) {
    this.rectangle.addRectangle( px, py, pwh, pc);
}

public void Sim() {
    addRectangle(100,100,250,Color.red);
    addRectangle(200,200,50,Color.green);
}

public static void main(String[] args) {

    L l = new L();

    try {
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    } catch (UnsupportedLookAndFeelException ex) {
        ex.printStackTrace();
    } catch (IllegalAccessException ex) {
        ex.printStackTrace();
    } catch (InstantiationException ex) {
        ex.printStackTrace();
    } catch (ClassNotFoundException ex) {
        ex.printStackTrace();
    }

    //} 

}

}  

DrawRectangle.java

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import javax.swing.JPanel;

class DrawRectangle extends JPanel {
private java.util.List<Rectangle2D> squares;
private java.util.List<Color> colors;
//private int a, startX, startY;
public DrawRectangle(){
    squares = new ArrayList<Rectangle2D>();
    colors = new ArrayList<Color>();
}

public void addRectangle(int px, int py, int pwh, Color pc)  { // square
    squares.add( new Rectangle2D.Double(px, py, pwh, pwh) ) ;
    colors.add(pc);
    //this.a = a;
    //this.startX = startX;
    //this.startY = startY;
}
public void paintComponent(Graphics g) {
    Graphics2D g1 = (Graphics2D) g;
    for( Rectangle2D rect : squares ) {
        System.out.println(colors);
        g1.setColor(colors);
        g1.draw(rect);
    }
}
}

现在出现了一个新问题!我做错了什么,我不能使用我传递给方法的颜色来绘制不同颜色的形状?

【问题讨论】:

  • 如果你想在一个面板上绘制多个矩形,那么首先你的 Rectangle 类不能扩展 JPanel 类
  • 感谢您的回答!我环顾四周,设法做了一些有效的事情。不过,我有一个新的小问题,介意看看吗?
  • @LuisAfonsoTeixeira 在同一个帖子中提出问题、获得答案然后再提出另一个问题被认为是一种不好的形式。如果您在实时调试会话方面需要帮助,我认为 Stack Overflow 不是进行调试的最佳场所。

标签: java


【解决方案1】:

嗯,也许可以尝试创建一个 JPanel,它接受 Rectangles 的数组,然后像这样在面板中绘制它们:

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

public class RectangleDrawingTest extends JFrame {

    public RectangleDrawingTest() {
        createAndShowUI();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                RectangleDrawingTest drawingTest = new RectangleDrawingTest();
            }
        });
    }

    private void createAndShowUI() {
        setTitle("Rectangle Drawing Test");
        setSize(300, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setLocationRelativeTo(null);
        addComponentsToContentPane(this.getContentPane());
        setVisible(true);
    }

    private void addComponentsToContentPane(Container contentPane) {

        Rectangle[] recs = new Rectangle[3];
        recs[0] = new Rectangle(100, 100, 150, 100);
        recs[1] = new Rectangle(100, 100, 125, 75);
        recs[2] = new Rectangle(100, 100, 100, 50);

        MyPanel mr = new MyPanel(recs);

        contentPane.add(mr);
    }
}

class MyPanel extends JPanel {

    private final Rectangle[] recs;

    public MyPanel(Rectangle[] recs) {
        this.recs = recs;
    }

    @Override
    protected void paintComponent(Graphics grphcs) {
        super.paintComponent(grphcs);
        grphcs.setColor(Color.BLACK);
        for (int i = 0; i < recs.length; i++) {
            grphcs.drawRect(recs[i].x, recs[i].y, recs[i].width, recs[i].height);
        }
    }
}

附录:

因为您同时拥有squarescolor ArrayList 使用像这样的带有递增变量的for循环来横向它们(正方形大小和颜色大小当然是相同的):

 for( int i=0;i<squares.size();i++) {
       // System.out.println(colors);
        g1.setColor(colors.get(i));
        g1.draw(squares.get(i));
    }

【讨论】:

  • 感谢您的回答!我环顾四周,设法做了一些有效的事情。不过,我有一个新的小问题,介意看看吗?
【解决方案2】:

像这样创建自己的面板

class MyPanel extends JPanel{
Rectangulo one;

Rectangulo two;
public MyPanel(){
     one = new Rect...etc.;
     two = new Rect...etc.;
}

public paint(Graphics g){
     one.paint(g);
     two.paint(g);
     //two is overlapping one
}

并将其添加到您的 JFrame...

编辑: ...或将 paint(Graphics g) 和 repaint() 添加到您的 JFrame 中,您可以在其中重新绘制 panel1...

希望对你有帮助...

【讨论】:

  • 会按照你说的做一些尝试!
  • 感谢您的回答!我环顾四周,设法做了一些有效的事情。不过,我有一个新的小问题,介意看看吗?
  • 公共油漆(图形 g){ g.setColor(color);我想就是这样。
猜你喜欢
  • 1970-01-01
  • 2021-09-19
  • 2020-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 1970-01-01
  • 2017-12-10
相关资源
最近更新 更多