Java Frame中用paint(Graphics g)画了一张背景图,JTable不能显示了

来源:百度知道 编辑:UC知道 时间:2024/06/17 03:58:11
我想在一个程序中用paint(Graphics g)画了一张背景图,然后再在上弄个JTable,可是只能显示其中一种,要么是图片,要么是JTable。怎么样解决两者之间的共存问题??详细代码如下:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class BJBK extends Canvas{
static Frame f = new Frame();
DefaultTableModel dateModel;
String[] headers=new String[]{"Title 1","Title 2","Title 3"};
Object[][] dates=new Object[6][3];
JTable table = new JTable();

Toolkit tool;
Image image;

public BJBK(){
tool = getToolkit();
image = tool.getImage("123.png");
dateModel=new DefaultTableModel(dates,headers);
table = new JTable(dateModel);
table.setModel(dateModel);
table.setPreferredScrollableViewportSize(new Dimension(350,120));
JScrollPane pane = new JScrollPane(table);
Panel P1=new Panel();
P1.add(pane);
f.add(P1);
}
pub

针对starstroll建议的补充,光设Opaque是没用的,因为楼主用的是awt不是swing,需要本地操作系统窗口系统透明才透明,和Opaque无关(所以事实上awt组件,如panel没有setOpaque方法,swing组件JPanel才有)。其实contrainer类型的swing组件默认就是透明的。当然建议最好的方法是全部用swing,不要用awt。

原因是同一层级下的component在BorderLayout管理下对一块区域(比如center)撑的地方是完全一样的,所以table和Canvas互相遮盖。可以把Canvas改成其他Contrainer,然后把table放到这个Contrainer里面,形成级联层次。改后代码如下

如果需要table里面的空格也透出背景图案,需要使用Swing组件而不是Awt组件,否则需要本地操作系统支持透明了。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

public class BJBK extends /*Canvas*/Panel {
  static Frame f = new Frame();
  DefaultTableModel dateModel;
  String[] headers = new String[] { "Title 1", "Title 2", "Title 3" };
  Object[][] dates = new Object[6][3];
  JTable table = new JTable();

  Toolkit tool;
  Image image;

  public BJBK() {