線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1076
推到 Plurk!
推到 Facebook!

Graphic 的問題

尚未結案
SuperLowB
初階會員


發表:96
回覆:77
積分:34
註冊:2003-06-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-31 16:46:03 IP:203.198.xxx.xxx 未訂閱
請問我以下的code 是run到的,說明如下: 1. 有一個JFrame,JFrame 上有一個JPanel(plCont) 2. JPanel(plCont) 上有兩個components: 一個是JPanel(plDraw),另一個是    JButton(btnDoDraw) 3. 當按上btnDoDraw 時,左面的plDraw會畫上一個長方形    問題: 當這個JFrame被其他window蓋過後,再focus在這個JFrame 後就不能看見這個長方形,怎可以把它看見呢?    
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;    class frmPainting extends JFrame implements ActionListener
{
        private JPanel plCont=new JPanel();
  private JPanel plDraw=new JPanel();
  private JButton btnDoDraw=new JButton("Draw");
  public frmPainting(String pTitle)
  {
    super(pTitle);
    setSize(550,80);
    setDefaultCloseOperation(EXIT_ON_CLOSE);  
    
    btnDoDraw.addActionListener(this);        plCont.setLayout(new GridLayout());
    plCont.add(plDraw);
    plCont.add(btnDoDraw);
    
    setContentPane(plCont);       
  }
  public static void main(String[] args) 
        {
     frmPainting lfrm=new frmPainting("Test");
     lfrm.show();
        }      public void actionPerformed(ActionEvent evt)
  {        
    Object lsrc=evt.getSource();
    if (lsrc==btnDoDraw) btnDoDrawActionPerformed(evt); 
  }      private void btnDoDrawActionPerformed(ActionEvent evt)
  {    
    Graphics2D lGrp=(Graphics2D)plDraw.getGraphics();    
    lGrp.setPaint(Color.green);
    lGrp.fill(new Rectangle2D.Float(10,10,10,30));      }
}
neoart
版主


發表:22
回覆:582
積分:425
註冊:2003-05-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-11-03 07:47:23 IP:61.56.xxx.xxx 未訂閱
個人的經驗,也許不是最好的,希望有這方面的solution的朋友提供一下更好的建議. 我的solution跟斯斯一樣,有兩種,分成治標及治本兩類. 治標的方法,把你的code改一下. =================================================
:
private JPanel plDraw=new JPanel();
private JButton btnDoDraw=new JButton("Draw");
boolean isBtnClicked=false;//flag to mark if fill rectangle is done
:
:
private void btnDoDrawActionPerformed(ActionEvent evt)
  {    
    Graphics2D lGrp=(Graphics2D)plDraw.getGraphics();    
    lGrp.setPaint(Color.green);
    lGrp.fill(new Rectangle2D.Float(10,10,10,30));
    isBtnClicked=true;//set the flag
  }
//over write  paint methold,force to draw rectangle while painting
//repainting is invoked if app window is re-on top 
 public void paint(Graphics g){
   super.paint(g);
   if(isBtnClicked)btnDoDrawActionPerformed(null);
 }
====================================================================== 治本的方法: 把繪成的graphic物件,存成image,再以label.setIcon(imageIcon)的方式放入Jlabel物件,再把此jlabel放入JPanel. 如果是要以元件的角度去設計的話,可以定義某些shape類別,ex:
class ShapStar extends javas.swing.JComponent{
   ...some attribute.
  public paint(Grpahics g){
     ....do some painting task ,depends on it's status.
  }
}
日後你的AP只要負責如何產生/設定這些shape物件,paint的事,交給他們自己了 發表人 - neoart 於 2003/11/03 07:58:49
SuperLowB
初階會員


發表:96
回覆:77
積分:34
註冊:2003-06-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-11-03 12:11:38 IP:203.198.xxx.xxx 未訂閱
多謝neoart 的指敎,問題我已用了我的方法解決了 我是這樣做的
import javax.swing.*;
import java.awt.*;
public class frm extends JFrame
{
  public frm()
  {
    MyPanel pl=new MyPanel();
    getContentPane().add(MyPanel);
    pack();
  }
  
  public static void main(String arg[])
  {
    new frm().show();
  }
}    class MyPanel extends JPanel
{
  public void paintComponent(Graphics g)
  {
    Graphics2D lg2D=(Graphics2D)g;
    lg2D.fill(new Rectangle2D.Float(10,10,10,10)); 
  }
}
發表人 - superlowb 於 2003/11/03 12:13:19
系統時間:2024-05-10 3:27:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!