web-dev-qa-db-ja.com

jtableにテーブルヘッダーとスクロールバーを追加する方法。 java

JTABLEにテーブルheaderおよびScrollbarを追加しようとしていますが、必要なものが得られません。私は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);
8
Adnan Ali

ヘッダーを追加するには

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




    }

}

出力

enter image description here

11
singhakash

nullレイアウトとsetBounds(...)を使用すると、ほとんどのSwing GUI、特にJScrollPanesに表示されるJTableではうまく機能しないために混乱する可能性があります。

提案:

  • スクロールペイン内に表示したいものに対して、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(...)を使用しないでください。 nullレイアウトとsetBounds()は、Swingの初心者には、複雑なGUIを作成する最も簡単で最良の方法のように見えるかもしれませんが、Swing GUIを作成するほど、それらを使用するときに深刻な問題が発生します。 GUIのサイズが変更されてもコンポーネントのサイズは変更されません。拡張または維持するための王室の魔女であり、スクロールペインに配置すると完全に失敗し、元のプラットフォームとは異なるすべてのプラットフォームで表示するとひどく見えます。

ヘッダー:

_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
Fevly Pallar

唯一の理由は、_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);
_
3
Adnan Ali