paint java 长方形_在Java中创建矩形时,我是否实际调用了paint...

为了使您的Swing应用程序按预期工作,您需要记住许多事项.为了逃避可能出现的某些障碍,必须遵循一定的步骤,因为您以错误的方式编码.为了坚持Swing Programming的基础知识,并遵循它们.

>就像@HovercraftFullOfEels所提到的那样,你打电话给你

图形直接,哪一个不应该做.

>其次,看看你的GameFrame()构造函数,你将它设置为

即使在您添加任何组件之前,也可以看到它们

在它的真实尺寸确定之前

编码中的这些循环漏洞可能会引起很多麻烦,因为你坐下来编写大型程序,所以最好从一开始就走在安全的道路上,然后在后期诅咒自己.正如他们所说,预防胜于治疗.

现在进入你的程序,你错过了主要的东西,因为你没有指定CustomComponent的大小,即JComponent,因此你无法在屏幕上看到它.当你将JCompoent扩展到你的类时,让它成为习惯的habbit来覆盖它的getPreferredSize(),就像你覆盖它的paintComponent(…)方法一样.

看看这个小程序,我为你精心设计,可能是这个能够帮助你,更多地了解逻辑.

import java.awt.*;

import java.awt.event.*;

import java.awt.geom.RoundRectangle2D;

import javax.swing.*;

public class CustomPainting {

private RectangleComponent life;

private RectangleComponent death;

private void createAndDisplayGUI() {

JFrame frame = new JFrame("Custom Painting");

frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

JPanel centerPanel = new JPanel();

centerPanel.setLayout(new GridLayout(0, 2, 5, 5));

// Specifying the WIDTH, HEIGHT and Colour for this JComponent.

life = new RectangleComponent(Color.GREEN.darker(), 20, 20);

death = new RectangleComponent(Color.RED.darker(), 20, 20);

centerPanel.add(life);

centerPanel.add(death);

JPanel buttonPanel = new JPanel();

buttonPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));

JButton incLifeButton = new JButton("INCREASE LIFE");

incLifeButton.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent ae) {

life.addLife(1);

}

});

JButton decLifeButton = new JButton("DECREASE LIFE");

decLifeButton.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent ae) {

life.subtractLife(1);

}

});

JButton incDeathButton = new JButton("INCREASE DEATH");

incDeathButton.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent ae) {

death.addLife(1);

}

});

JButton decDeathButton = new JButton("DECREASE DEATH");

decDeathButton.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent ae) {

death.subtractLife(1);

}

});

buttonPanel.add(incLifeButton);

buttonPanel.add(decLifeButton);

buttonPanel.add(incDeathButton);

buttonPanel.add(decDeathButton);

frame.getContentPane().add(centerPanel, BorderLayout.CENTER);

frame.getContentPane().add(buttonPanel, BorderLayout.PAGE_END);

frame.pack();

frame.setLocationByPlatform(true);

frame.setVisible(true);

}

public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {

@Override

public void run() {

new CustomPainting().createAndDisplayGUI();

}

});

}

}

class RectangleComponent extends JComponent {

private Color colour;

private static final int MARGIN = 10;

private int width;

private int height;

private int originalWidth;

private RoundRectangle2D roundedRectangle;

public RectangleComponent(Color c, int w, int h) {

colour = c;

width = w;

height = h;

originalWidth = width;

}

/*

* Overriding this method, so that

* the size of the JComponent

* can be determined, on the screen

* or by the LayoutManager concern.

*/

@Override

public Dimension getPreferredSize() {

return (new Dimension(width, height));

}

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

Graphics2D g2d = (Graphics2D) g;

roundedRectangle = new RoundRectangle2D.Float(MARGIN, MARGIN,

width, height, MARGIN, MARGIN);

g2d.setPaint(colour);

g2d.draw(roundedRectangle);

g2d.fill(roundedRectangle);

}

public void subtractLife(int amount) {

width -= amount;

System.out.println("ORIGINAL Width : " + originalWidth);

System.out.println("Width : " + width);

if (width > 0) {

roundedRectangle.setRoundRect(MARGIN, MARGIN, width, height,

MARGIN, MARGIN);

/*

* This repaint() will call the paintComponent(...)

* by itself, so nothing else to be done.

*/

repaint();

} else {

width += amount;

}

}

