我正在尝试使用背景和一些按钮进行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();
}
}
});
}
}
我编辑了修改后的代码,现在无法编译项目,但不再显示图像和按钮了。
答案 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);
}
});