如何在JPanel中添加带有空布局的JTable?
我想将JTable
添加到布局为null
JPanel
。 JPanel
包含其他组件。 我必须在适当的位置添加JTable
。
嵌套/组合布局示例
Java教程有关于使用布局pipe理器的全面信息。 有关详细信息,请参阅“ 放置容器内的组件”课程。
本教程未能很好地覆盖的布局的一个方面是嵌套布局,将一个布局放入另一个布局以获得复杂的效果。
以下代码将各种组件放入框架中以演示如何使用嵌套布局。 显式设置的所有布局显示为使用它们的面板的标题边框。
代码的显着方面是:
- 有一个combobox在运行时改变PLAF(Pluggable Look and Feel)。
- GUI可以扩展到用户的需要。
- 拆分窗格底部的图像位于滚动窗格的中央。
- 左边的标签实例是使用buttondynamic添加的。
Nimbus 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
不要使用空布局。 学习使用LayoutManagers:
http://download.oracle.com/javase/tutorial/uiswing/layout/using.html
LayoutManagers允许您正确处理窗口大小调整或dynamic组件计数。 起初他们似乎很吓人,但他们值得努力学习。
我记得, null布局意味着一个绝对的位置,所以你很难为你的JTable左上angular的位置计算X点。 但是如果你只想要所有面板组件,你可以使用FlowLayout()pipe理器
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());
祝你好运
如果您使用空布局pipe理器,则始终需要设置组件的边界。 这是你的情况的问题。
你应该做每个人在这里build议去使用一些布局pipe理员相信他们节省时间。 去看看@ jzd的post中的教程。
享受,Boro。
应该将JTable添加到实际应该添加到JPanel中的JScrollPane中。
JPanel应该有一些布局pipe理器。
如果您不关心组件大小的精度,则可以使用纯的BorderLayout,并将其与FlowLayout和GridLayout结合使用。 如果你需要精确的话 – 使用jgoodies FormLayout。
FormLayout真的很棘手,但是你可以用WindowBuilder(embedded到Eclipse中)来玩一下,看看它生成的代码。 它可能看起来很复杂,但这只是一种无知。
祝你好运。
首先,您应该认真考虑其他布局pipe理器,例如BorderLayoutManager(新的JPanel(新的BorderLayout()))是一个好的开始。
另外,在devise对话框时,请记住,您可以并且应该嵌套您的布局 :一个JPanel在另一个JPanel内(例如BorderLayout内的GridLayout)。 请注意:“良好”对话框应该正确resize ,以便如果用户调整帧大小,则希望自动扩展信息对象(如表格),而不显示大面积的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); } }
你可以使用下面的代码。 将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);
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);
尝试这个。
当一个组件有一个“空”布局,你必须自己pipe理布局,这意味着你必须计算组件的孩子的尺寸和位置,以决定他们在哪里绘制。 相当乏味,除非是绝对必要的。
如果你真的想要这个细粒度的控制,也许可以先尝试GridBagLayout,然后再与UI布局混淆。