简体   繁体   English

如何减少列的宽度并在所需坐标处将JTable定位在Java中

[英]how to reduce width of column and position a JTable in java at desired coordinates

i am having problem with JTable. 我在使用JTable时遇到问题。 need your help 需要你的帮助

  • i want to reduce size of every column (size should be same for all) so that it can be saved in pdf completely because currently it is occupying full frame and is not being saved fully in pdf. 我想减小每列的大小(所有大小均应相同),以便可以将其完全保存为pdf,因为当前它正占据全帧,而不是完全保存为pdf。

below is snapshot of frame and pdf of the frame 下面是框架的快照和框架的pdf 在此处输入图片说明 在此处输入图片说明

  • i want to place the table in center like in the below image(suppose green border is JFrame). 我想像下面的图片一样将表格放在中间(假设绿色边框是JFrame)。 currently it is at top of the frame. 当前它在框架的顶部。

在此处输入图片说明

here is my code 这是我的代码

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.sql.*;
import java.util.*;
import javax.swing.table.*;
import javax.swing.border.*;
import com.lowagie.text.Document;
import com.lowagie.text.PageSize;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfWriter;
import java.io.FileOutputStream;
import java.awt.Graphics2D;
import javax.swing.table.TableColumn;



class tt_show extends JFrame implements ItemListener,ActionListener
{

JLabel l1,l2;

Choice c1,c2,c3;

JButton b1;

Checkbox cb1,cb2;

CheckboxGroup cbg;

Container c=this.getContentPane();

Graphics g;



tt_show()
{

    setLayout(null);

    l1=new JLabel("Course");

    l2=new JLabel("Semester");

    b1=new JButton("OK");

    cbg=new CheckboxGroup();

    cb1 = new Checkbox("full",cbg,false);

    cb2 = new Checkbox("specific day",cbg,false);

    c1 = new Choice();

    c2 = new Choice();

    c3 = new Choice();

    c3.add("Monday"); c3.add("Tuesday"); c3.add("Wednesday");       c3.add("Thursday"); c3.add("Friday");

    c1.add("MCA");

    c.add(l1); c.add(l2); c.add(b1); c.add(l1); c.add(cb1); c.add(cb2);   c.add(c1); c.add(c2); //c.add(c3);

    l1.setBounds(500,160,100,100);
    c1.setBounds(700,200,100,100);

    l2.setBounds(500,260,100,100);
    c2.setBounds(700,300,100,100);

    cb1.setBounds(500,350,200,100);
    cb2.setBounds(700,350,200,100);

    b1.setBounds(600,500,100,30);

    b1.addActionListener(this);
    c1.addItemListener(this);




    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

public void itemStateChanged(ItemEvent ie)
{

    if(ie.getSource()==c1)
    {
        for(int i=0;i<5;i++)
        {
            c2.add(String.valueOf(i+1));
        }
    }
}

public void actionPerformed(ActionEvent ae)
{
    String str1="",str2="",str3="",str4="";

    str1=c1.getSelectedItem();

    str2=c2.getSelectedItem();

    str3=cbg.getSelectedCheckbox().getLabel();

    str4="select * from ";

    int count=0;

    Vector<Vector> data = new Vector<Vector>();

    Vector<String> row = new Vector<String>();

    Vector<String> cols = new Vector<String>();

    cols.add("Day  / Lecture  -->>");   cols.add("First");       cols.add("Second");  cols.add("Third");   cols.add("Fourth");  cols.add("Fifth");

    cols.add("Sixth");   cols.add("Seventh");  cols.add("Eighth");






    str4=str4+str1+str2;

    try
            {
                DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());


                Connection con =   DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","hr","hr");


                Statement stmt = con.createStatement();


                ResultSet rs = stmt.executeQuery(str4);


                while(rs.next())
                {
                        count++;

                        switch(count)
                        {
                            case 1 : row.add("Monday");
                                 //row=new Vector<String>();
                                 break;

                            case 2 : row.add("Tuesday");
                                // row=new Vector<String>();
                                 break;

                            case 3 : row.add("Wednesday");
                                 //row=new Vector<String>();
                                 break;

                            case 4 : row.add("Thursday");
                                // row=new Vector<String>();
                                 break;

                            case 5 : row.add("Friday");
                                 //row=new Vector<String>();
                                 break;
                        }


                        for(int i=1;i<=8;i++)
                        {
                            row.add(rs.getString(i));
                        }
                        data.add(row);
                        row=new Vector<String>();
                }



            }
            catch(Exception e)
            {
                //System.out.println(e.printStackTrace());
            }


            time_table ob1 =new time_table();

            ob1.setTitle("TIME TABLE ->> "+str1+"-"+str2);

            ob1.setExtendedState(JFrame.MAXIMIZED_BOTH);

            ob1.show(data,cols,str1,str2);

            ob1.setVisible(true);
















}

public static void main(String args[]) throws Exception
{

    tt_show obj = new tt_show();

    obj.setExtendedState(JFrame.MAXIMIZED_BOTH);

    obj.setTitle("TIME TABLE");

    obj.setVisible(true);
}

}


