Java

时间:2015-11-11 20:28:43

标签: java swing jframe jpanel border-layout

我已经尝试了很多不同的方法,但我会解释两个以及发生了什么(没有错误消息或任何东西,只是没有出现像他们应该或根本没有出现):

首先,我创建了一个名为layout的JPanel,并将其设置为BorderLayout。以下是我如何看待它的片段:

JPanel layout = new JPanel();
layout.setLayout(new BorderLayout());

colorChoice = new JLabel("Choose your color: ");
layout.add(colorChoice, BorderLayout.NORTH);

colorBox = new JComboBox(fireworkColors);
colorBox.addActionListener(this);
layout.add(colorBox, BorderLayout.NORTH);

在这种情况下,发生的事情是它们根本不显示。它只会继续我添加的任何其他内容。

然后我尝试了setLayout(new BorderLayout());以下是该代码的片段:

    setLayout(new BorderLayout());
    colorChoice = new JLabel("Choose your color: ");
    add(colorChoice, BorderLayout.NORTH);

    colorBox = new JComboBox(fireworkColors);
    colorBox.addActionListener(this);
    add(colorBox, BorderLayout.NORTH); 

在这种情况下,它们被添加,但宽度占据了框架的整个宽度,文本字段(未显示在代码段中)基本上占用了其他所有内容。

以下是我的尝试: setPreferredSize()&的setSize()

我还缺少其他东西吗?谢谢。

我还应该注意,这是一个单独的类,这个类中没有main。我之所以这么说,是因为我扩展了JPanel而不是JFrame。我见过一些人扩展JFrame并使用JFrame,但我还没有尝试过。

3 个答案:

答案 0 :(得分:4)

  • 您创建了一个JPanel,但未将其添加到任何容器中。它被添加到某个东西(一个JFrame,或者在某个框架中的某个框架中的其他面板上)之后才会被看到。
  • 您在BorderLayout中向同一位置添加了两个组件。添加的最后一个是占据该位置的那个。

更新

您无需延长JFrame。我从来没有这样做,相反,我总是延伸JPanel。这使我的自定义组件更加灵活:可以将它们添加到另一个面板中,也可以将它们添加到框架中。

所以,为了证明这个问题,我将制作一个完整的小程序:

public class BadGui
    {
    public static void main(String[] argv)
        {
        final JFrame frame = new JFrame("Hello World");
        final JPanel panel = new JPanel();
        panel.add(new JLabel("Hello"), BorderLayout.NORTH);
        panel.add(new JLabel("World"), BorderLayout.SOUTH);
        frame.setVisible(true);
        }
    }

在这个程序中,我创建了一个面板,但没有将其添加到任何内容中,因此它永远不可见。

在下一个程序中,我将通过将面板添加到框架来修复它。

public class FixedGui
    {
    public static void main(String[] argv)
        {
        final JFrame frame = new JFrame("Hello World");
        final JPanel panel = new JPanel();
        panel.add(new JLabel("Hello"), BorderLayout.NORTH);
        panel.add(new JLabel("World"), BorderLayout.SOUTH);
        frame.getContentPane().add(panel);
        frame.setVisible(true);
        }
    }

请注意,在这两个中,当我向面板添加内容时,我选择了不同的布局参数(一个标签我放在'North'而另一个标签放在'South')。

答案 1 :(得分:1)

以下是带有BorderLayout的yourapp.appspot.com/_ah/api/explorer示例,其中添加了JPanel按钮和标签到“North”

JPanel

答案 2 :(得分:0)

以下建议假设您延长JFrame

测试

首先,如果没有看到 所有内容 ,那么您可以尝试各种各样的事情。

首先,在您加载所有内容后,请尝试添加此内容(再次,假设您的扩展 JFrame

revalidate();
repaint();

我一直将它添加到我自己的Swing项目中,因为它刷新并检查是否所有内容都在框架上。

如果这不起作用,请确保将JComponent所有JPanel添加到JPanel,并且只有JFrame位于JFrameJPanel 1}}。你的JPanel window = new JPanel(); JButton button = new JButton("Press me"); add(window); window.add(button); // Notice how it's the JPanel that holds my components. 无法解决所有问题; JMenu做到了。

JFrame

但有一件事,您仍然会通过JPanel而不是def __call__(self): self.request.response.setHeader('X-Theme-Disabled', '1') return self.template() 添加public int emptyRows(JTable table) { int emptyRows = 0; rowSearch: for (int row = 0; row < table.getRowCount(); row++) { //Iterate through all the rows for (int col = 0; col < table.getColumnCount(); col++) { //Iterate through all the columns in the row if (table.getValueAt(row, col) != null) { //Check if the box is empty continue rowSearch; //If the value is not null, the row contains stuff so go onto the next row } } emptyRows++; //Conditional never evaluated to true so none of the columns in the row contained anything } return emptyRows; } 和什么内容。