我在创建GUI时遇到了一些问题。我想要它,所以当按下按钮时,两个图像将并排显示在屏幕上。将来会有更多的图像,而不仅仅是两个,可能有数百个(很多非常小的图像)我可以在Main类的按钮中添加但是我无法添加动作监听器。当我尝试在GUI类中添加一个按钮时,没有任何显示。同样在动作监听器中,我无法调用paint函数。任何帮助都会很棒,谢谢!
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import java.util.Random;
import javax.imageio.*;
import javax.swing.*;
public class Gui extends JFrame {
private static JButton startButton;
BufferedImage img;
BufferedImage img2;
public void paint(Graphics g) {
g.drawImage(img, 0, 0, null);
g.drawImage(img2, 30, 0, null);
}
public Gui() {
try {
img = ImageIO.read(new File("res/a.png"));
img2 = ImageIO.read(new File("res/b.png"));
} catch (IOException e) {
}
startButton = new JButton("tessttt");
getContentPane().add(startButton); //this doesn't show up
Events e = new Events();
startButton.addActionListener(e);
}
public Dimension getPreferredSize() { //sets size of screen
if (img == null) {
return new Dimension(100,100);
} else {
// return new Dimension(img.getWidth(null), img.getHeight(null)); //sets size to one image //// change to all images
return new Dimension(500,500);
}
}
public static void main(String[] args) {
JFrame f = new JFrame("Load Image Sample");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(640, 480);
f.add(new Gui()); //this is the only time I can call this and the images will show up
JPanel panel = new JPanel();
panel.add(new JLabel("Hello"));
f.add(panel); //this will show up but i can't add an action listener if this was a button
f.setLayout(new FlowLayout());
f.setVisible(true);
}
public class Events implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == startButton) {
getContentPane.add(new Gui()); //f.add(newGui()); //this also gives errors
}
}
}
}
我按下了按钮。在大班我做了这个
startButton = new JButton("tessttt");
f.add(startButton);
startButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
f.add(new Gui());
//f.repaint();
}
});
现在问题是如何调用油漆?其中任何一个都不起作用。
我得到的错误的前几行
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: adding a window to a container
at java.awt.Container.checkNotAWindow(Unknown Source)
at java.awt.Container.addImpl(Unknown Source)
at java.awt.Container.add(Unknown Source)
at javax.swing.JFrame.addImpl(Unknown Source)
答案 0 :(得分:3)
首先,Gui
从JFrame
延伸,但在main
中,您创建了JFrame
的新实例并尝试添加{{1}的实例对它来说。
你不能这样做。顶级容器不能包含另一个顶级容器。
首先,您应该避免从Gui
延伸,因为您没有向其添加任何功能。
如你所知,覆盖JFrame
顶级容器是不可取的,这样做可以很容易地破坏绘画的工作方式。
相反。
首先创建一个自定义组件,从paint
扩展并覆盖它的JPanel
方法并在此处添加自定义绘画,确保首先调用paintComponent
。
这将绘制您的两张图片。
创建另一个自定义组件,从super.paintComponent
扩展,将“图像”面板和按钮(以及其他控件)添加到其中,使用您想要的布局管理器,如果需要,还可以使用复合布局。
最后,创建一个JPanel
的实例并向其添加“controls”面板......