1

拡張する 2 つのクラスを作成しました。オブジェクトを作成しましたが、ファイルが表示されません (タイトルフォーム 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!!!!!!");
 }
 }
4

2 に答える 2

2

あなたのイメージはあなたのようには見えません

  1. を呼び出して、2 番目JFrameの ,を表示しないでください。image_classsetVisible
  2. Java は値渡しでmy_imageあるため、メソッド内で同じ名前のクラス メンバー変数に代入するのloadではなく、変数のローカル コピーに代入します。

交換

my_image = ImageIO.read(open_chooser.getSelectedFile());

this.my_image = ImageIO.read(open_chooser.getSelectedFile());

(または単に変数を渡さないでください)

JFrameここではシングルを使用し、サブクラスを追加して、JComponentそのコンポーネントに画像を描画することをお勧めします。

関連している:

于 2013-01-12T14:19:00.790 に答える
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 が継承するインスタンスに追加します。これらは 2 つの完全に異なるオブジェクトであり、一方を変更しても他方には影響しません。

解決策は、継承を悪用するのではなく、元の GUI でイメージを表示することです。

また、JVM から渡された Graphics オブジェクトを破棄しないでください。これは厄介な副作用を引き起こす可能性があります。

于 2013-01-12T14:44:50.133 に答える