我已经与Diferent JButtons制作了一个JFrame,我想从另一个类中获取一个图像。有任何想法吗?或者如何在同一个类上绘制但是在执行的操作上? 因为它不允许我做任何图纸......我的编译器总是给我错误信息
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import javax.swing.*;
public class red extends JFrame {
public JButton b;
public JButton b1;
public JButton b2;
public JButton b3;
public JButton b4;
public static Image p;
public static Graphics g;
public red() throws IOException {
gui1 x = new gui1();
setTitle(" ");
setSize(1200,700);
setLayout(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
b= new JButton("click");
b1= new JButton();
b.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e0){
b1.setBounds(0, 0, 200, 200);
b.show(false);
add(x);
}
});
b.setBounds(0, 0, 100, 100);
add(b1);
add(b);
setVisible(true);
}
public static void main(String[] args) throws IOException {
red k = new red();
}
}
import java.awt.*;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;
public class gui1 extends Canvas {
public static Image p;
public void paint(Graphics g){
g.drawImage(p, 700, 200, 100, 100, this);
}
{
try {
p= ImageIO.read(new File("Lighthouse.jpg"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
答案 0 :(得分:5)
唷!我在您的代码中看到很多错误(即使我更正了编译错误):
您没有关注Java naming conventions:
类名应该是名词,大小写混合,每个内部单词大写的第一个字母
虽然red
是名词,但它应该更具描述性并且大写。 gui1
您正在扩展JFrame
,用简单的英语说:red
是 JFrame
,您应该真的避免这种情况,创建基于JPanel
的GUI而不是...请参阅Java Swing using extends JFrame vs callint it inside of class
您正在设置尺寸(对于您正在使用的JButton
尺寸,这是一个可以重新设置的大窗口,而是使用pack()
您正在使用null-layout
,而像素完美的图形用户界面似乎是为Swing新手创建复杂图形用户界面的最简单方法,您使用它们越多,与此相关的问题就越多#&# 39;将来会发现它们很难维护并导致随机问题,它们不会调整大小等等。请阅读Null layout is evil和Why is it frowned upon to use a null layout in Swing?以获取有关为什么要避免其问题的更多信息使用以及为什么要更改GUI以使用Layout Managers以及Empty Borders来获取组件之间的额外间距。
您正在使用已弃用的方法JFrame#show()
,而应该使用JFrame#setVisible(...)
。
与第4点相关,您不应该调用setBounds(...)
方法,而是将这些计算交给布局管理员。
您没有将您的程序放在Event Dispatch Thread (EDT)上,Swing不是线程安全的,您可以通过更改main()
方法来解决此问题:
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
//Your constructor here
}
});
}
您正在混合AWT和Swing组件,而不是使用AWT'}使用具有更多功能和支持的Swing Canvas
。
图像一旦被打包到JAR文件中就会成为嵌入式资源,因此开始将它们视为已经存在,而不是像 JPanel
tag。
从Canvas
更改为JPanel
后,您应该覆盖其embedded-resource方法,而不是paintComponent(...)
并将其称为super.paintComponent(g)
方法作为第一行,也不要忘记添加@Overrides
注释。请参阅paint(...)
。
您滥用static
关键字,请参阅tutorial on Swing custom painting
在看到上述所有错误后,我建议您在开始使用图形环境之前返回并使用该语言的how does the static keyword works?,这只会给您的学习带来更多困难。
根据我的理解,您希望在点击按钮上绘制图像,如果是这样,那么您可以将图像包裹在JLabel
中并将JLabel
添加到{ {1}}然后添加到父JPanel
,后来添加到JPanel
:
正如您在上面的GIF中所看到的,用户按下按钮后会显示图标。
显然,可以改进这一点,使GUI更具吸引力"如前所述,布局管理器和空边框的组合。
使用以下代码完成:
JFrame