class time_table extends JFrame implements ActionListener
{

String course,sem;

JTable tab;





time_table()
{
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JButton b1 = new JButton("Save As PDF");

    Container c=getContentPane();

    c.add(b1);



    b1.setBounds(700,700,200,30);

    b1.addActionListener(this);



}

public void show(Vector<Vector> data1,Vector<String> cols1,String s1,String s2)
{


    course=s1;

    sem=s2+".pdf";

    tab = new JTable(data1,cols1);

    TableColumn column = null;

    for(int i=1;i<=8;i++)
    {
        column = tab.getColumnModel().getColumn(i);

             column.setPreferredWidth(5);
        }


    tab.setEnabled(false);

    tab.setBorder(BorderFactory.createLineBorder(Color.green,3));

    tab.setFont(new Font("Arial",Font.PLAIN,15));

    tab.setRowHeight(30);

    tab.setGridColor(Color.red);

    JTableHeader head = tab.getTableHeader();

    head.setFont(new Font("SansSerif", Font.ITALIC, 15));

    head.setForeground(Color.magenta);

    Container c = this.getContentPane();

    c.setLayout(new BorderLayout());



    c.add("North",head);



    c.add("Center",tab);





    DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();

    centerRenderer.setHorizontalAlignment( SwingConstants.CENTER );

    tab.setDefaultRenderer(String.class, centerRenderer);
}

 private void print() {
Document document = new Document(PageSize.A4.rotate());
try {


  PdfWriter writer = PdfWriter.getInstance(document, new    FileOutputStream(course+sem));

  document.open();
  PdfContentByte cb = writer.getDirectContent();

  cb.saveState();
  Graphics2D g2 = cb.createGraphicsShapes(1600, 500);

  Shape oldClip = g2.getClip();
  g2.clipRect(0, 0, 1600, 1000);

  tab.print(g2);
  g2.setClip(oldClip);

  g2.dispose();
  cb.restoreState();
} catch (Exception e) {
  System.err.println(e.getMessage());
}
document.close();
}

    public void actionPerformed(ActionEvent ae)

    {

        print();    
    }
}

i want to reduce size of every column (size should be same for all) 我想减少每列的大小(所有大小均应相同)

After creating the table and setting the model you do something like: 创建表并设置模型后,您可以执行以下操作:

JTable table = new JTable(...);
TableColumnModel tcm = table.getColumnModel();

for (int i = 0; i < tcm.getColumnCount(); i++) 
{
    tcm.getColumn(i).setPreferredWidth(...);
}

Another option might be to use the Table Column Adjuster . 另一种选择是使用“ 表列调整器” This class will set the size of the column based on the data in the column. 此类将根据列中的数据设置列的大小。 So it will ensure that all the data is visible. 因此,它将确保所有数据都是可见的。

So this is some test code, which makes use the JTable 's Printable implementation to print the table. 因此,这是一些测试代码,它使用JTablePrintable实现来打印表。 This is normally used to print the table to a printer, but you can fake the process 通常用于将表打印到打印机,但是您可以伪造该过程

印刷表

import com.itextpdf.text.Document;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfWriter;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.Printable;
import java.io.FileOutputStream;
import java.util.Arrays;
import java.util.Vector;
import javax.swing.BorderFactory;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.JTableHeader;

public class TestPDF {

