Java教程提供了关于使用布局管理器的全面信息。有关详细信息,请参阅Laying Out Components Within a Container课程。 本教程没有很好地介绍布局的一个方面是嵌套布局,将一个布局放在另一个布局中以获得复杂的效果。 以下代码将各种组件放入框架中,以演示如何使用嵌套布局。所有显式设置的布局都显示为使用它们的面板的标题边框。 该守则值得注意的方面包括:
有一个组合框可以在运行时更改PLAF(可插拔外观)。
GUI可根据用户的需要进行扩展。
拆分窗格底部的图像位于滚动窗格的中心。
使用按钮动态添加左侧的标签示例。
灵光板
NestedLayoutExample.java
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.border.TitledBorder;
/**A short example of a nested layout that can change PLAF at runtime.
The TitledBorder of each JPanel shows the layouts explicitly set.
@author Andrew Thompson
@version 2011-04-12 */
class NestedLayoutExample {
public static void main(String[] args) {
Runnable r = new Runnable() {
public void run() {
final JFrame frame = new JFrame("Nested Layout Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JPanel gui = new JPanel(new BorderLayout(5,5));
gui.setBorder( new TitledBorder("BorderLayout(5,5)") );
//JToolBar tb = new JToolBar();
JPanel plafComponents = new JPanel(
new FlowLayout(FlowLayout.RIGHT, 3,3));
plafComponents.setBorder(
new TitledBorder("FlowLayout(FlowLayout.RIGHT, 3,3)") );
final UIManager.LookAndFeelInfo[] plafInfos =
UIManager.getInstalledLookAndFeels();
String[] plafNames = new String[plafInfos.length];
for (int ii=0; ii<plafInfos.length; ii++) {
plafNames[ii] = plafInfos[ii].getName();
}
final JComboBox plafChooser = new JComboBox(plafNames);
plafComponents.add(plafChooser);
final JCheckBox pack = new JCheckBox("Pack on PLAF change", true);
plafComponents.add(pack);
plafChooser.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent ae) {
int index = plafChooser.getSelectedIndex();
try {
UIManager.setLookAndFeel(
plafInfos[index].getClassName() );
SwingUtilities.updateComponentTreeUI(frame);
if (pack.isSelected()) {
frame.pack();
frame.setMinimumSize(frame.getSize());
}
} catch(Exception e) {
e.printStackTrace();
}
}
} );
gui.add(plafComponents, BorderLayout.NORTH);
JPanel dynamicLabels = new JPanel(new BorderLayout(4,4));
dynamicLabels.setBorder(
new TitledBorder("BorderLayout(4,4)") );
gui.add(dynamicLabels, BorderLayout.WEST);
final JPanel labels = new JPanel(new GridLayout(0,2,3,3));
labels.setBorder(
new TitledBorder("GridLayout(0,2,3,3)") );
JButton addNew = new JButton("Add Another Label");
dynamicLabels.add( addNew, BorderLayout.NORTH );
addNew.addActionListener( new ActionListener(){
private int labelCount = 0;
public void actionPerformed(ActionEvent ae) {
labels.add( new JLabel("Label " + ++labelCount) );
frame.validate();
}
} );
dynamicLabels.add( new JScrollPane(labels), BorderLayout.CENTER );
String[] header = {"Name", "Value"};
String[] a = new String[0];
String[] names = System.getProperties().
stringPropertyNames().toArray(a);
String[][] data = new String[names.length][2];
for (int ii=0; ii<names.length; ii++) {
data[ii][0] = names[ii];
data[ii][1] = System.getProperty(names[ii]);
}
DefaultTableModel model = new DefaultTableModel(data, header);
JTable table = new JTable(model);
try {
// 1.6+
table.setAutoCreateRowSorter(true);
} catch(Exception continuewithNoSort) {
}
JScrollPane tableScroll = new JScrollPane(table);
Dimension tablePreferred = tableScroll.getPreferredSize();
tableScroll.setPreferredSize(
new Dimension(tablePreferred.width, tablePreferred.height/3) );
JPanel imagePanel = new JPanel(new GridBagLayout());
imagePanel.setBorder(
new TitledBorder("GridBagLayout()") );
BufferedImage bi = new BufferedImage(
200,200,BufferedImage.TYPE_INT_ARGB);
Graphics2D g = bi.createGraphics();
GradientPaint gp = new GradientPaint(
20f,20f,Color.red, 180f,180f,Color.yellow);
g.setPaint(gp);
g.fillRect(0,0,200,200);
ImageIcon ii = new ImageIcon(bi);
JLabel imageLabel = new JLabel(ii);
imagePanel.add( imageLabel, null );
JSplitPane splitPane = new JSplitPane(
JSplitPane.VERTICAL_SPLIT,
tableScroll,
new JScrollPane(imagePanel));
gui.add( splitPane, BorderLayout.CENTER );
frame.setContentPane(gui);
frame.pack();
frame.setLocationRelativeTo(null);
try {
// 1.6+
frame.setLocationByPlatform(true);
frame.setMinimumSize(frame.getSize());
} catch(Throwable ignoreAndContinue) {
}
frame.setVisible(true);
}
};
SwingUtilities.invokeLater(r);
}
}
11条答案
按热度按时间pes8fvy91#
嵌套/组合布局示例
Java教程提供了关于使用布局管理器的全面信息。有关详细信息,请参阅Laying Out Components Within a Container课程。
本教程没有很好地介绍布局的一个方面是嵌套布局,将一个布局放在另一个布局中以获得复杂的效果。
以下代码将各种组件放入框架中,以演示如何使用嵌套布局。所有显式设置的布局都显示为使用它们的面板的标题边框。
该守则值得注意的方面包括:
灵光板
NestedLayoutExample.java
其他屏幕截图
窗棂
Mac OS X Aqua PLAF
Ubuntu GTK+PLAF
kmbjn2e32#
不要使用空布局。学习使用LayoutManager:
http://download.oracle.com/javase/tutorial/uiswing/layout/using.html
LayoutManager允许您正确处理窗口大小调整或动态组件计数。一开始他们可能看起来很吓人,但值得努力学习。
vbopmzt13#
我记得,空布局意味着绝对位置,因此很难计算JTable左上角位置的X点。但是,如果您只想一个接一个地拥有所有面板组件,则可以使用FlowLayout()管理器
或者,如果需要填充面板,则应使用GridLayout()作为。。。
祝你好运
csga3l584#
如果使用空布局管理器,则始终需要设置组件的边界。这就是你的问题所在。
你应该按照大家的建议去做,并使用一些布局管理器,相信他们可以节省时间。去看看@jzd的帖子中的教程。
享受吧,波洛。
w1jd8yoj5#
JTable
应添加到JScrollPane
中,实际应添加到JPanel
。JPanel
应该有一些布局管理器。如果您不关心部件尺寸的精度,您可以使用纯
BorderLayout
,并将其与FlowLayout
和GridLayout
结合使用。如果您需要精度,请使用jgoodiesFormLayout
。FormLayout
确实很复杂,但是您可以使用WindowBuilder
(它嵌入到Eclipse中),并查看它生成的代码。这可能看起来很复杂,但这只是一种无知。祝你好运
5f0d552i6#
首先,您应该认真考虑其他布局管理器,例如BorderLayoutManager(new JPanel(new BorderLayout())是一个很好的开始。
此外,在设计对话框时,请记住,您可以并且应该嵌套布局:一个JPanel在另一个JPanel中(例如,BorderLayout中的GridLayout)。请注意:一个“好”对话框应该适当调整大小,这样,如果用户调整框架的大小,您希望自动扩展信息对象,如表格,而不显示大面积的JPanel背景。这是使用NullLayout无法实现的。
但是,在这个大世界的某个地方,可能会有这样的情况:空布局就是这样。下面是一个例子:
2mbi3lxu7#
当组件具有“空”布局时,您必须自己管理布局,这意味着您必须计算组件的子组件的尺寸和位置,以决定它们的绘制位置。除非绝对必要,否则相当乏味。
如果您真的想要这种细粒度的控件,那么在处理UI布局之前,可以先尝试GridBagLayout。
ohfgkhjo8#
希望这有帮助。
2ledvvac9#
表型号取决于您的要求
h9vpoimq10#
试试这个。
laawzig211#
您可以使用以下代码。将JTable添加到JPanel。