【问题标题】:Adding JPanel/Containers/Images/JButtons/Etc Ontop of a Background image?在背景图像之上添加 JPanel/Containers/Images/JButton/Etc?
【发布时间】:2013-03-27 00:13:45
【问题描述】:

我一直在寻找如何在内容窗格/背景图像上添加对象,但无济于事。本质上,我必须创建一个棋盘游戏,而我的任务是制作 GUI。我需要制作一个中心位置来放置我的棋子,然后才能将棋子移动到这些位置。到目前为止,我只有一个板的背景图像,并且想添加组件以使其具有交互性,但我似乎无法将交互组件覆盖在我的背景图像之上。

这是我的代码:

public class Lotus{

    private static JPanel _panel = new JPanel(); 
    private static JFrame _frame = new JFrame("Lotus"); 
    private static Container _pieces = new Container(); 

    public static void main(String[] args){
        /**

        JLabel A = new JLabel("");
        A.setOpaque(true);
        A.setBackground(Color.BLACK);
        _frame.add(_pieces); 
        _pieces.add(A); 
        _frame.setAlwaysOnTop(_pieces);
                */

        try{

            _frame.setContentPane(new JLabel(new ImageIcon(
                 ImageIO.read(new File("C:\\Users\\Martin\\Pictures\\pic625580.jpg")))));

        }catch(IOException e){

            System.out.println("Image is not Found.");
            e.printStackTrace();
        }

        Toolkit tk = Toolkit.getDefaultToolkit();  
        int xSize = ((int)tk.getScreenSize().getWidth());  
        int ySize = ((int)tk.getScreenSize().getHeight());  
        _frame.setSize(xSize,ySize); 
        Container contentPane = _frame.getContentPane();
        contentPane.setLayout(null); 
        _frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        //_frame.pack();
        _frame.setVisible(true);

        /**
        JLayeredPane mainLayer = new JLayeredPane();
        _frame.add(mainLayer, BorderLayout.CENTER); 
        JLabel label = new JLabel("LABEL", JLabel.CENTER); 
        label.setBounds(100,100,200,100);
        label.setOpaque(false);
        _frame.getContentPane().setComponentZOrder(label, 0);
        //label.setVisible(true); 
        label.setBackground(Color.CYAN);
        mainLayer.add(label,1); 
        mainLayer.moveToFront(_frame);
        */    
    }

编辑:

好的,所以我尝试了下面的方法,我的 JFrame 现在没有显示,并且由于某种原因查看 Java 控制台它正在终止程序。代码:

public static void main(String[] args){

    class Board extends JPanel{

        JFrame _frame = new JFrame("Lotus");

        Image image = Toolkit.getDefaultToolkit().getImage("C:\\Users\\Martin\\Pictures\\pic625580.jpg");

        public void paintComponent(Graphics g) {

            JLabel A = new JLabel("");
            A.setOpaque(true);
            A.setBackground(Color.BLACK);

            Board b = new Board(); 
            _frame.setContentPane(b);
            _frame.setVisible(true);
            _frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            super.paintComponent(g); 
            g.drawImage(image,0,0,A); 
            g.fillOval( 50,50,5,5 ); 

    }
        public Dimension getPreferredSize() {

            return new Dimension( 300,300); 


    }

【问题讨论】:

  • paintComponent() 仅用于绘画。您不会在 paintComponent() 方法中创建组件,也绝对不会在那里创建 JFrame。阅读 Swing 教程,了解如何构建程序的示例。此外,请遵循标准 Java 命名约定。变量不以大写字符开头。
  • 欣赏谢谢。

标签: java image swing background


【解决方案1】:

您必须继承 JPanel 覆盖 paintComponent 才能进行绘图。例如:

public class Board extends JPanel {

    Image image = ... // load it here

    public void paintComponent(Graphics g) {
        super.paintComponent(g); // fatal

        g.drawImage(image,0,0,this); // omitted label

        g.fillOval( 50,50,5,5 ) // circle 5x5 at pixel 50x50

        // etc.
    }
}

现在您还应该覆盖getPreferredSize,告诉布局管理器板应该有多大:

    public Dimension getPreferredSize() {
        return new Dimension(300,300) // your required size...
    }

然后将Board设置为内容窗格。

【讨论】:

  • 请原谅我的无知,因为我是菜鸟,但是,如何将 board 设置为 contentpane?
  • frame.setContentPane(new Board());
  • Board b = new Board(); frame.setContentPane(b);
猜你喜欢
  • 2013-12-16
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 2015-02-12
相关资源
最近更新 更多