2017-02-07 2 views
0

Ich habe Java an meiner Universität studiert, ich bin ziemlich neu, aber ich versuche, mein Bestes zu tun, um zu verbessern. Ich versuche, eine GUI einzurichten, die ein Raster von Grass Tiles (mit JLabels mit Grass-Symbolen) anzeigt, aber ich möchte einige andere Symbole auf dem Gras (Character-Symbole) hinzufügen, so dass ich einen stehenden Charakter sehen kann auf dem Gras. Ich dachte, ich könnte es tun, indem ich JLayeredPane benutze und ein anderes JLabel am selben Ort, aber mit einer höheren Layer-Priorität hinzufüge, aber es scheint nicht zu funktionieren. Irgendwelche Ratschläge, was ich tun sollte?Hinzufügen eines JLabel mit einem transparenten Hintergrundsymbol über einem anderen JLabel und Anzeigen beider

Thanks :)

EDIT: Ich schaffte dies mit MigLayout und die setOpaque (false) Anweisung zu tun. Danke für Ihre Antworten :)

+2

Es gibt eine Reihe von Möglichkeiten, wie Sie dies tun können. Sie können einen Layout-Manager auf die Grasbeschriftungen anwenden, sodass Sie ihnen Komponenten hinzufügen können. Auf diese Weise können Sie ein "GridLayout" einfach zum Anzeigen der Graskacheln verwenden oder Sie können eine benutzerdefinierte Komponente erstellen, die ihren Hintergrund mit dem Grasbild malt. Fügen Sie erneut einen Layout-Manager hinzu, damit Sie Komponenten hinzufügen können. Beide haben Vorteile, das benutzerdefinierte Panel ist komplizierter, aber bietet Ihnen mehr Kontrolle über die Größe der Komponente, das Etikett ist einfacher, wird aber immer nur die Größe des Symbols, nicht sein Inhalt – MadProgrammer

+0

Es ist in Ordnung, wenn die Etiketten sind Größe des Symbols. Wenn Sie Zeit haben, könnten Sie bitte einen Beispielcode dafür posten? –

+0

Anstatt Ihre Frage mit "Ich löste dies durch ..." zu bearbeiten, fügen Sie bitte eine Antwort zu Ihrer Frage hinzu (einschließlich des Codes in Form eines [mcve]), damit jeder, der diese Frage in der Zukunft sieht, weiß wie um es zu tun, wenn sie mit einem ähnlichen Problem oder einer ähnlichen Frage kommen. @MadProgrammer hat keinen Beispielcode dafür gepostet, weil Sie keinen Code veröffentlicht haben, um damit zu arbeiten, aber hier sind einige [Beispiele] (http://stackoverflow.com/questions/19125707/simplet-way-to-set-image- as-jpanel-background) und [hier] (http://stackoverflow.com/questions/1466240/how-to-set-an-image-as-a-background-for-frame-in-swing-gui-of -java) – Frakcool

Antwort

0

Dies ist ein Fragment des Codes, den ich verwendet habe, um dieses Problem zu lösen.

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)' und 'setBounds()' sind schlechte Praktiken, du mischst 'null-layout' mit [Layout-Managern] (https://docs.oracle.com/javase/tutorial/uiswing) /layout/visual.html), bleiben Sie bitte nur bei den Layout-Managern. Lesen Sie [null Layout ist böse] (http://www.leepoint.net/GUI/layouts/nulllayout.html) und die Antworten in [diese Frage] (http://stackoverflow.com/questions/6592468/why-is -it-runzelte-auf-zu-verwenden-ein-null-layout-in-swing) – Frakcool

Verwandte Themen