1

我在使用 java 及其 swing 组件时遇到了困难,我必须说,当我使用 C# 编程时,这要容易得多,而且我对这段代码有点卡住了。

我想做的是在another panel. 这向用户显示他加入的项目需要完成的任务。

在左侧,您可以看到面板,我想向其中添加更多面板。

我在 Gui 的右侧创建了一个面板,我想在运行时向它添加更多面板。我设法向它添加了一个面板,但它有一些奇怪的行为。

在此处输入图像描述

蓝色面板是newly created我在运行时使用此代码添加的面板。

  JPanel pnl = new JPanel();
  lpane.setBackground(Color.red);
  lpane.setLayout(new BorderLayout());
  pnl.setBounds(0, 0, 20, 100);
  pnl.setOpaque(true);
  pnl.setBackground(Color.BLUE);
  lpane.add(pnl);
  lpane.validate();

这只是一个测试,这就是为什么代码不包含其余面板的 for 循环等。如您所见,我正在使用它BorderLayout,因为我在互联网上找到了它,并且因为没有 BorderLayout 它不会绘制任何东西。另外,当我尝试将 BorderLayout 设置为 .NORTH 或 .STARTPAGE 时,它开始在面板上方绘制,但我仍然无法设置面板的任何位置?

有人知道为什么我不能设置任何位置或宽度和高度?

4

3 回答 3

3

好的,这里有一些代码可以帮助您,但我真的建议您花一些时间在http://docs.oracle.com/javase/tutorial/uiswing/上阅读 Swing 教程

布局管理器的存在是为了使布局灵活和动态,但需要一些时间和练习才能真正理解它们。下面的代码是做你想做的事情的一种方式,但它可能不是所有用例的正确代码。

注意:这不是生产级代码,而是更多地说明一点。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * Simple app to demonstrate how to use basic layout managers.
 * @author ewald
 */
public class LayoutPanels {

    private JFrame frame = new JFrame("The Top Frame");

    public LayoutPanels() {
        frame.setSize(640, 480);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());
    }


    /**
     * Sample code - this is not best practice, but it will help
     * you to make some progress.
     */
    public void startUp() {
        JPanel topPanel = new JPanel(new BorderLayout());

        JPanel eastPanel = new JPanel();
        eastPanel.setBackground(Color.BLUE);
        eastPanel.setLayout(new FlowLayout());
        eastPanel.setPreferredSize(new Dimension(150,200));

        JPanel onePanel = new JPanel(new FlowLayout());
        JPanel twoPanel = new JPanel(new FlowLayout());
        JPanel threePanel = new JPanel(new FlowLayout());

        onePanel.setPreferredSize(new Dimension(100,50));
        twoPanel.setPreferredSize(new Dimension(100,50));
        threePanel.setPreferredSize(new Dimension(100,50));

        onePanel.setBackground(Color.RED);
        twoPanel.setBackground(Color.GREEN);
        threePanel.setBackground(Color.YELLOW);

        eastPanel.add(onePanel);
        eastPanel.add(twoPanel);
        eastPanel.add(threePanel);

        topPanel.add(eastPanel, BorderLayout.EAST);

        frame.getContentPane().add(topPanel, BorderLayout.CENTER);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        LayoutPanels app = new LayoutPanels();
        app.startUp();
    }

}
于 2012-06-01T08:50:16.400 回答
3
  • BorderLayout已实施 5. 放置区域JComponents

  • 最后添加JComponent到混凝土区域是可见的BorderLayout

  • use (pre_implemented in JPanel) FlowLayout,接受 PreferredSize 来自 JComponents

  • GridLayout对于屏幕上相同大小的孩子

  • 一些规则Swing LayoutManager 的工作原理

于 2012-06-01T08:20:28.983 回答
2

有几种方法可以解决这个问题。一种方法是在父面板上使用 BoxLayout.Y_AXIS。这将导致您的子面板在添加时被添加到彼此下方。与拥有 5 个区域的 BorderLayout 不同,这不是此任务的正确方法。

JPanel pnl = new JPanel();
pnl.setLayout(new BoxLayout(pnl, BoxLayout.Y_AXIS)); // This will cause your new panels to be added below eachother
pnl.setBackground(Color.BLUE);
//and set sizes etc

JPanel newPanel = new JPanel();
newPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); // set layout on your child panel. FlowLayout is default but you might want to read up on the different layoutmanagers to pick the right one.
newPanel.setSize(50, 50); // you can use pnl.getWidth to make your panels to have the same width as it's parent pane, but you probably want the height to be locked
//and add the contents to this panel
pnl.add(newPanel);
于 2012-06-01T08:37:18.750 回答