【问题标题】:When adding panel in panel during runtime i can't set the location在运行时在面板中添加面板时,我无法设置位置
【发布时间】:2012-06-06 11:37:09
【问题描述】:

我在使用 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 时,它开始在面板上方绘制,但我仍然无法设置面板的任何位置?

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

【问题讨论】:

  • 简短的回答是您必须完成 Oracle 网站上的 Swing 教程。如您所见,Java 布局与 .Net 应用程序的布局不同。我谦虚地建议您首先访问docs.oracle.com/javase/tutorial/uiswing 并学习一些教程,以便您了解不同的布局管理器。然后像 BorderLayout 之类的东西会更有意义。

标签: java swing jpanel draw layout-manager


【解决方案1】:
  • BorderLayout已实现5.放置JComponents的区域,

  • 使用BorderLayout可以看到最后添加到混凝土区域的JComponent

  • 使用(在 JPanel 中预实现)FlowLayout,接受来自 JComponents 的 PreferredSize

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

  • 一些规则How Swing LayoutManager works

【讨论】:

  • 感谢您提供此信息,它使它更清楚一点。但我必须说,当你来自 c# 时,这一切都很难理解,所以我必须再次为自己创建概述并进行实验。
【解决方案2】:

好的,这里有一些代码可以帮助你,但我真的建议你花一些时间在 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();
    }

}

【讨论】:

  • +1 表示答案,尤其是 “这不是生产级代码,而是更多地说明一点”。你会认为我们不需要明确说明,但话又说回来.. ;)
  • @AndrewThompson 我只是知道你会读它 Andrew,考虑到这一点,我想我必须在那里添加一些法律保护!说真的,这不是最好的代码,但我发现这样解释更容易,然后再介绍更高级的概念和想法。感谢您的 +1,非常感谢。
【解决方案3】:

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

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);

【讨论】:

  • FlowLayout 和 BoxLayout 很适合接受来自 JComponents +1 的 PrefferedSize,请删除代码行 newPanel.setSize(50, 50);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
相关资源
最近更新 更多