如何添加JTable在JPanel与空布局?

我想将JTable添加到布局为nullJPanel中。JPanel包含其他组件。我必须在适当的位置添加JTable

49205 次浏览

不要使用空布局。学习使用LayoutManagers:

http://download.oracle.com/javase/tutorial/uiswing/layout/using.html

LayoutManagers允许您正确地处理窗口大小调整或动态组件计数。它们一开始可能看起来很吓人,但它们值得你努力去学习。

如果你使用空布局管理器,你总是需要设置一个组件的边界。 这就是你的问题所在。

你应该按照大家的建议去做,使用一些可以节省时间的布局管理器。 去@jzd的帖子中查看教程

享受,米德尔斯堡。

嵌套/组合布局示例

Java教程有关于使用布局管理器的全面信息。更多细节请参见在容器中布局组件课程。

本教程中很好地介绍了布局的一个方面是嵌套布局,将一个布局放在另一个布局中以获得复杂的效果。

下面的代码将各种组件放入一个框架中,以演示如何使用嵌套布局。所有显式设置的布局都显示为使用它们的面板的标题边框。

该代码值得注意的方面是:

  • 有一个组合框可以在运行时更改PLAF (Pluggable Look and Feel)。
  • GUI可以根据用户的需要进行扩展。
  • 分割窗格底部的图像位于滚动窗格的中央。
  • 左边的标签实例是使用按钮动态添加的。

灵气PLAF

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

其他屏幕截图

Windows PLAF

Mac OS X Aqua PLAF

Ubuntu GTK+ PLAF

正如我所记得的那样,布局意味着一个绝对位置,所以你很难为你的JTable左上角的位置计算X点。但如果你只是想一个接一个地拥有所有面板组件,你可以使用FlowLayout()管理器作为

JPanel panel=new JPanel(new FlowLayout());
panel.add(new aComponent());
panel.add(new bComponent());
panel.add(new JTable());

或者如果你需要填充面板,你应该使用GridLayout()作为…

int x=2,y=2;
JPanel panel=new JPanel(new GridLayout(y,x));
panel.add(new aComponent());
panel.add(new bComponent());
panel.add(new JTable());

祝你好运

您可以使用以下代码。将JTable添加到JPanel。

JPanel panel = new JPanel();
this.setContentPane(panel);
panel.setLayout(null);
String data[][] = \{\{"1.", "ABC"}, {"2.", "DEF"}, {"3.", "GHI" }};
String col[] = {"Sr. No", "Name"};
JTable table = new JTable(data,col);
table.setBounds(100, 100, 100, 80);
panel.add(table);
setVisible(true);
setSize(300,300);

JTable应该添加到JScrollPane中,而JScrollPane实际上应该添加到JPanel中。

JPanel应该有一些布局管理器。

如果你不关心组件大小的精度,你可以使用纯BorderLayout并将其与FlowLayoutGridLayout结合使用。如果你需要精度-使用jgoodies FormLayout

FormLayout确实是一个棘手的,但你可以玩一点WindowBuilder(嵌入到Eclipse中),并查看它生成的代码。这可能看起来很复杂,但这只是一种无知。

祝你好运。

JPanel panel = new JPanel();
JTable table = new JTable(rowData, colData);
JScrollPane scrollPane = new JScrollPane(table);
panel.add(scrollPane, BorderLayout.CENTER);
panel.setSize(800, 150);
panel.add(table);
panel.setLocationRelativeTo(null);
panel.setVisible(true);

希望这能有所帮助。

JFrame frame = new JFrame("Sample Frame");
frame.setSize(600, 600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
DefaultTableModel dfm = new DefaultTableModel(data, columnNames);
JTable table = new JTable(dfm);
JScrollPane scrollPane = new JScrollPane(table);
panel.add(scrollPane);
frame.add(panel);
frame.setVisible(true);

表模型取决于您的需求

this.setTitle("Sample");
JPanel p = new JPanel(new BorderLayout());
WindowEvent we = new WindowEvent(this, WindowEvent.WINDOW_CLOSED);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
System.exit(0);
}
});
// Create columns names
String columnNames[] = { "FirstCol", "SecondCol",
"ThirdCol", "FourthCol" };
dataModel = new DefaultTableModel();
for (int col = 0; col < columnNames.length; col++) {
dataModel.addColumn(columnNames[col]);
}
// Create a new table instance
table = new JTable(dataModel);
table.setPreferredScrollableViewportSize(new Dimension(200, 120));
table.setFillsViewportHeight(true);
table.setShowGrid(true);
table.setAutoscrolls(true);


// Add the table to a scrolling pane
scrollPane = new JScrollPane(table,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scrollPane.setPreferredSize(new Dimension(700, 700));
JPanel jpResultPanel = new JPanel();
jpResultPanel.setBorder(BorderFactory.createTitledBorder(
BorderFactory.createEtchedBorder(), "Result",
TitledBorder.CENTER, TitledBorder.TOP));
jpResultPanel.add(scrollPane);
add(jpResultPanel);
pack();
setSize(720, 720);
setVisible(true);

试试这个。

当一个组件有一个“null”布局时,你必须自己管理布局,这意味着你必须为组件的子组件计算尺寸和位置,以决定它们被绘制在哪里。除非绝对必要,否则会很乏味。

如果你真的想要那种细粒度的控制,也许可以先试试GridBagLayout,然后再去处理UI的排列。

首先,您应该认真考虑其他布局管理器,例如BorderLayoutManager (new JPanel(new BorderLayout()))是一个很好的开始。

同样,在设计对话框时,记住你可以而且应该嵌套布局:一个JPanel在另一个JPanel中(例如,一个GridLayout在一个BorderLayout中)。请注意:一个“好的”对话框应该调整正确,这样如果用户调整了你的Frame的大小,你想要自动扩展你的信息对象,比如你的表,而不是显示大面积的JPanel背景。这是NullLayout无法实现的。

但是在这个大世界的某个地方,可能有一些情况,NullLayout就是需要的东西。举个例子:

import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;


public class JTableInNullLayout
{
public static void main(String[] argv) throws Exception {


DefaultTableModel model = new DefaultTableModel(
new String[][] { { "a", "123"} , {"b", "456"} },
new String[] { "name", "value" } );


JTable t = new JTable(model);


JPanel panel = new JPanel(null);


JScrollPane scroll = new JScrollPane(t);
scroll.setBounds( 0, 20, 150, 100 ); // x, y, width, height
panel.add(scroll);


JFrame frame = new JFrame();
frame.add(panel);
frame.setPreferredSize( new Dimension(200,200));
frame.pack();
frame.setVisible(true);
}
}