【问题标题】:How to Add Table header and Scrollbar in jtable. java如何在 jtable 中添加表头和滚动条。爪哇
【发布时间】:2015-03-23 13:29:46
【问题描述】:

我正在尝试在JTABLE 中添加表格标题滚动条,但我没有得到我想要的。我尝试了 3 种不同的程序,但没有找到正确的程序。此代码用于滚动条

谁能告诉我如何添加标题。我不能将它添加为model.addRow(),因为之后我必须从表中获取值,而这种方法会产生问题。以及如何添加滚动条码。

这是我的代码

DefaultTableModel model = new DefaultTableModel();      
JTable table = new JTable(model);
table.setFont(new Font("Times New Roman", Font.PLAIN, 13));
//JScrollPane scrollPane = new JScrollPane(table);   //Try one
//new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED ); // Try 2


model.addColumn("ID");
model.addColumn("NAME");
model.addColumn("MODEL");
model.addColumn("P_Price");
model.addColumn("S_Price");
model.addColumn("Quantity");

table.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);    
table.setBounds(10, 0, 457, 103);

//panel_1.add(new JScrollPane(table)); Try 3
//panel_1.add(scrollPane); //link to Try one
//table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); // link 2 Try 2

panel_1.add(table);

【问题讨论】:

    标签: java swing jtable scrollbar


    【解决方案1】:

    要添加标题

    String [] header={"name","age"};
    String [][] data={{"akash","20"},{"pankaj","24"},{"pankaj","24"},{"pankaj","24"},{"pankaj","24"}};
    DefaultTableModel model = new DefaultTableModel(data,header);  
    

    添加滚动条

    JScrollPane js=new JScrollPane(table);
    js.setVisible(true);
    add(js);
    

    完整代码

    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 Table extends JPanel{
    
        JTable jt;
        public Table(){
    
            String [] header={"name","age"};
            String [][] data={{"akash","20"},{"pankaj","24"},{"pankaj","24"},{"pankaj","24"},{"pankaj","24"}};
    
    
            DefaultTableModel model = new DefaultTableModel(data,header);
    
            JTable table = new JTable(model);
    
            table.setPreferredScrollableViewportSize(new Dimension(450,63));
            table.setFillsViewportHeight(true);
    
            JScrollPane js=new JScrollPane(table);
            js.setVisible(true);
            add(js);
    
        }
    
        public static void main(String [] a) {
    
            JFrame jf=new JFrame();
            Table tab= new Table();
            jf.setTitle("Table");
            jf.setSize(500, 500);
            jf.setVisible(true);
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jf.add(tab);
    
    
    
    
        }
    
    }
    

    输出

    【讨论】:

    • 它不起作用。只是表消失了。我必须在 Panal 中添加表格。所以我只是相应地编辑它 JScrollPane js=new JScrollPane(table); js.setVisible(true); //添加(js); panel_1.add(js);
    • 也添加它,它可以工作 js.setBounds(10, 0, 457, 103);
    • 我使用 js.setBounds() 并且效果很好。也许完整的代码会帮助你,所以我在上面发布了。
    【解决方案2】:

    我担心你可能会因为使用null 布局和setBounds(...) 而搞砸了自己,这些布局不适用于大多数Swing GUI,尤其是在JScrollPanes 中显示的JTables。

    建议:

    • 不要使用 null 布局,不要调用 setBounds(...) 尤其是在您想在滚动窗格内显示的内容上。
    • 通过 JScrollPane 的构造函数将 JTable 添加到 JScrollPane。
    • 将这样创建的 JScrollPane 添加到在 BorderLayout.CENTER 位置使用 BorderLayout 的 JPanel。

    例如:

    import java.awt.BorderLayout;
    import java.awt.Font;
    
    import javax.swing.*;
    import javax.swing.table.*;
    
    public class Foo {
       private JPanel panel_1 = new JPanel();
    
       public Foo() {
          DefaultTableModel model = new DefaultTableModel();
          JTable table = new JTable(model);
          table.setFont(new Font("Times New Roman", Font.PLAIN, 13));
          JScrollPane scrollPane = new JScrollPane(table); 
    
          model.addColumn("ID");
          model.addColumn("NAME");
          model.addColumn("MODEL");
          model.addColumn("P_Price");
          model.addColumn("S_Price");
          model.addColumn("Quantity");
    
          panel_1.setLayout(new BorderLayout());
          panel_1.add(scrollPane, BorderLayout.CENTER);
       }
    
       public JPanel getPanel1() {
          return panel_1;
       }
    
       private static void createAndShowGui() {
          Foo mainPanel = new Foo();
    
          JFrame frame = new JFrame("Foo");
          frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
          frame.getContentPane().add(mainPanel.getPanel1());
          frame.pack();
          frame.setLocationByPlatform(true);
          frame.setVisible(true);
       }
    
       public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                createAndShowGui();
             }
          });
       }
    }
    

    甚至不要在您的 JScrollPane 上使用 setBounds(...)。虽然空布局和setBounds() 在 Swing 新手看来是创建复杂 GUI 的最简单和最好的方法,但创建的 Swing GUI 越多,使用它们时遇到的困难就越严重。当 GUI 调整大小时,它们不会调整您的组件大小,它们是需要增强或维护的皇家女巫,放置在滚动窗格中时它们完全失败,在与原始平台不同的所有平台上查看时它们看起来很糟糕。

    【讨论】:

    • 我使用的面板只是整个代码的一小部分。无论如何,谢谢我解决了它并将其发布为自己的答案
    • @AdnanAli,好的,你解决了,但是听听上面的建议,如果你使用空布局(由.setBound() 表示),当你的程序在其他平台上运行时它不会向你保证关于组件位置的一致性,:P
    • 加一为dont use setBounds()解释
    【解决方案3】:

    标题

    JTable table = new JTable(model);
    String cols [] = {"ID","NAME","MODEL","P_Price","S_Price","Quantity"};
    model.setColumnIdentifiers(cols );
    

    滚动窗格

    JScrollPane jsp = new JScrollPane(table);
    panel1.add(jsp);
    
    //....
    add(jsp);// add scroll to frame not the panel
    

    注意:

    但请记住,null layout 并不是一个好的程序设计,尤其是在使用.setBounds( ) 设置非顶级容器时,因为它不能保证在其他平台上组件位置的一致性。

    【讨论】:

      【解决方案4】:

      这些东西的唯一原因是我没有在JScrollpane. 中添加setBounds(10, 0, 457, 103) 方法,谢谢大家的回答。感谢@singakash

      这是完整的工作代码。

          DefaultTableModel model = new DefaultTableModel();      
          JTable table = new JTable(model);
          table.setFont(new Font("Times New Roman", Font.PLAIN, 13));
          model.addColumn("ID");
          model.addColumn("NAME");
          model.addColumn("MODEL");
          model.addColumn("P_Price");
          model.addColumn("S_Price");
          model.addColumn("Quantity");
          table.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
      
      
          table.setBounds(10, 0, 457, 103);   
      
          JScrollPane jp=new JScrollPane(table);
          jp.setBounds(10, 0, 457, 103);
          jp.setVisible(true);
          add(jp);
          panel_1.add(jp);
      

      【讨论】:

      • 甚至不要在您的 JScrollPane 上使用 setBounds(...)。虽然空布局和setBounds() 对于 Swing 新手来说似乎是创建复杂 GUI 的最简单和最好的方法,但创建的 Swing GUI 越多,使用它们时遇到的困难就越严重。当 GUI 调整大小时,它们不会调整您的组件大小,它们是增强或维护的皇家女巫,放置在滚动窗格中时它们完全失败,在与原始平台不同的所有平台上查看时它们看起来很糟糕。另外,如果 singakash 回答了您的问题,请不要忘记接受他的回答。
      • 那么 setBounds() 的替代品是什么?这样我就可以动态调整大小?
      • 正是布局管理器的用途!您可以在此处找到 Swing 教程和其他 Swing 资源的链接:Swing Info。这包括指向布局管理器教程的链接。
      猜你喜欢
      • 1970-01-01
      • 2013-03-02
      • 2017-09-07
      • 2011-10-02
      • 1970-01-01
      • 2013-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多