2017-01-30 6 views
-1

プログラムは正常に動作しますが、setUndecoratedコードを追加するとパネルが表示されません。プログラムを最小化して再オープンすると、問題が解決します。私はrepaint()を試しましたが、動作しません。setUndecorated()コードが正しく動作しません

package testing; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class test extends JFrame{ 

    static int width = 900; 
    static int height = 520; 
    JFrame frame; 
    JPanel panel; 

    JButton selectKey = new JButton("Select KeyIMG"); 
    static BufferedImage bg; 

    class MyCanvas extends JComponent{ 

     public void paint(Graphics g) { 
       try { 
       bg = ImageIO.read(new File("BGFILE")); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      g.setClip(0, 0, width, height); 

      g.drawImage(bg,0,0,width,height, this); 

      g.dispose();panel.repaint();  
      } 
     } 

    public test(){ 
     super("Test");    
     setBounds(250, 100, width, height); 

     selectKey.setBounds(width/9,height/2,width/45*8,height/13);   

     getContentPane().add(new MyCanvas());setUndecorated(true);setVisible(true); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     panel = new JPanel(); 
     panel.setBackground(new Color(0, 0, 0, 0)); 
     panel.setLayout(null); 

     panel.add(selectKey); 
     add(panel);  

    } 


    public static void main(String...Args){ 
     new test(); 
    } 


} 

何が問題なのですか。 paintをオーバーライド

+0

それはすべて – Holger

+0

をコンパイルしません、それは問題を再現できない場合は、なぜあなたは、このコードを投稿できますか? – Salihcan

+0

ではありません@Holger ... – Holger

答えて

2

問題

  • paintを無効にすることは非常にお勧めできません。塗装は、最終的な結果を生み出すために一緒に働く複雑な一連の配合方法です。 paintComponentを無効にすることを強くお勧めします。
  • super.paintを呼び出していません。前のコメントを参照してください。あなたがやっていることを正確に把握しておらず、ペイントメソッドの責任を引き継ぐ準備ができていなければ、それはsuperメソッドと呼ばれます。
  • 不透明なコンポーネントにアルファベースのカラーを使用する。 panel.setBackground(new Color(0, 0, 0, 0));。これは悪い考えです。スイングは、不透明で透明なコンポーネントの処理方法しか知らず、アルファベースの色でコンポーネントをペイントする方法を知らない。 APIは、問題の主な原因の1つである可能性が高い下位のコンポーネントを無視します。
  • g.dispose();あなたが作成またはコピーしていない文脈を廃棄しないでください。そうすることで、他のコンポーネントの塗りつぶしを防ぐことができます。
  • ペイント方法の中からpanel.repaint();を呼び出してはいけません。ペイントペイントは現在の状態を変更することは決してありません。それはNullPointerException

「その他」の懸念

    を生成することができ、実際には、 MyCanvasはとにかく panelを修正すべき権利とあなたのコードが設定されている方法を持っていない、すべてのCPUサイクルをかむを開始します
  • static BufferedImage bg;が気になります。この変数を処理する必要があるボディは他にありません。MyCanvasクラス
  • g.setClip(0, 0, width, height);は意味がありません(潜在的に危険です)。これは既にpaintメソッドが呼び出される前に行われています。これは、部品の実際の大きさに頼っていないという事実によって悪化します。これは、部品が表示されている範囲をオーバーランさせる可能性があります。
  • JFrameから延長しています。あなたはトップレベルのコンテナからの伸長を避けるべきです。新しい/再利用可能な機能を追加することはめったにない複雑なコンポーネントです。JPanelで始まり、必要なコンテナに追加してください。

例...

Background example

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class Test { 

    class Background extends JComponent { 

     private BufferedImage bg; 

     public Background() { 
      try { 
       bg = ImageIO.read(new File("/path/to/your/image")); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      setLayout(new BorderLayout()); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return bg == null ? super.getPreferredSize() : new Dimension(bg.getWidth(), bg.getHeight()); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      if (bg != null) { 
       Graphics2D g2d = (Graphics2D) g.create(); 
       g2d.drawImage(bg, 0, 0, getWidth(), getHeight(), this); 
       g2d.dispose(); 
      } 
     } 
    } 

    public Test() { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new JFrame(); 
       frame.setContentPane(new Background()); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setUndecorated(true); 

       JPanel panel = new JPanel(new GridBagLayout()); 
       GridBagConstraints gbc = new GridBagConstraints(); 
       gbc.gridwidth = GridBagConstraints.REMAINDER; 
       panel.add(new JLabel("This is a label, don't I look pretty"), gbc); 
       JButton selectKey = new JButton("Select KeyIMG"); 
       panel.add(selectKey, gbc); 
       panel.setOpaque(false); 

       frame.add(panel); 

       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public static void main(String... Args) { 
     new Test(); 
    } 

} 
+0

ピクセルに合わせて配置したいと思います。 'BorderLayout()'コードが動作します。しかし、 'setLayout(null)'を実行するとパネルは表示されません。 – Salihcan

+0

はい、nullレイアウトを使用しない理由を歓迎します。 'ヌル'レイアウトを避け、ピクセルの完全なレイアウトは現代のUIデザイン内の錯覚です。コンポーネントの個々のサイズに影響する要因は多すぎますが、いずれも制御できません。 Swingは、コアのレイアウトマネージャーと連携するように設計されています。これを破棄することで、問題や問題の終わりがなくなり、修正を試みる時間がますます増えます – MadProgrammer

関連する問題