2017-02-07 8 views
0

私は大学でJavaを勉強していましたが、私は全く新しいですが、改善するために最善を尽くしています。 グリースタイルのグリッドを表示するGUIをセットアップしようとしていますが(グラスアイコン付きのJLabelsを使用しています)、芝生の上に他のアイコン(文字アイコン)を追加して、草の上に。私は、JLayeredPaneを使用してそれを行うことができると思って、別のJLabelを同じ場所に追加しましたが、より高いレイヤーの優先順位を付けましたが、うまくいかないようです。私が何をすべきかについてのアドバイスは?透明な背景アイコンを持つJLabelを別のJLabelに追加して両方を表示

感謝:)

編集:私はMigLayoutとsetOpaque(false)の命令を使用して、これを行うことができました。あなたの答えをありがとう:)

+2

これを行う方法はいくつかあります。あなたは草のラベルにレイアウトマネージャを適用することができるので、それらにコンポーネントを追加することができます。この方法では、単純に芝生のタイルを表示するために 'GridLayout'を使うことができます。あるいは、芝生の画像を使って背景をペイントするカスタムコンポーネントを作ることもできます。もう一度、レイアウトマネージャを追加して、コンポーネントを追加することができます。どちらもメリットがありますが、カスタムパネルはもっと複雑ですが、コンポーネントのサイズをより細かく制御できます。ラベルは簡単ですが、アイコンのサイズではなく、内容ではありません – MadProgrammer

+0

ラベルがアイコンのサイズ時間がある場合は、サンプルコードを投稿してください。 –

+0

「私はこれを解決しました...」で質問を編集するのではなく、あなたの質問に回答を追加してください([mcve]形式のコードを含む)ので、将来この質問を見に来る人は、彼らにも同様の問題や疑問がある場合は、それを行う。 @MadProgrammerはあなたが作業するためのコードを掲載していないため、このサンプルコードを投稿しませんでしたが、ここにいくつかの[examples]があります(http://stackoverflow.com/questions/19125707/simplest-way-to-set-image- as-jpanel-background)と[here](http://stackoverflow.com/questions/1466240/how-to-set-an-image-as-a-background-for-frame-in-swing-gui-of -java) – Frakcool

答えて

0

これは私がこの問題を解決するために使用したコードの断片です。

private void initialize() { 
    frame = new JFrame(); 
    frame.setBounds(100, 100, 457, 330); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().setLayout(null); 

    JLayeredPane panel = new JLayeredPane(); 
    panel.setBounds(0, 0, 457, 330); 
    frame.getContentPane().add(panel); 
    panel.setLayout(null); 

    JPanel background = new JPanel(); 
    background.setBounds(0, 0, 457, 330); 
    panel.add(background); 
    background.setLayout(new MigLayout("","","")); 
    //In my particular problem I used some constraints, but they're not needed 

    backgroundLabels = new JLabel[NCOLS][NROWS]; 
    for (int i = 0; i < NCOLS; i++) 
     for (int j = 0; j < NROWS; j++) { 
      backgroundLabels[i][j] = new JLabel(backgroundIcon); 
      //Assuming you have a backgroundIcon variable where you saved your icon 
      background.add(backgroundLabels[i][j], "cell " + i + " " + j); 
     } 

    JPanel characterPanel = new JPanel(); 
    panel.setLayer(characterPanel, 1); 
    characterPanel.setBounds(0, 0, 457, 330); 
    panel.add(characterPanel); 
    characterPanel.setOpaque(false); 
    characterPanel.setLayout(new MigLayout("","","")); 

    characterLabels = new JLabel[NCOLS][NROWS]; 
    for (int i = 0; i < NCOLS; i++) 
     for (int j = 0; j < NROWS; j++) { 
      characterLabels[i][j] = new JLabel(""); 
      //Creates empty character labels. You can then add icons using setIcon() 
      characterPanel.add(characterLabels[i][j], "cell " + i + " " + j); 
     } 

} 
+0

'setLayout(null)'と 'setBounds()'は悪い習慣で、 'レイアウトマネージャ 'と' null-layout'を混在させています(https://docs.oracle.com/javase/tutorial/uiswing /layout/visual.html)、レイアウトマネージャーと一緒に滞在してください。 [null layout is evil](http://www.leepoint.net/GUI/layouts/nulllayout.html)と[この質問](http://stackoverflow.com/questions/6592468/why-is)の回答をお読みください吹き飛ばされた空白のレイアウトを使用して) – Frakcool

関連する問題