Java Swing - 设置背景和按钮

时间:2013-09-13 13:15:22

标签: java swing user-interface jpanel

我正在尝试使用背景和一些按钮进行GUI操作,这些按钮应位于背景图片的前面。

我目前的问题是将两者结合起来导致Java在

处产生错误代码

“frame.setContentPane(new JPanel(){”

代码中的

部分。

公共类AbsolutLayoutDemo {

/**
 * @param args
 */
  public static void addComponentsToPane(Container pane) {
        pane.setLayout(null);

        JButton b1 = new JButton("one");
        JButton b2 = new JButton("two");
        JButton b3 = new JButton("three");

        pane.add(b1);
        pane.add(b2);
        pane.add(b3);

        Insets insets = pane.getInsets();
        Dimension size = b1.getPreferredSize();
        b1.setBounds(25 + insets.left, 5 + insets.top,
                     size.width, size.height);
        size = b2.getPreferredSize();
        b2.setBounds(55 + insets.left, 40 + insets.top,
                     size.width, size.height);
        size = b3.getPreferredSize();
        b3.setBounds(150 + insets.left, 15 + insets.top,
                     size.width + 50, size.height + 20);




    }

    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event-dispatching thread.
     * @throws IOException 
     */
    public static void createAndShowGUI() throws IOException {



        //Create and set up the window.
        JFrame frame = new JFrame("AbsoluteLayoutDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Set up the content pane.
        addComponentsToPane(frame.getContentPane());

        //Size and display the window.
        Insets insets = frame.getInsets();
        frame.setSize(600 + insets.left + insets.right,
                      600 + insets.top + insets.bottom);
        frame.setVisible(true);
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        frame.setContentPane(new JPanel() {


            BufferedImage image = ImageIO.read(new File("bilder/background.jpg"));

            @Override 
        public void paintComponent(Graphics g) {


            super.paintComponent(g);
            g.drawImage(image, 0, 0, 600, 600, this);
        }

        });


    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.

        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                try {
                    createAndShowGUI();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
    }
}

我编辑了修改后的代码,现在无法编译项目,但不再显示图像和按钮了。

3 个答案:

答案 0 :(得分:3)

您的代码无法编译,因为您错误地创建了匿名类。您可以使用初始化块解决它,如下面的show。

frame.setContentPane(new JPanel() {
         BufferedImage image; // you declare as instance variable
         { // initialization block
          try {
              image = ImageIO.read(new File("bilder/background.jpg"));
          } catch (IOException e) {
              e.printStackTrace();
          }
         }

       @Override 
       public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(image, 0, 0, 600, 600, this);
        }

});

同样重要的是。不要使用null布局,您可以阅读更多here

答案 1 :(得分:1)

你不能使用这样的内部类:

new JPanel() {

    try {
        BufferedImage image = ImageIO.read(new File("bilder/background.jpg"));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    public void paintComponent(Graphics g) {

        super.paintComponent(g);
        g.drawImage(image, 0, 0, 600, 600, this);
    }

}

try {}应该是一个不直接在类

中的方法

答案 2 :(得分:1)

我现在无法尝试,并且不知道哪些是错误,我想这个问题是由你如何构建你的JPanel引起的。

尝试类似:

frame.setContentPane(new JPanel() {

    BufferedImage image;
    private BufferedImage getImage(){
        if(image == null){
            try {
                image = ImageIO.read(new File("bilder/background.jpg"));
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return image;
    }

    public void paintComponent(Graphics g) {

        super.paintComponent(g);
        g.drawImage(getImage(), 0, 0, 600, 600, this);
    }

    });