2016-09-25 6 views
1

私は時にはうまく動作し、ときどき動作しないコードを持っています。私は文字通り何も変更していないが、時にはテキストフィールドが表示され、時には表示されません。どのようにコードが毎回異なる実行可能性がありますか?それは私には意味がありません。私は合理的にJavaに新しいですが、私は確かにこれが可能だとは思わなかった...ときどきスイングテキストフィールドが表示されないことがあります。

誰かが私を助けることができる場合は、修正を含めることができますが、なぜこれが起こっている?私は問題を完全に理解したいので。ここで

は私のコードです:

import javax.swing.*; 

public class Window { 
    JFrame frame; 
    JPanel panel; 

    public Window(int x, int y, String t, boolean isHomePage){ 

     int xSize = x; 
     int ySize = y; 
     String title = t; 

     frame = new JFrame(); 
     frame.setSize(xSize, ySize); 
     frame.setLocationRelativeTo(null); 
     frame.setTitle(title); 
     frame.setVisible(true); 
     frame.setResizable(false); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 


     panel = new JPanel(); 
     frame.add(panel); 
     panel.setLayout(null); 
     panel.setVisible(true); 

     if (isHomePage){ 
      homePage(); 
     } 


    } 

    public void homePage(){ 

     JLabel usernameLabel = new JLabel(); 
     usernameLabel.setText("Please enter your username:"); 
     usernameLabel.setBounds(0,100,300,20); 
     panel.add(usernameLabel); 
     usernameLabel.setVisible(true); 

     JTextField textbox = new JTextField(); 
     textbox.setVisible(true); 
     textbox.setBounds(280,100,400,20); 
     panel.add(textbox); 

    } 


} 
+2

レイアウトマネージャを使用 – Reimeus

答えて

4

Reimeusが述べたよう -

  1. レイアウトマネージャーNOT NULLレイアウトを使用します。ヌルレイアウトとsetBounds()は、複雑なGUIを作成する最も簡単で最良の方法のようにSwingの初心者のように思えるかもしれませんが、Swing GUIを使用すると、より多くの深刻な問題が発生します。 GUIのサイズが変更されたときにコンポーネントのサイズを変更することはありません。これらのコンポーネントは、拡張または維持するロイヤルウィジェットであり、スクロールペインに配置すると完全に失敗し、元のプラットフォームとは異なるすべてのプラットフォームまたは画面解像度で表示されます。
  2. の後に、のJFrameのsetVisible(true)も呼び出してください。すべてのコンポーネントがGUIに追加されています。

setVisible(true)がどのように動作するのか混乱していることに注意してください。はい、あなたのサブコンポーネントで呼び出すのですが、既定では可視プロパティが既にtrueになっているため、これをサブコンポーネントで呼び出すことは効果がありません。あなたの問題は、JFrameでsetVisibleを呼び出すときです。 JPanelにテキストフィールドを追加する前にそれを呼び出すので、これが時折表示されます。自分で証明してください。 texztフィールドが表示されていない場合は、GUIを最小化して復元してください。

自分自身で、上記のように表示を交換したい場合は、CardLayoutを使用します。

+0

さて、わかりました。しかし、それがなぜ時には他のものではなく働くことができるのか説明することはできますか?確かにそれがセットコードならば、毎回まったく同じようにするべきですか? – Cutter

+1

@Cutter: 'setVisible(true)'の仕組みが混乱しているからです。はい、あなたのサブコンポーネントで呼び出すのですが、既定では可視プロパティが既にtrueになっているため、これをサブコンポーネントで呼び出すことは効果がありません。あなたの問題は、JFrameでsetVisibleを呼び出すときです。あなたは**前にそれを呼び出すでしょう** **これにテキストフィールドがあるJPanelを追加すると、時折このように表示されます。自分で証明してください。 texztフィールドが表示されていない場合は、GUIを最小化して復元してください。 –

+0

さて、それは良い説明のためにありがとう、よかった! – Cutter

関連する問題