public void addLife(int amount) {

width += amount;

System.out.println("ORIGINAL Width : " + originalWidth);

System.out.println("Width : " + width);

if (width < originalWidth) {

roundedRectangle.setRoundRect(MARGIN, MARGIN, width, height,

MARGIN, MARGIN);

repaint();

} else {

width -= amount;

}

}

}

请问任何问题,当你通过这个程序时可能会出现这样的问题:-),我很乐意帮忙:-)

**两种颜色的最新编辑:**

import java.awt.*;

import java.awt.event.*;

import java.awt.geom.RoundRectangle2D;

import javax.swing.*;

public class CustomPainting {

private RectangleComponent lifeDeath;

private void createAndDisplayGUI() {

JFrame frame = new JFrame("Custom Painting");

frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

JPanel centerPanel = new JPanel();

centerPanel.setLayout(new GridLayout(0, 2, 5, 5));

// Specifying the WIDTH, HEIGHT and Colour for this JComponent.

lifeDeath = new RectangleComponent(Color.GREEN, Color.RED, 20, 20);

centerPanel.add(lifeDeath);

JPanel buttonPanel = new JPanel();

buttonPanel.setLayout(new GridLayout(1, 2, 5, 5));

JButton incLifeButton = new JButton("INCREASE LIFE");

incLifeButton.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent ae) {

lifeDeath.addLife(1);

}

});

JButton decLifeButton = new JButton("DECREASE LIFE");

decLifeButton.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent ae) {

lifeDeath.subtractLife(1);

}

});

buttonPanel.add(incLifeButton);

buttonPanel.add(decLifeButton);

frame.getContentPane().add(centerPanel, BorderLayout.CENTER);

frame.getContentPane().add(buttonPanel, BorderLayout.PAGE_END);

frame.pack();

frame.setLocationByPlatform(true);

frame.setVisible(true);

}

public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {

@Override

public void run() {

new CustomPainting().createAndDisplayGUI();

}

});

}

}

class RectangleComponent extends JComponent {

private Color lifeColour;

private Color deathColour;

private static final int MARGIN = 10;

private int widthLife;

private int widthDeath;

private int height;

private int originalWidth;

private RoundRectangle2D roundedRectangle;

public RectangleComponent(Color lc, Color dc, int w, int h) {

lifeColour = lc;

deathColour = dc;

widthLife = w;

height = h;

originalWidth = widthLife;

widthDeath = 0;

}

/*

* Overriding this method, so that

* the size of the JComponent

* can be determined, on the screen

* or by the LayoutManager concern.

*/

@Override

public Dimension getPreferredSize() {

return (new Dimension(originalWidth, height));

}

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

Graphics2D g2d = (Graphics2D) g;

roundedRectangle = new RoundRectangle2D.Float((MARGIN + widthDeath), MARGIN,

widthLife, height, MARGIN, MARGIN);

g2d.setPaint(lifeColour);

g2d.draw(roundedRectangle);

g2d.fill(roundedRectangle);

roundedRectangle.setRoundRect(MARGIN, MARGIN,

widthDeath, height, MARGIN, MARGIN);

g2d.setPaint(deathColour);

g2d.draw(roundedRectangle);

g2d.fill(roundedRectangle);

}

public void subtractLife(int amount) {

widthLife -= amount;

widthDeath += amount;

System.out.println("ORIGINAL Width : " + originalWidth);

System.out.println("Width Life : " + widthLife);

System.out.println("Width Death : " + widthDeath);

if (widthLife > 0 && widthDeath < originalWidth) {

/*

* This repaint() will call the paintComponent(...)

* by itself, so nothing else to be done.

*/

repaint();

} else {

widthLife += amount;

widthDeath -= amount;

}

}

public void addLife(int amount) {

widthLife += amount;

widthDeath -= amount;

System.out.println("ORIGINAL Width : " + originalWidth);

System.out.println("Width Life : " + widthLife);

System.out.println("Width Death : " + widthDeath);

if (widthLife < originalWidth && widthDeath > 0) {

repaint();

} else {

widthLife -= amount;

widthDeath += amount;

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值