    public static void main(String[] args) {

        Vector columnNames = new Vector();
        columnNames.add("Day  / Lecture  -->>");
        columnNames.add("First");
        columnNames.add("Second");
        columnNames.add("Third");
        columnNames.add("Fourth");
        columnNames.add("Fifth");

        columnNames.add("Sixth");
        columnNames.add("Seventh");
        columnNames.add("Eighth");

        Vector data = new Vector();
        data.add(makeRow(new String[]{"Monday", "LAB", "", "", "", "CS rashmi", "STOA", "STOA", ".NET"}));
        data.add(makeRow(new String[]{"Tuesday", ".NET", ".NET", "SC", "SC", "ADBMS", "ADBMS", "CS", "STOA"}));
        data.add(makeRow(new String[]{"Wednesday", "ADBMS", "ADBMS", "SC", "SC", ".NET", "CS", "CS", "STOA"}));
        data.add(makeRow(new String[]{"Thursday", "LAB .Net", "", "", "", "ADBMS P", ".NET", "CS", "STOA"}));
        data.add(makeRow(new String[]{"Friday", "LAV ADBMS", "", "", "", "LAB .NET", "", "", ""}));

        JTable tab = new JTable(data, columnNames);

//        for (int i = 1; i <= 8; i++) {
//            TableColumn column = tab.getColumnModel().getColumn(i);
//            column.setPreferredWidth(5);
//        }
//
//        tab.setEnabled(false);
//
        tab.setBorder(BorderFactory.createLineBorder(Color.green, 3));
        tab.setFont(new Font("Arial", Font.PLAIN, 15));
        tab.setRowHeight(30);
        tab.setGridColor(Color.red);

        JTableHeader head = tab.getTableHeader();
        head.setFont(new Font("SansSerif", Font.ITALIC, 15));
        head.setForeground(Color.magenta);

        DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
        centerRenderer.setHorizontalAlignment(SwingConstants.CENTER);
        tab.setDefaultRenderer(String.class, centerRenderer);

//        JFrame frame = new JFrame();
//        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
//        frame.add(new JScrollPane(tab));
//        frame.pack();
//        frame.setLocationRelativeTo(null);
//        frame.setVisible(true);
//        JOptionPane.showMessageDialog(null, new JScrollPane(tab));
        Document document = new Document(PageSize.A4.rotate());
        try {

            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("Test.pdf"));

            document.open();
            PdfContentByte cb = writer.getDirectContent();

            cb.saveState();
            Graphics2D g2 = cb.createGraphicsShapes(1600, 500);

            Shape oldClip = g2.getClip();
            g2.clipRect(0, 0, 1600, 1000);

            Rectangle pageSize = document.getPageSize();
            float width = pageSize.getWidth();
            float height = pageSize.getHeight();

            // Size the JTable to be the width of the page, but maintain
            // it's own overall height
            tab.setSize((int) width, tab.getPreferredSize().height);

            JTableHeader tableHeader = tab.getTableHeader();
            tableHeader.setSize((int) width, tableHeader.getPreferredSize().height);

            // Get the table's printable
            Printable printable = tab.getPrintable(JTable.PrintMode.FIT_WIDTH, null, null);

            // Create a Paper which meets the size of the available document...
            Paper paper = new Paper();
            paper.setSize(height, width);
            paper.setImageableArea(0, 0, height, width);
            // Create a PageFormat for the Paper
            PageFormat pageFormat = new PageFormat();
            pageFormat.setOrientation(PageFormat.LANDSCAPE);
            pageFormat.setPaper(paper);
            // Print each page of the table
            int pageIndex = 0;
            while (printable.print(g2, pageFormat, pageIndex) != Printable.NO_SUCH_PAGE) {
                System.out.println("Print " + pageIndex);
                printable.print(g2, pageFormat, pageIndex);
                pageIndex++;
            }
            g2.setClip(oldClip);

            g2.dispose();
            cb.restoreState();
        } catch (Exception e) {
            System.err.println(e.getMessage());
        }
        document.close();
    }

    protected static Vector makeRow(String[] values) {
        return new Vector(Arrays.asList(values));
    }

}

You may need to play around with iText a bit if you want to decrease the size of the margins 如果您想减小页边距的大小,则可能需要使用iText进行测试

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM