0

我正在尝试让一个带有背景的 GUI 和一些应该在背景图片前面的按钮。

我目前的问题是将这两件事结合起来,导致 Java 不断产生错误代码

“frame.setContentPane(新 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();
                }
            }
        });
    }
}

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

4

3 回答 3

3

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

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布局你可以在这里阅读更多

于 2013-09-13T13:19:15.937 回答
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);
    }

    });
于 2013-09-13T13:21:22.097 回答
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 {}应该在一个方法中而不是直接在类中

于 2013-09-13T13:19:08.287 回答