2017-02-10 17 views
0

私は異なるJButtonを使ってJFrameを作ったので、別のクラスから画像を取得したいと思います。何か案は?または同じクラスをどのように描くのですか? それは私のコンパイラはいつも私にエラーメッセージを与えるJava:アクションリスナー内でグラフィックスコンポーネントを使用する

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

これは、次のコードで行われました。ワットは「イメージ」を取得することを意味しますか? 「描く」イメージですか?どのようなエラーメッセージが表示され、どのような条件で表示されますか? ...あなたのコードを見て(物語を無視して)、あなたはレイアウトがなく、xの境界を指定していないので、決して見ることはできません。 –

+0

しかし、私はJbuttonを私が望む正確な位置に置き、同時にペイントコンポーネントを呼び出すことができます> –

+0

'x.setBounds(..、...、..、...)'をどこにでも追加します。ああ、xは、xの左上隅から遠い画像を置くので、700x200より大きくする必要があります。 –

答えて

5

ふう...私はすべての図面を行うには聞かせてdoesntのため!あなたはJava naming conventionsをフォローしていない

  1. クラス名は名詞である必要があり、混合に私はLOTコード内のエラーのを(私はコンパイルエラーを修正した後でも)を参照してください大文字の各内部単語の最初の文字を持つ場合

    redは、より説明的で大文字にする必要があります。同じあなたは平易な英語で言うことになるJFrameを拡張しているgui1

  2. のために行く:redJFrameで、あなたは本当にJava Swing using extends JFrame vs callint it inside of class

  3. を参照してください...これを避けるため、代わりに JPanel Sに基づいてGUIを作成する必要があります
  4. あなたは、あなたがnull-layoutを使用しているpack()

  5. を使用する代わりに、サイズ(使用しているJButtonサイズのREAAAAAAALLY大きな1画面)を設定していますピクセル完璧なGUIはSwing初心者のための複雑なGUIを作成する最も簡単な方法のように思えるかもしれませんが、将来的に見つけるより多くの問題を維持するのは難しく、その使用を避けるべき理由と、Layout Managersと一緒に動作するようにGUIを変更する必要がある理由の詳細については、Null layout is evilWhy is it frowned upon to use a null layout in Swing?を、Empty Bordersと一緒に追加して、コンポーネント間に余分なスペースを入れてください。

  6. あなたは代わりにJFrame#show()の代わりにJFrame#setVisible(...)を使用する必要があります。

  7. ポイント#4に関連して、setBounds(...)メソッドを呼び出してはいけませんが、その計算をレイアウトマネージャに任せてください。

  8. 次のようにあなたがEvent Dispatch Thread (EDT)でプログラムを配置していない、スイングはスレッドセーフではありません、あなたはmain()方法を変更することでこの問題を解決することができは:

    public static void main(String[] args) { 
        SwingUtilities.invokeLater(new Runnable() { 
         @Override 
         public void run() { 
          //Your constructor here 
         } 
        }); 
    } 
    
  9. あなたはAWTやSwingコンポーネントを混合していますAWTのCanvasを使用する代わりに、より多くの機能とサポートを持つSwingのJPanelを使用してください。

  10. 画像は、それらがJARファイルにパッケージ化しているいったん埋め込まれたリソースになるので、それは彼らが存在していたかのようにそれらを処理することを開始するのが賢明だ、外部ファイルとしてembedded-resourceタグには示されていないようになります。あなたはCanvasからJPanelに変更すると

  11. あなたも@Overrides注釈を追加することを忘れないでください、そのpaintComponent(...)メソッドをオーバーライドしていないpaint(...)をし、それが最初の行にsuper.paintComponent(g)法だ呼び出す必要があります。 tutorial on Swing custom paintingを参照してください。

  12. あなたはstaticキーワードの使用を乱用している、私はあなたがこれだけ意志グラフィカル環境で起動する前に、背中とLearn the basics言語の行くことをお勧めします上記のすべてのエラーを見た後how does the static keyword works?

を見ますあなたの学習にさらに困難を加える。私はあなたがボタンクリックで画像を描画したい理解して何から


、その場合は、あなたがJLabelであなたのイメージをラップして、親JPanelに追加されJPanelにそのJLabelを追加することができますこれは後にJFrameに追加されます。

enter image description here

あなたは上記GIFで見ることができるように、ユーザーがボタンを押した後にアイコンが表示されます。

これは明らかに、前述のように、GUIがレイアウトマネージャと空の境界の組み合わせでより「魅力的」になるように改善できます。あなたの質問は非常に明確ではない

import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.BoxLayout; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class ImageDrawingFromOneClassToAnother { 

    private JFrame frame; 

    private JPanel pane; 
    private JPanel leftPane; 
    private JPanel rightPane; 

    private ImageIcon icon; 

    private JButton button; 

    private JLabel label; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new ImageDrawingFromOneClassToAnother().createAndShowGui(); 
      } 
     }); 
    } 

    public void createAndShowGui() { 
     frame = new JFrame(getClass().getSimpleName()); 

     icon = new ImageIcon(this.getClass().getResource("king.png")); //Read images as if they were already embedded resources 

     button = new JButton("Draw image"); 

     label = new JLabel(""); //Create an empty label 

     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       label.setIcon(icon); //On button click, we set the icon for the empty label 
      } 
     }); 

     pane = new JPanel() { 
      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(300, 200); //Set a size for the main panel 
      } 
     }; 

     pane.setLayout(new GridLayout(1, 2)); //The main panel 

     leftPane = new JPanel(); //The button panel 
     leftPane.setLayout(new BoxLayout(leftPane, BoxLayout.PAGE_AXIS)); 

     leftPane.add(button); 

     rightPane = new JPanel(); //The panel where the image will be drawn 
     rightPane.add(label); 

     //We add both (button and image) panels to the main panel 
     pane.add(leftPane); 
     pane.add(rightPane); 

     frame.add(pane); //Add the main panel to the frame 
     frame.pack(); //Calculate its preferred size 
     frame.setVisible(true); //Set it to be visible 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 
関連する問題