JComponent怎么覆盖在JPanel上画的东西?

freshman 2002-05-08 11:03:07
在如下代码中,如何使‘hello’被遮住?
import java.awt.*;
import java.applet.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;

public class StepAction extends JApplet
{
JP jpObj=new JP();
ArrayList CollectionObj=new ArrayList();

public void init()
{
getContentPane().add(jpObj);
}
class JP extends JPanel
{
JP()
{
this.setSize(new Dimension(1000,600));
}
public void paint(Graphics g)
{
StepNode sn=new StepNode();
add(sn);
super.paint(g);
g.drawString("hello",20,20);
}
}
class StepNode extends JComponent
{
public StepNode()
{
setSize(new Dimension(60,40));
setBorder(BorderFactory.createRaisedBevelBorder());
}
}
}
...全文
169 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
freshman 2002-05-23
  • 打赏
  • 举报
回复
up!
freshman 2002-05-13
  • 打赏
  • 举报
回复
up
java项目-俄罗斯方块,供学习。 /** * File: GameCanvas.java * User: Administrator * Date: Dec 15, 2003 * Describe: 俄罗斯方块的每一个方块的绘制 */ import javax.swing.*; import javax.swing.border.EtchedBorder; //EtchedBorder为swing包中的突出或凹进的边框 import java.awt.*; /** * 画布类,内有<行数> * <列数>个方格类的实例。 * 继承JPanel类。 * ErsBlock线程类动态改变画布类的方格颜色,画布类通过 * 检查方格颜色来体现ErsBlock块的移动情况。 */ class GameCanvas extends JPanel { //默认的方块的颜色为桔黄色,背景颜色为黑色 private Color backColor = Color.black, frontColor = Color.orange; private int rows, cols, score = 0, scoreForLevelUpdate = 0; private ErsBox[][] boxes; private int boxWidth, boxHeight; //score:得分,scoreForLevelUpdate:上一次升级后的积分 /** * 画布类的第一个版本的构造函数 * @param rows int, 画布的行数 * @param cols int, 画布的列数 * 行数和列数以方格为单位,决定着画布拥有方格的数目 */ public GameCanvas(int rows, int cols) { this.rows = rows; this.cols = cols; //初始化rows*cols个ErsBox对象 boxes = new ErsBox[rows][cols]; for (int i = 0; i < boxes.length; i++) { for (int j = 0; j < boxes[i].length; j++) { boxes[i][j] = new ErsBox(false); } } //设置画布的边界 setBorder(new EtchedBorder( EtchedBorder.RAISED, Color.white, new Color(148, 145, 140))); } /** * 画布类的第二个版本的构造函数 * @param rows 与public GameCanvas(int rows, int cols)的rows相同 * @param cols 与public GameCanvas(int rows, int cols)的cols相同 * @param backColor Color, 背景色 * @param frontColor Color, 前景色 */ public GameCanvas(int rows, int cols, Color backColor, Color frontColor) { this(rows, cols); //调用第一个版本的构造函数 this.backColor = backColor; this.frontColor = frontColor; //通过参数设置背景和前景颜色 } /** * 设置游戏背景色彩 * @param backColor Color, 背景色彩 */ public void setBackgroundColor(Color backColor) { this.backColor = backColor; } /** * 取得游戏背景色彩 * @return Color, 背景色彩 */ public Color getBackgroundColor() { return backColor; } /** * 设置游戏方块色彩 * @param frontColor Color, 方块色彩 */ public void setBlockColor(Color frontColor) { this.frontColor = frontColor; } /** * 取得游戏方块色彩 * @return Color, 方块色彩 */ public Color getBlockColor() { return frontColor; } /** * 取得画布中方格的行数 * @return int, 方格的行数 */ public int getRows() { return rows; } /** * 取得画布中方格的列数 * @return int, 方格的列数 */ public int getCols() { return cols; } /** * 取得游戏成绩 * @return int, 分数 */ public int getScore() { return score; } /** * 取得自上一次升级后的积分 * @return int, 上一次升级后的积分 */ public int getScoreForLevelUpdate() { return scoreForLevelUpdate; } /** * 升级后,将上一次升级以来的积分清0 */ public void resetScoreForLevelUpdate() { scoreForLevelUpdate -= ErsBlocksGame.PER_LEVEL_SCORE; } /** * 得到某一行某一列的方格引用。 * @param row int, 要引用的方格所在的行 * @param col int, 要引用的方格所在的列 * @return ErsBox, 在row行col列的方格的引用 */ public ErsBox getBox(int row, int col) { if (row < 0 || row > boxes.length - 1 || col < 0 || col > boxes[0].length - 1) return null; return (boxes[row][col]); } /** * 覆盖JComponent类的函数,画组件。 * @param g 图形设备环境 * paint方法实际上把绘图的主要工作委派给paintComponent方法等方法 */ public void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(frontColor); for (int i = 0; i < boxes.length; i++) { for (int j = 0; j < boxes[i].length; j++) { //用前景颜色或背景颜色绘制每个方块 g.setColor(boxes[i][j].isColorBox() ? frontColor : backColor); g.fill3DRect(j * boxWidth, i * boxHeight, boxWidth, boxHeight, true); } } } /** * 根据窗口的大小,自动调整方格的尺寸 */ public void fanning() { boxWidth = getSize().width / cols; boxHeight = getSize().height / rows; } /** * 当一行被游戏者叠满后,将此行清除,并为游戏者加分 * @param row int, 要清除的行,是由ErsBoxesGame类计算的 */ public synchronized void removeLine(int row) { for (int i = row; i > 0; i--) { for (int j = 0; j < cols; j++) boxes[i][j] = (ErsBox) boxes[i - 1][j].clone(); } score += ErsBlocksGame.PER_LINE_SCORE; scoreForLevelUpdate += ErsBlocksGame.PER_LINE_SCORE; repaint(); } /** * 重置画布,置积分为0 */ public void reset() { score = 0; scoreForLevelUpdate = 0; for (int i = 0; i < boxes.length; i++) { for (int j = 0; j < boxes[i].length; j++) boxes[i][j].setColor(false); } repaint(); } }
ImageComparerUI——基于Java语言实现的相似图像识别,基于直方图比较算法。 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.MediaTracker; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JPanel; public class ImageComparerUI extends JComponent implements ActionListener { /** * */ private static final long serialVersionUID = 1L; private JButton browseBtn; private JButton histogramBtn; private JButton compareBtn; private Dimension mySize; // image operator private MediaTracker tracker; private BufferedImage sourceImage; private BufferedImage candidateImage; private double simility; // command constants public final static String BROWSE_CMD = "Browse..."; public final static String HISTOGRAM_CMD = "Histogram Bins"; public final static String COMPARE_CMD = "Compare Result"; public ImageComparerUI() { JPanel btnPanel = new JPanel(); btnPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); browseBtn = new JButton("Browse..."); histogramBtn = new JButton("Histogram Bins"); compareBtn = new JButton("Compare Result"); // buttons btnPanel.add(browseBtn); btnPanel.add(histogramBtn); btnPanel.add(compareBtn); // setup listener... browseBtn.addActionListener(this); histogramBtn.addActionListener(this); compareBtn.addActionListener(this); mySize = new Dimension(620, 500); JFrame demoUI = new JFrame("Similiar Image Finder"); demoUI.getContentPane().setLayout(new BorderLayout()); demoUI.getContentPane().add(this, BorderLayout.CENTER); demoUI.getContentPane().add(btnPanel, BorderLayout.SOUTH); demoUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); demoUI.pack(); demoUI.setVisible(true); } public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; if(sourceImage != null) { Image scaledImage = sourceImage.getScaledInstance(300, 300, Image.SCALE_FAST); g2.drawImage(scaledImage, 0, 0, 300, 300, null); } if(candidateImage != null) { Image scaledImage = candidateImage.getScaledInstance(300, 330, Image.SCALE_FAST); g2.drawImage(scaledImage, 310, 0, 300, 300, null); } // display compare result info here Font myFont = new Font("Serif", Font.BOLD, 16); g2.setFont(myFont); g2.setPaint(Color.RED); g2.drawString("The degree of similarity : " + simility, 50, 350); } public void actionPerformed(ActionEvent e) { if(BROWSE_CMD.equals(e.getActionCommand())) { JFileChooser chooser = new JFileChooser(); chooser.showOpenDialog(null); File f = chooser.getSelectedFile(); BufferedImage bImage = null; if(f == null) return; try { bImage = ImageIO.read(f); } catch (IOException e1) { e1.printStackTrace(); } tracker = new MediaTracker(this); tracker.addImage(bImage, 1); // blocked 10 seconds to load the image data try { if (!tracker.waitForID(1, 10000)) { System.out.println("Load error."); System.exit(1); }// end if } catch (InterruptedException ine) { ine.printStackTrace(); System.exit(1); } // end catch if(sourceImage == null) { sourceImage = bImage; }else if(candidateImage == null) { candidateImage = bImage; } else { sourceImage = null; candidateImage = null; }
180 Java 设计模式及应用案例(第 2 版) public CellContext2(String strPhone, String name, float price){ this.strPhone = strPhone; this.name = name; this.price = price; } public int getMark(){ int mark = 0; if(price > ICellState.NORMAL_LIMIT) mark = NORMAL_STATE; else if(price < ICellState.STOP_LIMIT) mark = STOP_STATE; else mark = OVERDRAW_STATE; return mark; } public void setState(){ int curMark = getMark(); if(curMark == mark) return; mark = curMark; switch(mark){ case NORMAL_STATE: state = new NormalState();break; case OVERDRAW_STATE: state = new OverDrawState();break; case STOP_STATE: state = new StopState();break; } } public void save(float price){ this.price += price; } public void cost(int minute){ this.price -= ICellState.COST_MINUTE*minute; } public boolean phone(){ state.phone(this); return true; } } setState()方法设置当前手机用户状态,算法主要原理是:根据余额获取当前状态标识 curMark, 并与前一状态标识 mark 进行对比。若两者相等,表明是同一状态,则返回;否则根据 mark 标识确 定当前手机用户所处状态。 本例中实时设置状态有两种情况:第一种情况,打完电话后进行设置,这在三个具体状态类中 已经进行描述了;第二种情况,存款后进行设置,也就是说,存款后要注意调用一次 setState()方法。 13.4 应用示例 【例 13-1】计算机内存监控程序。 设计算机物理总内存为 total,空闲内存为 free,则有公式 free ratio= total ,表示内存空闲率。设 两个阈值为 high、mid,high>mid。若 ratio high,则空闲率相当高,表明内存处于"充裕"状态; 第 13 章 状态模式 181 若 mid ratio<high,则空闲率正常,表明内存处于"良好"状态;若 ratio<mid,则空闲率低,表 明内存处于"紧张"状态。 先看程序执行界面,如图 13-3 所示。 图 13-3 内存监测界面图 程序主要完成以下功能: 界面上可以输入阈值 high,mid,有"开始监测" "停止监测"按钮; 按字节显示总内存、空闲内存大小,显示空闲率; 显示当前内存状态,以及此状态的持续时间, 单位是小时。 很明显,界面由三个子面板组成:上方的参数控制面板、中间的数值显示面板、下方的状态面 板,因此主要完成这三个类,再加上主窗口类共四个类的编制即可。下面一一进行说明。 1.参数控制面板类 CtrlPanel class CtrlPanel extends JPanel{ JComponent c[] = {new JTextField(4),new JTextField(4), new JButton("开始监测"),new JButton("停止监测")}; boolean bmark[][] = {{true,true,true,false}, {false,false,false,true}}; ActionListener startAct = new ActionListener(){ //"开始监测"按钮响应 public void actionPerformed(ActionEvent e){ setState(1); //设置组件使能状态 int high = Integer.parseInt(((JTextField)c[0]).getText());//取出高阈值 int low = Integer.parseInt(((JTextField)c[1]).getText()); //取出低阈值 Container c = CtrlPanel.this.getParent(); //获

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