我在使用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-loop等的原因。
你可以看到我正在使用BorderLayout
因为我在互联网上找到了这个,并且因为没有BorderLayout它不会绘制任何东西。
此外,当我尝试将BorderLayout设置为.NORTH或.STARTPAGE时,它会在面板中开始绘制,但我仍然无法设置面板的任何位置?
有人知道为什么我不能设置任何职位或宽度和高度?
答案 0 :(得分:3)
BorderLayout
已实施了5. JComponents
区域,
使用JComponent
BorderLayout
到具体区域
使用(在JPanel中预先实现)FlowLayout
,接受来自JComponents的PreferredSize
GridLayout
适用于屏幕尺寸相同的儿童
答案 1 :(得分: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();
}
}
答案 2 :(得分:2)
对此有几种方法。一种方法是在父面板上使用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);