一个JPanel问题

时间:2009-08-14 04:17:56

标签: java swing

我正在编写一个项目,就像我的实验一样...... (对于已经帮助解决我的其他问题的每个人,非常感谢你。)

好吧我有一个文件已经可以工作..我的两个源文件编译正确 我有两个被覆盖的jpanel,所以我可以改变他们的paintcomponents。一个我用作应用程序的背景图像,这是有效的。   问题是我想要添加的第二个面板,由于某种原因,当我启动应用程序时,它要么不显示在第一个JPanel之上,要么根本没有显示...

这是我的代码..

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;
import org.jdom.output.*;

public class COS extends JPanel implements ActionListener{
    static JFrame f=new JFrame();
    static Image bgImage=null;
    static String message="";
    JButton chbg=new JButton("change background");
    public COS(){
        chbg.setBounds(10,10,150,25);
        chbg.addActionListener(this);
        add(chbg);
    }
    public void paintComponent(Graphics g){
        if(bgImage!=null){
            g.drawImage(bgImage,0,0,this);
        }
        else{
            g.drawString(message,40,40);
        }
    }
    public static void loadbg(){
        try{
            String xmlpath="background.xml";
            SAXBuilder builder=new SAXBuilder();
            Document xdoc=builder.build(xmlpath);
            String fimg="";
            fimg=xdoc.getRootElement().getChild("bgimage").getText();
            getFileImage(fimg);
        } catch(Exception e){
            message="File load failed: "+e.getMessage();
        }
    }
    public static void getFileImage(String filein) throws IOException, InterruptedException{
        FileInputStream in=new FileInputStream(filein);
        byte[] b=new byte[in.available()];
        in.read(b);
        in.close();
        bgImage=Toolkit.getDefaultToolkit().createImage(b);
    }
    public void actionPerformed(ActionEvent e){
        Object source=e.getSource();
        JFileChooser jfc=new JFileChooser();
        if(source==chbg){
            int returnVal=jfc.showOpenDialog(null);
            if(returnVal==JFileChooser.APPROVE_OPTION){
                File file=jfc.getSelectedFile();
                String fileone=file.getName();
                changebg(fileone);
            }
        }
    }
    public void changebg(String filein){
        try{
            getFileImage(filein);
            saveDefaultImage(filein);
            repaint();
        } catch(IOException e){
        } catch(InterruptedException ie){
        }
    }
    public void saveDefaultImage(String filein){
        try{
            String xmlpath="background.xml";
            SAXBuilder builder=new SAXBuilder();
            Document xdoc=builder.build(xmlpath);
            xdoc.getRootElement().removeChild("bgimage");
            xdoc.getRootElement().addContent(new Element("bgimage").setText(filein));
            FileOutputStream fos=new FileOutputStream(xmlpath);
            XMLOutputter out=new XMLOutputter();
            out.output(xdoc, fos);
            fos.flush();
            fos.close();
        } catch(Exception e){
        }
    }
    public static void main(String[] args){
        COS newcos=new COS();
        COSmp cmp=new COSmp();
        cmp.setBounds(720,0,25,600);
        cmp.setLayout(null);
        loadbg();
        f.setSize(825,640);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().setLayout(null);
        f.setLayout(null);
        newcos.setBounds(5,5,800,600);
        newcos.setOpaque(false);
        newcos.setLayout(null);
        f.setLocation(10,5);
        f.getContentPane().add(newcos);
        f.add(cmp);
        f.setVisible(true);
    }
}

我的第二个源文件..

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import org.jdom.*;
import org.jdom.input.*;
import org.jdom.output.*;

public class COSmp extends JPanel implements ActionListener{
    public COSmp(){
        JLabel whatisthis=new JLabel("I am going to be a start menu i think");
        add(whatisthis);
    }
    public void actionPerformed(ActionEvent e){
    }
}

第二个非常简单,但它的所有方法都在第二个setbounds,add等等。

我似乎无法让它显示,即使我设置第一个“newcos”是我称之为第一个,不显示..

有人能帮帮我吗? 如果我解释得不够好请告诉我,我会再试一次。

我也想过这个, xml文件,background.xml



background2.png

2 个答案:

答案 0 :(得分:1)

您不需要两个面板的复杂功能;您只需将组件添加到绘制背景的组件即可。

此外,您需要安装LayoutManager(setLayout())来布局组件。

编辑(评论):是的,你有一个setLayout(null),但这会删除布局管理器。将标签添加到cmp时,它没有布局管理器,因此组件未分级且未定位(它的边界可能是0,0,0,0),因此不可见。

我再说一遍,你需要研究如何使用布局管理器并使用它们 - 遵循布局上的Swing教程 - 这是构建UI的最佳方式(手动布局绝对不是这样的去)。

Sun教程:Main Tutorial Page - Creating a GUI With Swing - Layout Tutorial

顺便说一句,打包没有用,因为它要求布局管理器调整组件的大小,而你的情况则没有。

最后,看看一个好的基于表格的布局管理器 - 网上有几个免费提供。与仅使用Java内置的布局相比,它们使容器布局更多更容易。我有一个完全免费的,名为MatrixLayout

答案 1 :(得分:1)

你看不到任何东西,因为:

  • 倒数第二行,你需要将cmp添加到newcos而不是帧。
  • 您需要在COSmp中设置标签的边界。

您需要了解layout managers以及如何使用它们,您在这里的代码是站不住脚的。