如何减少列的宽度并在所需坐标处将JTable定位在Java中 [英] how to reduce width of column and position a JTable in java at desired coordinates
本文介绍了如何减少列的宽度并在所需坐标处将JTable定位在Java中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在使用JTable时遇到问题.需要您的帮助
i am having problem with JTable. need your help
- 我希望减小每列的大小(所有大小都应相同),以便可以将其完全保存为pdf,因为当前该列占据全帧,而不能完全保存为pdf.
下面是框架的快照和框架的pdf
below is snapshot of frame and pdf of the frame
- 我想像下面的图片一样将表格放置在中间(假设绿色边框是JFrame).目前它在框架的顶部.
这是我的代码
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();
}
}
推荐答案
所以这是一些测试代码,该代码使用JTable
的Printable
实现来打印表.通常用于将表格打印到打印机,但是您可以伪造该过程
So this is some test code, which makes use the JTable
's Printable
implementation to print the table. 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));
}
}
如果要减小页边距的大小,您可能需要使用iText一点点
You may need to play around with iText a bit if you want to decrease the size of the margins
这篇关于如何减少列的宽度并在所需坐标处将JTable定位在Java中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文