我创建了两个扩展的类。我创建了一个对象,但是没有出现文件(方法工作正常,因为出现了标题形式draw()方法。所有代码都有:
public class Main_class extends JFrame implements ActionListener{
//**************************//
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable(){
public void run(){
new Main_class().setVisible(true);
}
});
}
//**************************//
JPanel panel;
JMenuBar mbar;
JMenuItem item;
JMenuItem open;
JMenu file;
BufferedImage my_image;
public Main_class(){
setSize(800, 600);
setTitle("TEST");
setResizable(false);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel=new JPanel();
mbar=new JMenuBar();
setJMenuBar(mbar);
file=new JMenu("File");
mbar.add(file);
open=new JMenuItem("Open");
open.addActionListener(this);
file.add(open);
}
@Override
public void actionPerformed(ActionEvent e) {
String zrodlo=e.getActionCommand();
image_class k=new image_class();
if(zrodlo.equals("Open")) try {
k.load(my_image);
} catch (IOException ex) {
Logger.getLogger(Main_class.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
///////////////////////////////////////////
public class image_class extends Main_class{
public void load(BufferedImage my_image) throws IOException{
JFileChooser open_chooser=new JFileChooser("//");
FileNameExtensionFilter rast=new FileNameExtensionFilter("Pliki grafiki rastrowej(.jpeg,.png.,gif...)", "jpeg","jpg", "gif","png","bmp");
open_chooser.setFileFilter(rast);
int a=open_chooser.showOpenDialog(null);
if(a==JFileChooser.APPROVE_OPTION){
String image_name=open_chooser.getSelectedFile().getAbsolutePath();
String roz=image_name.substring(image_name.lastIndexOf('.')+1);
my_image=ImageIO.read(open_chooser.getSelectedFile());
draw();
}
}
public void draw(){
panel=new JPanel(){
protected void paintComponent(Graphics g){
Graphics g2 = g.create();
g2.drawImage(my_image, 0, 0, getWidth(), getHeight(), null);
g2.dispose();
}
};
panel.setBounds(0, 0, 200, 200);
add(panel);
revalidate();
repaint();
System.out.print("LOADED!!!!!!");
}
}
答案 0 :(得分:2)
您的图片未显示为
JFrame
来显示您的第二个image_class
,setVisible
。my_image
分配给load
方法中同名的类成员变量,而是将其分配给本地变量的副本:替换
my_image = ImageIO.read(open_chooser.getSelectedFile());
与
this.my_image = ImageIO.read(open_chooser.getSelectedFile());
(或者根本就不传递变量)
建议您在此处使用单个JFrame
,添加JComponent
的子类并在该组件上绘制图像。
相关:
答案 1 :(得分:1)
你的一个主要问题是你滥用继承。您的代码来自image_class.java:
public void draw() {
panel = new JPanel() {
protected void paintComponent(Graphics g) {
Graphics g2 = g.create();
g2.drawImage(my_image, 0, 0, getWidth(), getHeight(), null);
g2.dispose();
}
};
panel.setBounds(0, 0, 200, 200);
add(panel);
revalidate();
repaint();
System.out.print("LOADED!!!!!!");
}
您正在将新JPanel添加到Main_class实例,但不是显示的那个实例,而是添加到image_class继承的实例。这是两个完全不同的对象,对一个对象进行更改不会影响另一个。
解决方案不是为此滥用继承,而是在原始GUI中显示图像。
此外,您永远不应该丢弃从JVM提供给您的Graphics对象,因为这会产生令人讨厌的副作用。