这是我的代码:
class Ramka extends JFrame
{
public static final int SZEROKOSC = 800;
public static final int WYSOKOSC = 600;
Container powZawartosci = getContentPane();
public Ramka()
{
setSize(SZEROKOSC, WYSOKOSC);
setTitle("Siatka bryły by Paweł Mysior");
}
public void addRectangle(int startX, int startY, int sizeX)
{
drawRectangle rect = new drawRectangle(startX, startY, sizeX);
powZawartosci.add(rect);
}
class drawRectangle extends JPanel
{
private int a, startX, startY;
public drawRectangle(int startX, int startY, int a) // square
{
this.a = a;
this.startX = startX;
this.startY = startY;
}
public void paintComponent(Graphics g)
{
Rectangle2D rect = new Rectangle2D.Double(startX, startY, a, a);
Graphics2D g1 = (Graphics2D) g;
g1.draw(rect);
}
}
public class Main
{
public static void main(String[] args)
{
Ramka ramka = new Ramka();
ramka.addRectangle(200, 200, 50);
ramka.addRectangle(100, 100, 100);
ramka.addRectangle(300, 300, 150);
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ramka.setVisible(true);
}
}
我想要它做的是绘制三个矩形(抛开功能和感觉这样做,我还在学习)。
但是它只绘制了最后一个,从300和300开始。我真的不了解paintComponent的事情......
提前感谢您的帮助, 保罗
答案 0 :(得分:1)
我相信你要在彼此之上添加三个JPanel
。这似乎是绘制矩形的奇怪方法,但是使用此设计,您需要使用LayoutManager
。
查看this链接,然后尝试学习。下面的代码应该可以解决这个问题。
...
Container powZawartosci = getContentPane();
public Ramka()
{
setSize(SZEROKOSC, WYSOKOSC);
setTitle("Siatka bryły by Paweł Mysior");
setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));//Only this line is inserted.
}
public void addRectangle(int startX, int startY, int sizeX)
{
drawRectangle rect = new drawRectangle(startX, startY, sizeX);
powZawartosci.add(rect);
}
...
在JPanel
衍生品中,您可以跟踪需要绘制的Rectangle
。我正在编写下面的代码,所以首先检查错误。
class RectangleDrawer extends JPanel{
ArrayList<Rectangle> rList = new ArrayList()<Rectangle>;
public void addRectangle(Rectangle rect){
rList.add(rect);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
for(int i=0; i<rList.size(); r++){
g.drawRectangle(rList.get(i));
}
}
}
答案 1 :(得分:1)
问题主要在于你在这里使用两种不同的抽象层次。
首先,您要在JFrame中添加一个组件,这在某些方面很好。
您正在添加“DrawRectangle”实例,就像添加新按钮,标签或其他面板一样。在相同位置添加组件时会出现问题。 JFrame的主面板(内容窗格)使用"Border" layout manager,如果您不添加任何约束,则将组件置于中间。
为方便起见,BorderLayout解释缺少字符串规范与常量CENTER相同
alt text http://java.sun.com/javase/6/docs/api/java/awt/doc-files/BorderLayout-1.gif
所以,这一行:
powZawartosci.add(rect);
始终将您的组件添加到“中心”,覆盖前一个组件。这就是你只看到一个矩形的原因。
这里使用的第二级抽象是自己绘制组件。这是低级别的,你必须告诉组件谁绘制每一行和在哪里。
没关系,但是如果你想在同一个组件中绘制几个矩形,你必须保存每个矩形的引用(使用像列表一样的集合),然后迭代该集合并将它们全部绘制出来。
像这样:
many http://img40.imageshack.us/img40/8125/capturadepantalla201001nd.png
我拿了你的代码,并改了它,以反映我在说什么。最终结果使用相同的组件,但该组件依次绘制所有矩形。
还要注意命名/括号样式,虽然这不是强制性的,但在Java编程时很常见
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
import java.util.*;
class Ramka extends JFrame {
public static final int SZEROKOSC = 800;
public static final int WYSOKOSC = 600;
Container powZawartosci = getContentPane();
DrawRectangle rectangle = new DrawRectangle();
public Ramka() {
setSize(SZEROKOSC, WYSOKOSC);
setTitle("Siatka bryły by Paweł Mysior");
powZawartosci.add( new JLabel("Several rectangles are being displayed"), BorderLayout.NORTH );
powZawartosci.add(rectangle);
}
public void addRectangle(int startX, int startY, int sizeX) {
this.rectangle.addRectangle( startY, startY, sizeX );
}
}
class DrawRectangle extends JPanel {
private java.util.List<Rectangle2D> squares;
//private int a, startX, startY;
public DrawRectangle(){
squares = new ArrayList<Rectangle2D>();
}
public void addRectangle(int startX, int startY, int a) { // square
squares.add( new Rectangle2D.Double(startX, startY, a, a) ) ;
//this.a = a;
//this.startX = startX;
//this.startY = startY;
}
public void paintComponent(Graphics g) {
Graphics2D g1 = (Graphics2D) g;
for( Rectangle2D rect : squares ) {
g1.draw(rect);
}
}
}
public class Main {
public static void main(String[] args) {
Ramka ramka = new Ramka();
//ramka.addRectangle(200, 200, 50);
//ramka.addRectangle(100, 100, 100);
//ramka.addRectangle(300, 300, 150);
for( int i = 0 ; i < 20 ; i++ ){
ramka.addRectangle( i * 10 , i * 10 , i * 20 );
}
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ramka.setVisible(true);
}
}