我有一个主JFrame(屏幕)和单独的JPaels,所有这些都由他们自己的方法包含。main 方法调用另一个托管 JFrame 的方法(create),然后将所有其他 JPanels 添加到其中。我的问题是只显示其中 1 个 JPanels,每次我运行代码时它都会更改。我尝试过使用 1 个主要的 JPanel 并且这些方法将它们的组件(JLables...)添加到其中,但我遇到了同样的问题。那么我怎样才能拥有多种方法并同时显示在一个窗口中。我相信我可以把它全部放在一种方法中,但这会很长。虽然不是现在,但我会有很多方法都可以把自己独特的东西放在窗户上。请在下面查看我当前的代码:
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class GUI extends JPanel
{
/**
* Creation of variables used throughout the GUI Class.
*/
private static final long serialVersionUID = 1L;
private int lookReplyX = 5;
private int lookReplyY = 5;
public static void main(String[] args)
{
GUI g = new GUI();
g.create();
}
private void create()
{
JFrame screen = new JFrame("Dungeon of Doom");
screen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//set size to full screen.
screen.setExtendedState(Frame.MAXIMIZED_BOTH);
screen.setVisible(true);
//Add all JPanes to screen
screen.getContentPane().add(lookReplyGUI());
screen.getContentPane().add(titlePanel());
}
private JPanel lookReplyGUI()
{
JPanel lookReplyGUIPanel = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
for(int y = lookReplyY; y>0; y--)
{
for(int x = lookReplyX; x>0; x--)
{
JLabel lookx = new JLabel(" " + y + "" + x);
c.gridwidth = 1;
c.gridheight = 1;
c.gridx = x+1;
c.gridy = y+1;
lookReplyGUIPanel.add(lookx, c);
}
}
return lookReplyGUIPanel;
}
private JPanel titlePanel()
{
JPanel titlePanel = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
JLabel title = new JLabel("DOD");
titlePanel.add(title, c);
c.gridwidth = 7;
c.gridheight = 1;
c.gridx = lookReplyX+2;
c.gridy = 1;
return titlePanel;
}
}
谢谢!!!
问题的主要原因是JFrame
默认使用BorderLayout
,这意味着一次只有一个组件可以占据五个可用位置中的任何一个。
默认位置为 CENTER
。通过做...
screen.getContentPane().add(lookReplyGUI());
screen.getContentPane().add(titlePanel());
lookRelyGUI
组件有效,不可见(其大小和位置设置为 0x0)。
相反,请尝试使用其他布局管理器...
JFrame screen = new JFrame("Dungeon of Doom");
screen.setLayout(new GridLayout(2, 0));
screen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//set size to full screen.
screen.setExtendedState(Frame.MAXIMIZED_BOTH);
//Add all JPanes to screen
screen.getContentPane().add(lookReplyGUI());
screen.getContentPane().add(titlePanel());
// Do this only when you're ready
screen.setVisible(true);
您需要做的就是将 jPanel 添加到整个类中使用的变量中。
private static final long serialVersionUID = 1L;
private int lookReplyX = 5;
private int lookReplyY = 5;
private jPanel allPanels = new jPanel;
然后将所有面板放入该面板并显示该面板...
您可以保留正在使用的代码。您只看到一个面板的原因是第二个面板被第一个面板覆盖。默认情况下,您没有设置大小。要解决此问题,请添加
private JPanel lookReplyGUI()
{ ...
JLabel lookx = new JLabel(" " + y + "" + x);
c.gridwidth = 1;
c.gridheight = 1;
c.gridx = x+1;
c.gridy = y+1;
lookReplyGUIPanel.add(lookx, c);
lookReplyGUIPanel.setSize(100,100); //this line for example
}
...
和
private JPanel titlePanel(){
...
JLabel title = new JLabel("DOD");
titlePanel.add(title, c);
titlePanel.setSize(25,50); //this line for example
...
然后,您可以像设置大小一样选择面板位置。