Reputation: 1
i'm trying to get a GUI going with a background and some buttons which shall be in front of the background picture.
My current problem is combining those both things cause Java keeps producing error codes at the
"frame.setContentPane(new JPanel() {"
section in the code.
public class 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();
}
}
});
}
}
I edited the modified code, now im able to compile the project, but no image as well as no buttons are displayed anymore.
Upvotes: 0
Views: 382
Reputation: 14413
Your code don't compile cause you are creating an anonymous class incorrectly. You can solve it using initialization block like show below.
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);
}
});
Also and not less important. Don't use null
layout you can read more here
Upvotes: 3
Reputation: 3967
I can't try it now, and without knowing which are the errors, I guess that the problem is caused by how you're building your JPanel.
Try something like:
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);
}
});
Upvotes: 1
Reputation: 10294
You can't use an inner class like this :
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);
}
}
The try {}
should be in a method not directly in the class
Upvotes: 1