2011-10-14 90 views
2

當我將JPanel添加到Oracle Forms Container(基於AWT Container)時,存在嚴重問題。 我首先添加JPanel,之後我添加了一些VTextFields(Oracle Forms文本字段)。jpanel重疊其他組件

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

import oracle.ewt.scrolling.scrollBox.ScrollBox; 
import oracle.forms.ui.DrawnPanel; 
import oracle.forms.ui.FScrollBox; 
import oracle.forms.ui.VTextField; 

public class OverlapTest { 

int w = 800; 
int h= 700; 

public OverlapTest() { 
    JFrame f = new JFrame(); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.setSize(w, h); 

    DrawnPanel main = new DrawnPanel(); 

    main.setLayout(null); 
    main.setBounds(0, 0, w, h); 
    main.setVisible(true); 

    VTextField t1 = new VTextField(); 
    t1.setBounds(100, 100, 130, 22); 

    VTextField t2 = new VTextField(); 
    t2.setBounds(100, 150, 130, 22); 

    VTextField t3 = new VTextField(); 
    t3.setBounds(100, 200, 130, 22); 

    final JPanel draw = new JPanel(){ 
     @Override 
     public void paint(Graphics g) { 
      super.paint(g); 
      Graphics2D g2 = (Graphics2D) g; 
      g2.setColor(Color.red); 
      g2.fillRect(0, 100, 130, 200); 
      g2.dispose(); 

     } 

     @Override 
     public void update(Graphics g) { 
      paint(g); 
     } 

    }; 
    draw.setOpaque(false); 
    draw.setBounds(0, 0, w, h); 

    main.add(draw); 
    main.add(t1); 
    main.add(t2); 
    main.add(t3); 

    ScrollBox sBox = new ScrollBox(main); 
    sBox.setBounds(0, 0, w, h); 
    sBox.setVScrollInsets(1, 100); 
    oracle.forms.ui.FScrollBox fBox = new FScrollBox(sBox, 0, 0); 
    fBox.setVisible(true); 
    fBox.setBounds(0, 0, w - 50, h - 50); 

    main.setComponentZOrder(draw, 3); 
    main.setComponentZOrder(t1, 0); 
    main.setComponentZOrder(t2, 1); 
    main.setComponentZOrder(t3, 2); 

    f.add(fBox); 

    f.setVisible(true); 
} 

public static void main(String[] args) { 
    OverlapTest test = new OverlapTest(); 
    } 
} 

正如你看到的,我添加了JPanel第一,我setComponentZorde R後,那是因爲我的要求,我在實際應用中,我不能在所有組件的末尾添加JPanel,所以我做到了遵循辦法。

但目前我有一個問題,所有其他組件重疊JPanelJPanel(紅色矩形)的背景總是隱藏其他組件。

這是圖像:

Overlap GUI

我不知道,但是當我使用JTextField,一切都OK了。 我使用的是Oracle Forms的組件frmall.jar 您可以從http://www.megafileupload.com/en/file/329640/frmall-jar.html下載frmall.jar 您是否有解決方案使紅色矩形與其他組件重疊?

對不起,我的terible英語。

在此先感謝。


現在我試圖通過形式DrawnPanel更換的JPanel,但它仍然有問題:

FormCanvas form = new FormCanvas(){ 
     @Override 
     public void paint(Graphics g, Dimension paramDimension, 
       Rectangle paramRectangle) { 
      // TODO Auto-generated method stub 
      super.paint(g, paramDimension, paramRectangle); 
      Graphics2D g2 = (Graphics2D) g; 
      g2.setColor(Color.red); 
      g2.fillRect(0, 100, 200, 200); 
      g2.dispose(); 
     } 
    }; 
DrawnPanel draw = new DrawnPanel(); 
draw.setPainter(form); 
draw.setVisible(true); 

所以現在,每次我的組件是窗體組件,但我仍然得到這個問題

+1

哇,一個500Kb +的位圖,減少到8Kb的PNG!難怪人們不使用位圖格式。我已將小PNG直接編輯到線程中。有關創建精美屏幕截圖的提示,請參見[如何創建屏幕截圖來演示文章?](http://meta.stackexchange.com/questions/99734/how-do-i-create-a-screenshot-to -illustrate-a-post) –

回答

3

我會提供的第一個建議是請勿混用Swing & AWT組件。嘗試將'Oracle Forms'jar更新爲Swing版本,或者失敗,只在代碼中使用AWT組件。

+0

嗨,我知道reasion使問題,因爲Jpanel是輕量級組件和AWT是重量級,所以我的Jpanel總是重疊其他組件。我搜索了,我已經使用com.sun.awt.AWTUtilities.setComponentMixingCutoutShape,但它仍然無法解決。 http://today.java.net/article/2009/11/02/transparent-panel-mixing-heavyweight-and-lightweight-components。請幫我解決它,它讓我瘋狂 – Hoangdise

+0

我怎麼知道你試過我的建議?如果你忽視我的建議,我該如何幫助你? –